2017-10-21 14 views
-2

Ich habe implementiert Tic Tac Toe in C.But binärer Suchbaum verwendet wird, leider nicht running.I ist ein Laufzeitfehler am Begegnung wie dieTic Tac Toe mit binärer Suchbaum (C)

.exe-Datei funktioniert nicht mehr.

Auf der anderen Seite wurde der Code erfolgreich kompiliert. Es wäre sehr dankbar, wenn jemand den Fehler aufzeigen könnte. Hier

ist der Code:

#include<stdio.h> 
#include<stdlib.h> 

int x,win=0,gcursor=1,count=0,j=10; 
char ch; 

struct node 
{ 
    struct node *left; 
    int cell; 
    char data; 
    struct node *right; 
}; 

void insert(struct node **sr, int num) 
{ 
    if(*sr==NULL) 
    { 
     *sr = (struct node*)calloc(1,sizeof(struct node)); 
     (*sr)->left = NULL; 
     (*sr)->cell = num; 
     (*sr)->data = ' '; 
     (*sr)->right = NULL; 
    } 

    else 
    { 
     if(num<(*sr)->cell) 
     insert(&((*sr)->left),num); 
     else 
     insert(&((*sr)->right),num); 
    } 
} 

void inorder(struct node *t,int pos) 
{ 
    if(t!=NULL) 
    { 
     inorder(t->left,pos); 
     if(t->cell==pos) 
     { 
     ch = t->data; 
     return; 
     } 
      inorder(t->right,pos); 
    } 
} 

void display(struct node *t,int cursor) 
{ 
    char arr[10],i; 
    system("cls"); 
    for(i=1;i<=9;i++) 
    { 
     inorder(t,i); 
     arr[i] = ch; 
    } 
    printf("\n\nTIC TAC TOE"); 
    if(cursor==1) 
    printf("\n-------------\n| %c.| %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]); 
    else if(cursor==2) 
    printf("\n-------------\n| %c | %c.| %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]); 
    else if(cursor==3) 
    printf("\n-------------\n| %c | %c | %c.|\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]); 
    else if(cursor==4) 
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c.| %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]); 
    else if(cursor==5) 
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c.| %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]); 
    else if(cursor==6) 
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c.|\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]); 
    else if(cursor==7) 
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c.| %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]); 
    else if(cursor==8) 
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c.| %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]); 
    else if(cursor==9) 
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c.|\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]); 
    else 
    printf("\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n| %c | %c | %c |\n-------------\n",arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9]); 
} 


void winner(struct node *t) 
{ 
    int arr[][3] = {{1,2,3},{4,5,6},{7,8,9},{1,5,9},{3,5,7},{1,4,7},{2,5,8},{3,6,9}}; 
    int i; 
    char x1,y1,z1; 
    win = 0; 
    for(i=0;i<=7;i++) 
    { 
     inorder(t,arr[i][0]); x1 = ch; 
     inorder(t,arr[i][1]); y1 = ch; 
     inorder(t,arr[i][2]); z1 = ch; 
     if(x1==y1 && y1==z1 && x1!=' ' && y1!=' ' && z1!=' ') 
     { win = 1;break;} 
    } 
} 

void check(struct node *t,int pos,char c,char c2) 
{ 

     if(t!=NULL) 
    { 
     check(t->left,pos,c,c2); 
     if(t->cell==pos && t->data==' ' && c==c2) 
     { 
     t->data = c; 
     count = 1; 
     return; 
     } 
     check(t->right,pos,c,c2); 
    } 
} 


void human_being(struct node *t, char human) 
{ 
    char c; 
    count = 0; 
    while(count<1) 
    { 
     if(gcursor==10) 
     gcursor = 1; 

     display(t,gcursor); 
     scanf("%c",&c); 

     if(c=='\n') 
     gcursor++; 

     else 
     check(t,gcursor,c,human); 
     j++; 
    } 
} 

void computer(struct node *t, char comp) 
{ 
    int random,k; 
    char c; 
    count = 0; 
    while(count<1) 
    { 
     k = rand()%j++; 
     if(k!=0) 
     { 
     random = rand()%k; 
     gcursor = random; 
     } 
     check(t,gcursor,comp,comp); 
    } 
} 


void main() 
{ 
    char human,comp; 
    struct node *t; 
    int i,arr[] = {5,3,4,2,1,7,6,8,9}; 
    for(i=0;i<9;i++) 
    insert(&t,arr[i]); 
    printf("\n\n------------------------------RULES-----------------------------\n1. Press ENTER to move the cursor '.' around the squares.\n2. Press X or O as per your choice and then again press enter.\n3. X or O should be in capital."); 
    printf("\n\n\n------------------------CONFIGURATION-------------------------\n1. Enter O and press enter if you want to start first.\n2. Enter X and press enter if you want computer to start first.\nEnter your choice :- "); 
    scanf("%c",&human); 
    if(human=='O') 
    comp = 'X'; 
    else if(human=='X') 
    comp = 'O'; 



       if(human=='O') 
       for(i=1;i<=9;i++) 
       { 
        if(i%2!=0) 
        { 
        human_being(t,human); 
        winner(t); 
        if(win==1) 
        {display(t,0); printf("\nGame Over....Winner Is Human Being."); break; } 
        } 
        else 
        { 
        computer(t,comp); 
        winner(t); 
        if(win==1) 
        { display(t,0); printf("\nGame Over....Winner Is Computer."); break; } 
        } 
       } 

       else if(human=='X') 
       for(i=1;i<=9;i++) 
       { 
        if(i%2==0) 
        { 
        human_being(t,human); 
        winner(t); 
        if(win==1) 
        { display(t,0); printf("\nGame Over....Winner Is Human Being."); break; } 
        } 
        else 
        { 
        computer(t,comp); 
        winner(t); 
        if(win==1) 
        { display(t,0); printf("\nGame Over....Winner Is Computer."); break; } 
        } 
       } 

       if(win==0) 
       {display(t,0); printf("\nGame Over....Match Draw."); 
    } 
getch(); 
} 

Jede Hilfe würde geschätzt.

+4

Schritt 1: Öffnen Sie Ihren Debugger und durchlaufen Sie ihn. Das ist ein Berg von Code, den wir durchschauen müssen, also müssen Sie den Teil mit dem eigentlichen Problem eingrenzen. – tadman

+0

An welchem ​​Punkt des Codes bricht es? Fügen Sie gegebenenfalls Druckaufträge ein, um zu versuchen, dies herauszufinden. – Neo

+0

Sobald ich es ausführen @Neo –

Antwort

2

Der Code bricht beim ersten Lauf von insert wegen Zugriffsverletzung - Zugriff auf eine nicht zugeordnete Speicheradresse.
Das Problem ist, dass in insert, Sie überprüfen, ob *sr nicht NULL ist, und auf dem ersten Lauf in der Tat ist es nicht NULL - es ist gleich t die bei main deklariert wird.
Es ist nicht initialisiert, daher ist der Wert nicht gültig - es ist 0xcccccccc, was wahrscheinlich keine gültige Adresse ist.

+0

Und bitte sehen Sie [Was passiert mit einer deklarierten, nicht initialisierten Variable in C? Hat es einen Wert?] (Https://stackoverflow.com/questions/1597405/what-happens-to-a-declared-uninitialized-variable-in-c-does-it-have-a-value) –