作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经在 C 中使用二叉搜索树实现了 Tic Tac Toe。但是,不幸的是它没有运行。我遇到了像
这样的运行时错误.exe file stopped working.
另一方面,代码已成功编译。如果有人能指出其中的错误,将不胜感激。
这是代码:
#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();
}
如有任何帮助,我们将不胜感激。
最佳答案
由于访问冲突 - 访问未分配的内存地址,代码在第一次运行 insert
时中断。
问题在于,在 insert
中,您验证 *sr
不是 NULL
,并且在第一次运行时它确实不是 NULL
- 它等于在 main
中声明的 t
。
它尚未初始化,因此它的值无效 - 它是 0xcccccccc
,这可能不是有效的地址。
关于c - 使用二叉搜索树进行井字棋(C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46866709/
我有一个模板,可以获取从外部程序生成的所有信息。我试图让这个模板更现代一点,而不是 1992 年。 用于处理表格的页面。它看起来不太好,所以我试图移除 table ,让屏幕上的所有内容都流畅。 对于文
我使用 bootstrap 井来模拟卡片。我目前有两种不同类型的卡片,“普通”卡片位于屏幕中间,“特殊”卡片位于左侧和右侧。 我正在尝试复制的模板: 问题: 1.) bootstrap 中的井似乎不想
我有一个井 div,我想在 Angular 落附上一个小文本/图像,如此处所示 ( http://draw.to/D46BqsC )...并让该元素相对于井放置,以便它发生变化位置和井一样。什么是最好
我是一名优秀的程序员,十分优秀!