简体   繁体   English

井字游戏使用二叉搜索树(C)

[英]Tic Tac Toe using Binary Search Tree(C)

I have implemented Tic Tac Toe using binary search tree in C.But,unfortunately it is not running.I am encountering a run time error like the我已经在 C 中使用二叉搜索树实现了 Tic Tac Toe。但是,不幸的是它没有运行。我遇到了一个运行时错误,比如

.exe file stopped working . .exe 文件停止工作

On the other hand the code successfully compiled.另一方面,代码成功编译。 It would be very grateful if somebody could point out the mistake.如果有人能指出错误,将不胜感激。

Here is the 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();
}

Any help would be appreciated.任何帮助,将不胜感激。

The code breaks on the first run of insert because of access violation - accessing an unallocated memory address.由于访问冲突 - 访问未分配的内存地址,代码在第一次insert中断。
The problem is that in insert , you verify that *sr isn't NULL , and on the first run it's indeed not NULL - it's equal to t which is declared at main .问题是在insert ,您验证*sr不是NULL ,并且在第一次运行时它确实不是NULL - 它等于在main处声明的t
It's not initialized, so it's value isn't valid - it's 0xcccccccc , which is probably not a valid address.它没有初始化,所以它的值无效——它是0xcccccccc ,这可能不是一个有效的地址。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM