double linked list 2

Upload: ahmad-reza-musthafa

Post on 05-Apr-2018

236 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/31/2019 Double Linked List 2

    1/20

    Praktikum Pemrograman Bahasa C

    1

    PENDAHULUAN

    DOUBLE LINKED LIST II

    TUJUAN BELAJAR:

    Setelah melakukan praktikum dalam bab ini, mahasiswa diharapkan mampu:

    1. Memahami konsep doule linked list dan mengerti kegunaannya2. Mengimplementasikan struktur double linked list dalam pemrograman3. Mengidentifikasi permasalahan-permasalahan pemrograman yang harus diselesaikan dengan

    menggunakan double linked list dan menyelesaikannya.

    TUGAS PENDAHULUAN:

    1. Buatlah algoritma untuk menghapus simpul awal dari double linked list.

    2. Buatlah algoritma untuk menghapus simpul akhir dari double linked list.

    3. Buatlah algoritma untuk menghapus simpul tertentu dari double linked list.

    1. Hapus data awalOperasi ini berguna untuk menghapus data pada posisi pertama. Ada 3 keadaan yang mungkin terjadi

    ketika akan melakukan proses hapus yaitu :

    a. Kondisi linked list masih kosong

    Jika kondisi ini terjadi, maka proses penghapusan data tidak bisa dilakukan karena linked list masih kosong.

    b. Kondisi linked list hanya memiliki 1 data

    Langkah yang perlu dilakukan ketika ingin melakukan proses penghapusan linked list yang memiliki hanya 1

    data adalah dengan langsung menghapus data dari memori dan kemudian pointer awal dan akhir di-NULL-kan.

    Untuk lebih jelas perhatikan urutan penghapusannya di bawah ini :

    Kondisi data sebelum dihapus

    Proses penghapusan yaitu dengan menghilangkan data dari memori dengan perintah free(awal) ataufree(akhir).

    Kemudian pointer awal diisi dengan NULL

    c. Kondisi linked list memiliki data lebih dari 1 buah

    Untuk operasi penghapusan data di posisi pertama pada double linked list yang mempunyai data lebih dari 1

    buah adalah :

    Simpan pointer yang akan dihapus (awal) ke suatu pointer lain yang diberi nama pointer bantu.

    Pindahkan pointer awal ke data berikutnya (bantu->kanan atau awal->kanan).

  • 7/31/2019 Double Linked List 2

    2/20

    Praktikum Pemrograman Bahasa C

    2

    Field kiri dari awal yang baru (awal->kiri) di-NULL-kan.

    Langkah terakhir adalah hapus elemen yang ditunjuk pointer bantu.

    Setelah data dihapus, maka kondisi linked list adalah seperti di gambar di bawah ini.

    2. Hapus data terakhirOperasi ini berguna untuk menghapus data pada posisi terakhir. Ada 3 keadaan yang mungkin terjadi

    ketika akan melakukan proses hapus yaitu :

    a. Kondisi linked list masih kosong

    Jika kondisi ini terjadi, maka proses penghapusan data tidak bisa dilakukan karena linked list masih kosong.

    b. Kondisi linked list hanya memiliki 1 data

    Langkah yang perlu dilakukan ketika ingin melakukan proses penghapusan linked list yang memiliki hanya 1

    data adalah dengan langsung menghapus data dari memori dan kemudian pointer awal dan akhir di-NULL-kan.

    Untuk lebih jelas perhatikan urutan penghapusannya di bawah ini :

    Kondisi data sebelum dihapus

    Proses penghapusan yaitu dengan menghilangkan data dari memori dengan perintah free(awal) ataufree(akhir).

    Kemudian pointer awal diisi dengan NULL

    c. Kondisi linked list memiliki data lebih dari 1 buah

    Untuk operasi penghapusan data di posisi terakhir pada double linked list yang mempunyai data lebih dari 1

    buah adalah :

    Simpan pointer yang akan dihapus (akhir) ke suatu pointer lain yang diberi nama pointer bantu.

    Pindahkan pointer akhir ke data sebelumnya (bantu->kiri atau akhir->kiri).

  • 7/31/2019 Double Linked List 2

    3/20

    Praktikum Pemrograman Bahasa C

    3

    Field kanan dari akhir baru (akhir->kanan) di-NULL-kan.

    Langkah terakhir adalah hapus elemen yang ditunjuk pointer bantu.

    Setelah data dihapus, maka kondisi linked list adalah seperti di gambar di bawah ini.

    3. Hapus Data tertentu Pointer bantu diisi dengan data awal, pos diisi 1 (data pertama)

    Jika pos belum sama dengan posisi hapus, maka pindah ke data berikutnya dan pos ditambah 1.

    Karena pos masih lebih kecil dari posisi hapus, maka pindahkan pointer bantu ke posisi berikutnya danvariabel pos ditambah 1.

    Karena pos masih lebih kecil dari posisi hapus, maka pindahkan pos dan bantu ke posisi berikutnya danpos ditambah 1.

    Karena pos masih lebih kecil dari posisi hapus, maka pindahkan pos dan bantu ke posisi berikutnya danpos ditambah 1.

  • 7/31/2019 Double Linked List 2

    4/20

    Praktikum Pemrograman Bahasa C

    4

    Karena bantu mencapai nilai NULL, maka perulangan harus berhenti karena itu menunjukan posisihapus ada di luar linked list. Kalau ini terjadi, maka penghapusan tidak dapat dilakukan

    Setelah pointer posisi penghapusan telah ditemukan, maka langkah selanjutnya adalah pemeriksaanapakah posisi penghapusan (bantu) tersebut bernilai NULL (diluar jangkauan linked list). Jika posisi

    penghapusan (bantu) bernilai NULL maka proses penghapusan tidak bisa dilakukan. Tetapi jika bantu

    tidak bernilai NULL, maka lanjutkan ke langkah berikutnya.

    Periksa juga apakah pointer posisi penghapusan (bantu) sama dengan posisi akhir, jika benar makaproses penghapusan yang dilakukan adalah proses penghapusan akhir.

    Tetapi jika posisi penghapusan tidak sama dengan posisi akhir itu menunjukan posisi penghapusan adadi tengah, maka proses yang dilakukan adalah :

    o Untuk mempermudah penghapusan, maka simpan pointer yang menunjuk ke data sebelumposisi penghapusan (bantu2=bantu->kiri) dan data setelah posisi penghapusan (bantu3=bantu-

    >kanan).

    o Isi/sambungkan bantu2->kanan ke posisi pointer bantu3

    o Isi/sambungkan bantu3->kiri ke posisi pointer bantu2.

    o Hapus dari memori data yang ditunjuk oleh pointer bantu.

    o Setelah data di pointer bantu dihapus, maka kondisi linked list adalah

  • 7/31/2019 Double Linked List 2

    5/20

    Praktikum Pemrograman Bahasa C

    5

    DOUBLE LINKED LIST II

    5.1 Tujuan

    Setelah melakukan praktikum ini siswa diharapkan mengerti :

    1. Membuat operasi menghapus data tertentu pada double lnked list2. Membuat operasi menyisipkan data setelah data tertentu pada double linked list

    5.3 Soal-soal tugas Pemrograman

    1. Untuk latihan program no 1 dan no 2 buatlah bagan proses dari double linked list, untuk setiapmenghapus node tertentu pada suatu double linked list, menyisipkan data setelah node tertentu.

    Jangna lupa memasukkan juga perubahan nilai pointernya.

    2. Buatlah program permainan tic toe antara computer dan pemakai berbasis teks menggunakan doublelinked list. Dengan ketentuan :

    a. Pemakai dapat memilih menjadi O atau X, dan diberi kesempatan pertama untuk memulaipermainan

    b. Kemenangan permainan jika salah satu pemain (Komputer atau pemakai)dapat membentuktiga baris, kolom, atau diagonal dengan karakter dirinya. Atau jika salah satu atau keduanya

    menemui jalan buntu.

    c. Posisi kotak 1 s/d 9 dibuat dengan struktur data double linked list.1 2 3

    4 5 6

    7 8 9 1. Bagan

    Program 1nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    ujung

    nrp

    nama

    nilai

    prev

    next

    tampung awal

    nrp

    nama

    nilai

    prev

    next

    tanda

    Jika j=0, maka

    awal=(struct dtnilai*)malloc(sizeof(struct dtnilai));awal->next=NULL;

    awal->prev=NULL;

    tampung=awal

    nrp

    nama

    nilai

    prev

    next

    tampung awal

    nrp

    nama

    nilai

    prev

    next

    tampung

    nrp

    nama

    nilai

    prev

    next

    Jika j!=0, maka

    ujung=(struct dtnilai*)malloc(sizeof(struct dtnilai));

    ujung->next=NULL;

    ujung->prev=tampung;

    tampung->next=ujung;

    tampung=ujung;

    ujung

  • 7/31/2019 Double Linked List 2

    6/20

    Praktikum Pemrograman Bahasa C

    6

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    awalTampilan FIFO

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    Tampilan FIFOtampung

    tampung=tampung->next;

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    awal

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda

    Hapus

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda

    Hapus

    tanda=tanda->next;

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda

    Hapus

    Jika awal->nrp ada data yang akan dihapus, makatanda=awal->next;

    free(awal);

    awal=tanda;awal->prev=NULL;

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda

    Hapus

    awal

  • 7/31/2019 Double Linked List 2

    7/20

    Praktikum Pemrograman Bahasa C

    7

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tandaawal

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda

    Hapus

    awal ujung

    Jika pada ujung, makatanda=ujung->prev;free(ujung);ujung=tanda;ujung->next=NULL;

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tandaawal ujung

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda

    Hapus

    awal

    tanda->prev->next=tanda->next;

    tanda->next->prev=tanda->prev;

    tree(tanda);

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda

    Hapus

    awal

    1 2 3 4 5

    1 2 3 4 5

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda

    Hapus

    awal

  • 7/31/2019 Double Linked List 2

    8/20

    Praktikum Pemrograman Bahasa C

    8

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    awal

    1 2 4 5

    Program 2

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    ujung

    nrp

    nama

    nilai

    prev

    next

    tampung awal

    nrp

    nama

    nilai

    prev

    next

    tanda

    Jika j=0, maka

    awal=(struct dtnilai*)malloc(sizeof(struct dtnilai));awal->next=NULL;awal->prev=NULL;tampung=awal

    nrp

    nama

    nilai

    prev

    next

    tampung awal

    nrp

    nama

    nilai

    prev

    next

    tampung

    nrp

    nama

    nilai

    prev

    next

    Jika j!=0, makaujung=(struct dtnilai*)malloc(sizeof(struct dtnilai));ujung->next=NULL;

    ujung->prev=tampung;tampung->next=ujung;tampung=ujung;

    ujung

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    awalTampilan FIFO

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    Tampilan FIFOtampung

    tampung=tampung->next;

    tampung

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda

    Sisip

  • 7/31/2019 Double Linked List 2

    9/20

    Praktikum Pemrograman Bahasa C

    9

    nrp

    nama

    nilai

    prevnext

    nrp

    nama

    nilai

    prevnext

    nrp

    nama

    nilai

    prevnext

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prevnext

    tanda

    Sisip

    tanda=tanda->next;

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda

    nrp

    nama

    nilai

    prev

    next

    insert

    Insert->prev=tanda;Insert->next=tanda->next;

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda

    insert

    Jika tanda=ujung atau tanda->next=NULL, makaujung=insert;

    ujung

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    nrp

    nama

    nilai

    prev

    next

    tanda ujung

    nrp

    nama

    nilai

    prevnext

    insert

    2. Program

    #include

    #include

    #include

    #include

    #include

    #include

    //start global declaration==================================

    struct list

    { int no;

    char ox;

  • 7/31/2019 Double Linked List 2

    10/20

    Praktikum Pemrograman Bahasa C

    10

    struct list *next,*prev;

    }*first,*last,*temp,*temp2;

    char player,ai,win[6];

    int a,b,nomor,nomor2,done,save,move=0,ok,point,player_point[3],ai_point[3];

    void make();

    void write(int);

    void play();

    void point_move(int);

    void point_check(int,int);

    void player_move();

    void player_move2();

    void player_check();

    void ai_move();

    void ai_move2(int*,char*);

    void ai_move3();

    void ai_rand();void ai_rand2(int,int,int,int,int,int,int,int,int);

    void ai_check();

    void link(int,int,int,char*);

    void epic(int);

    //end of global declaration=================================

    void main()

    {

    char user;

    printf("\n\n\n\t\t\t TIC TAC TOE");

    printf("\n\t\t");

    printf("\n\n\tMasukkan nama anda : ");scanf("%s",&user);

    printf("\n\n\tAssalamu alaikum %s,",&user);

    printf("\n\tSelamat Datang di Permainan Tic Tac Toe!");

    printf("\n\t\t\n");

    getch();

    printf("\n\nKamu dapat memilih menjadi O atau X.\n");

    printf("di bawah ini nomor-nomor dari tiap kotak, ingat-ingat lho:\n");

    printf(" 9 | 8 | 7\n");

    printf("---+---+---\n");

    printf(" 6 | 5 | 4\n");

    printf("---+---+---\n");printf(" 3 | 2 | 1\n");

    printf("\n");

    getch();

    make();

    write(0);

    play();

    printf("%s win\n",win);

    getch();

    }

    void make()

    {for(a=9;a>=1;a--)

    {

  • 7/31/2019 Double Linked List 2

    11/20

    Praktikum Pemrograman Bahasa C

    11

    if(a==9)

    {

    last=(struct list*)malloc(sizeof(struct list));

    last->next=last->prev=NULL;

    temp=last;

    }

    else

    {

    first=(struct list*)malloc(sizeof(struct list));

    first->next=temp;

    first->prev=NULL;

    temp->prev=first;

    temp=first;

    }

    temp->no=a;

    temp->ox=NULL;}

    }

    void write(int x)

    {

    temp=last;

    while(temp!=NULL)

    {

    printf("\t(%d) [%c]\t",temp->no,temp->ox);

    if(temp->no==1||temp->no==4||temp->no==7)

    puts("");

    temp=temp->prev;}

    if(x==1)

    link(player_point[0],player_point[1],player_point[2],"player");

    else if(x==2)

    link(ai_point[0],ai_point[1],ai_point[2],"ai");

    else;

    puts("");

    }

    void play()

    {

    srand(time(NULL));

    a=b=1;printf("pick 'o' or 'x'\n");

    scanf("%c",&player);

    if(player=='o')

    {

    player='o';

    ai='x';

    }

    else if(player=='x')

    {

    player='x';

    ai='o';}

    else

  • 7/31/2019 Double Linked List 2

    12/20

    Praktikum Pemrograman Bahasa C

    12

    epic(0);

    while(a4)

    break;

    ai_move();

    }

    while(a!=5&&b!=5)

    {

    player_move2();

    if(a==5&&b==5)

    break;

    ai_move3();

    }

    }void point_move(int nomor)

    {

    temp=last;

    while(nomor!=temp->no)

    temp=temp->prev;

    }

    void point_check(int x,int y)

    {

    if(x==1&&y==2||x==1&&y==4||x==1&&y==5)

    ok=1;

    else if(x==2&&y==1||x==2&&y==3||x==2&&y==4||x==2&&y==5||x==2&&y==6)ok=1;

    else if(x==3&&y==2||x==3&&y==5||x==3&&y==6)

    ok=1;

    else if(x==4&&y==1||x==4&&y==2||x==4&&y==5||x==4&&y==7||x==4&&y==8)

    ok=1;

    else

    if(x==5&&y==1||x==5&&y==2||x==5&&y==3||x==5&&y==4||x==5&&y==6||x==5&&y==7||x==5&&y==8||x

    ==5&&y==9)

    ok=1;

    else if(x==6&&y==2||x==6&&y==3||x==6&&y==5||x==6&&y==8||x==6&&y==9)

    ok=1;

    else if(x==7&&y==4||x==7&&y==5||x==7&&y==8)ok=1;

    else if(x==8&&y==4||x==8&&y==5||x==8&&y==6||x==8&&y==7||x==8&&y==9)

    ok=1;

    else if(x==9&&y==5||x==9&&y==6||x==9&&y==8)

    ok=1;

    }

    void player_move()

    {

    puts("====================your turn====================");

    puts("pick number that empty already");

    scanf("%d",&nomor);if(nomor>9||nomor

  • 7/31/2019 Double Linked List 2

    13/20

    Praktikum Pemrograman Bahasa C

    13

    else

    player_check();

    }

    void player_move2()

    {

    ok=0;

    puts("pick point that be able to move");

    scanf("%d",&nomor);

    if(nomor==player_point[0])

    {

    point_move(nomor);

    point=0;

    }

    else if(nomor==player_point[1])

    {

    point_move(nomor);point=1;

    }

    else if(nomor==player_point[2])

    {

    point_move(nomor);

    point=3;

    }

    else

    epic(3);

    puts("move to where");

    scanf("%d",&nomor);point_check(temp->no,nomor);

    if(ok==1)

    {

    temp2=last;

    while(nomor!=temp2->no)

    temp2=temp2->prev;

    if(temp2->ox==NULL)

    {

    system("cls");

    temp->ox=NULL;

    temp2->ox=player;

    player_point[point]=temp2->no;write(1);

    }

    else

    epic(4);

    }

    else

    epic(5);

    }

    void player_check()

    {

    point_move(nomor);if(temp->ox==NULL)

    {

  • 7/31/2019 Double Linked List 2

    14/20

    Praktikum Pemrograman Bahasa C

    14

    system("cls");

    player_point[a-1]=temp->no;

    ++a;

    temp->ox=player;

    write(1);

    }

    else

    epic(2);

    }

    void ai_move()

    {

    puts("====================ai's turn====================");

    printf("\rplease wait .");

    _sleep(500);

    printf("\rplease wait ..");

    _sleep(500);printf("\rplease wait ...");

    _sleep(500);

    ai_move2(ai_point,"ai");

    if(move==1&&done==0)

    ai_move2(player_point,"player");

    done=0;

    }

    void ai_move2(int x[3],char y[6])

    {

    if((x[0]==3&&x[1]==2)||(x[0]==2&&x[1]==3)||(x[0]==4&&x[1]==7)||(x[0]==7&&x[1]==4)||(x[0]==

    5&&x[1]==9)||(x[0]==9&&x[1]==5))point_move(1);

    else if((x[0]==1&&x[1]==3)||(x[0]==3&&x[1]==1)||(x[0]==5&&x[1]==8)||(x[0]==8&&x[1]==5))

    point_move(2);

    else

    if((x[0]==2&&x[1]==1)||(x[0]==1&&x[1]==2)||(x[0]==5&&x[1]==7)||(x[0]==7&&x[1]==5)||(x[0]==6&&x[1]==9

    )||(x[0]==9&&x[1]==6))

    point_move(3);

    else if((x[0]==1&&x[1]==7)||(x[0]==7&&x[1]==1)||(x[0]==5&&x[1]==6)||(x[0]==6&&x[1]==5))

    point_move(4);

    else if((x[0]==9&&x[1]==3)||(x[0]==3&&x[1]==9)||(x[0]==5&&x[1]==4)||(x[0]==4&&x[1]==5))

    point_move(6);

    elseif((x[0]==4&&x[1]==1)||(x[0]==1&&x[1]==4)||(x[0]==5&&x[1]==3)||(x[0]==3&&x[1]==5)||(x[0]==8&&x[1]==9

    )||(x[0]==9&&x[1]==8))

    point_move(7);

    else if((x[0]==7&&x[1]==9)||(x[0]==9&&x[1]==7)||(x[0]==5&&x[1]==2)||(x[0]==2&&x[1]==5))

    point_move(8);

    else

    if((x[0]==5&&x[1]==1)||(x[0]==1&&x[1]==5)||(x[0]==6&&x[1]==3)||(x[0]==3&&x[1]==6)||(x[0]==8&&x[1]==7

    )||(x[0]==7&&x[1]==8))

    point_move(9);

    else

    {if(move==0&&strcmp(y,"ai")==0)

    {

  • 7/31/2019 Double Linked List 2

    15/20

    Praktikum Pemrograman Bahasa C

    15

    done=1;

    move=1;

    point_move(5);

    }

    else if(move==1&&strcmp(y,"ai")==0);

    else if(move==1&&strcmp(y,"player")==0)

    {

    if(x[0]==1)

    ai_rand2(1,2,4,5,0,0,0,0,0);

    else if(x[0]==2)

    ai_rand2(2,1,3,5,0,0,0,0,0);

    else if(x[0]==3)

    ai_rand2(3,1,2,5,0,0,0,0,0);

    else if(x[0]==4)

    ai_rand2(4,1,5,7,0,0,0,0,0);

    else if(x[0]==5)ai_rand2(5,1,2,3,4,6,7,8,9);

    else if(x[0]==6)

    ai_rand2(6,3,5,9,0,0,0,0,0);

    else if(x[0]==7)

    ai_rand2(7,4,5,8,0,0,0,0,0);

    else if(x[0]==8)

    ai_rand2(8,5,7,9,0,0,0,0,0);

    else if(x[0]==9)

    ai_rand2(9,5,6,8,0,0,0,0,0);

    }

    else if(move==2)

    {

    nomor=rand()%9+1;

    point_move(nomor);

    }

    }

    if(move==1&&strcmp(y,"ai")==0&&done==0);

    else

    {

    if(temp->ox==NULL)

    {

    if(move==1&&strcmp(y,"player")==0)move=2;

    system("cls");

    ai_point[b-1]=temp->no;

    ++b;

    temp->ox=ai;

    write(2);

    }

    else

    {

    if(move==1&&strcmp(y,"player")==0)

    move=2;ai_rand();

    }

  • 7/31/2019 Double Linked List 2

    16/20

    Praktikum Pemrograman Bahasa C

    16

    }

    }

    void ai_move3()

    {

    puts("====================ai's turn====================");

    back:

    printf("\rplease wait .");

    _sleep(500);

    printf("\rplease wait ..");

    _sleep(500);

    printf("\rplease wait ...");

    _sleep(500);

    ok=0;

    nomor=rand()%3;

    if(nomor==0){

    point_move(ai_point[0]);

    point=0;

    }

    else if(nomor==1)

    {

    point_move(ai_point[1]);

    point=1;

    }

    else if(nomor==2)

    { point_move(ai_point[2]);

    point=2;

    }

    nomor=rand()%9+1;

    temp2=last;

    while(nomor!=temp2->no)

    temp2=temp2->prev;

    printf("%d %d\n",temp->no,temp2->no);

    while(temp2->no==temp->no)

    {

    nomor=rand()%9+1;

    temp2=last;while(nomor!=temp2->no)

    temp2=temp2->prev;

    printf("%d %d\n",temp->no,temp2->no);

    }

    if(temp2->ox!=NULL)

    goto back;

    point_check(temp->no,temp2->no);

    if(ok==1)

    {

    // system("cls");

    temp->ox=NULL;temp2->ox=ai;

    ai_point[point]=temp2->no;

  • 7/31/2019 Double Linked List 2

    17/20

    Praktikum Pemrograman Bahasa C

    17

    write(2);

    }

    else

    goto back;

    }

    void ai_rand()

    {

    nomor=rand()%9+1;

    ai_check();

    }

    void ai_rand2(int x,int y1,int y2,int y3,int y4,int y5,int y6,int y7,int y8)

    {

    if(x==1||x==2||x==3||x==4||x==6||x==7||x==8||x==9)

    {

    nomor=rand()%3;

    if(nomor==0)point_move(y1);

    else if(nomor==1)

    point_move(y2);

    else if(nomor==2)

    point_move(y3);

    }

    else if(x==5)

    {

    nomor=rand()%8;

    if(nomor==0)

    point_move(y1);else if(nomor==1)

    point_move(y2);

    else if(nomor==2)

    point_move(y3);

    else if(nomor==3)

    point_move(y4);

    else if(nomor==4)

    point_move(y5);

    else if(nomor==5)

    point_move(y6);

    else if(nomor==6)

    point_move(y7);else if(nomor==7)

    point_move(y8);

    }

    }

    void ai_check()

    {

    point_move(nomor);

    if(temp->ox==NULL)

    {

    system("cls");

    ai_point[b-1]=temp->no;++b;

    temp->ox=ai;

  • 7/31/2019 Double Linked List 2

    18/20

    Praktikum Pemrograman Bahasa C

    18

    write(2);

    }

    else

    ai_rand();

    }

    void link(int x,int y,int z,char player[6])

    {

    if((x==1&&y==2&&z==3)||(x==1&&y==3&&z==2)||(x==1&&y==4&&z==7)||(x==1&&y==7&&z==

    4)||(x==1&&y==5&&z==9)||(x==1&&y==9&&z==5))

    a=b=5;

    else

    if((x==2&&y==1&&z==3)||(x==2&&y==3&&z==1)||(x==2&&y==5&&z==8)||(x==2&&y==8&&z==5))

    a=b=5;

    else

    if((x==3&&y==2&&z==1)||(x==3&&y==1&&z==2)||(x==3&&y==5&&z==7)||(x==3&&y==7&&z==5)||(x==3&&

    y==6&&z==9)||(x==3&&y==9&&z==6))a=b=5;

    else

    if((x==4&&y==1&&z==7)||(x==4&&y==5&&z==6)||(x==4&&y==6&&z==5)||(x==4&&y==7&&z==1))

    a=b=5;

    else

    if((x==5&&y==1&&z==9)||(x==5&&y==2&&z==8)||(x==5&&y==3&&z==7)||(x==5&&y==4&&z==6)||(x==5&&

    y==6&&z==4)||(x==5&&y==7&&z==3)||(x==5&&y==8&&z==2)||(x==5&&y==9&&z==1))

    a=b=5;

    else

    if((x==6&&y==3&&z==9)||(x==6&&y==5&&z==4)||(x==6&&y==4&&z==5)||(x==6&&y==9&&z==3))

    a=b=5;else

    if((x==7&&y==4&&z==1)||(x==3&&y==1&&z==4)||(x==7&&y==5&&z==3)||(x==7&&y==3&&z==5)||(x==7&&

    y==8&&z==9)||(x==7&&y==9&&z==8))

    a=b=5;

    else

    if((x==8&&y==5&&z==2)||(x==8&&y==2&&z==5)||(x==8&&y==7&&z==9)||(x==8&&y==9&&z==7))

    a=b=5;

    else

    if((x==9&&y==5&&z==1)||(x==9&&y==1&&z==5)||(x==9&&y==6&&z==3)||(x==9&&y==3&&z==6)||(x==9&&

    y==8&&z==7)||(x==9&&y==7&&z==8))

    a=b=5;

    if(a==5&&b==5){

    if(strcmp(player,"player")==0)

    strcpy(win,player);

    else if(strcmp(player,"ai")==0)

    strcpy(win,"ai");

    }

    }

    void epic(int error)

    {

    if(error==0)

    {puts("epic(0) = option only 'o' or 'x'");

    play();

  • 7/31/2019 Double Linked List 2

    19/20

    Praktikum Pemrograman Bahasa C

    19

    }

    else if(error==1)

    {

    puts("epic(1) = number only between 1 until 9");

    player_move();

    }

    else if(error==2)

    {

    puts("epic(2) = square isn't empty");

    player_move();

    }

    else if(error==3)

    {

    puts("epic(3) = point can't be move");

    player_move2();

    }else if(error==4)

    {

    puts("epic(4) = square isn't empty");

    player_move2();

    }

    else if(error==5)

    {

    puts("epic(5) = distance is out of range");

    player_move2();

    }

    }

    Preview :

  • 7/31/2019 Double Linked List 2

    20/20

    Praktikum Pemrograman Bahasa C

    20