网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月29日漏签0天
c语言吧 关注:798,885贴子:4,357,940
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 14回复贴,共1页
<<返回c语言吧
>0< 加载中...

已经琢磨了半个月的井字棋电脑对战 问题颇多 求解

  • 取消只看楼主
  • 收藏

  • 回复
  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这是代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char a[3][3]={'1','2','3','4','5','6','7','8','9'}; //九宫格
int k,q,i,z;
char ch;
int s,m; //长和宽
unsigned winner=0;
void drawer() //玩家下子
{
printf("玩家 请输入你所下的位置");
scanf("%d",&k);
s=--k/3;
m=k%3;
for(;;)
{
if(a[s][m]=='o'||a[s][m]=='x')
{
printf("该位置已经被占用 请重新输入\n");
scanf("%d",&k);
s=--k/3;
m=k%3;
}
else
{
a[s][m]='x';
break;
}
}
}
void win() //胜利条件判定
{
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]||
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
winner=1;
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
winner=1;
}
}
}
int main() //开始位置
{
printf("\n"); //画图
printf(" %c | %c | %c \n",a[0][0],a[0][1],a[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[1][0],a[1][1],a[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[2][0],a[2][1],a[2][2]);
printf("---+---+---\n");
srand(unsigned(time(0)));
for(i=0;i<=9;i++)
{
drawer();
win();
if (i>=9)
{
printf("游戏结束 平局");
break;
}
if (winner==1)
{
printf("游戏结束 %s胜利",(i%2==0)?"玩家":"电脑");
break;
}
//判断电脑下子 (问题所在)
i+=1;
for(z=1;z<=9;z++)
{
s=--z/3;
m=z%3;
if(a[s][m]=='o'||a[s][m]=='x') //如果此处有子 跳过
continue;
a[s][m]='o';
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]|| //以下是胜利条件 即下在此处电脑赢
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
break;
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
break;
break;
}
}
a[s][m]='x'; //以下是防止玩家胜利的条件
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]||
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
{
a[s][m]='o';
break;
}
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
{
a[s][m]='o';
break;
break;
}
}
}
itoa(z,&ch,10); //前面的判断都不成立时 把a[s][m]变回来 但是这里好像有问题 ch一直都是0
a[s][m]=ch;
if (z=9)
{
for(;;)
{
q=rand()%8+1;
s=--q/3;
m=q%3;
if(a[s][m]!='o'&&a[s][m]!='x')
{
a[s][m]='o';
break;
}
}
}
}
//问题结束
win();
if (winner==1)
{
printf("游戏结束 %s胜利",(i%2==0)?"玩家":"电脑");
break;
}
system("cls"); //画图
printf("\n");
printf(" %c | %c | %c \n",a[0][0],a[0][1],a[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[1][0],a[1][1],a[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[2][0],a[2][1],a[2][2]);
printf("---+---+---\n");
}
return 0;
}


  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
现在问题就出现在注释段 之前做过人人对战 前后都是直接复制的 没有问题
一旦执行 除注释问题外 还有电脑乱下的问题 应该是后边的随机惹的祸


2025-07-29 08:33:15
广告
不感兴趣
开通SVIP免广告
  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
去掉判断 只留下随机 完美运行 缺点是井字棋玩法从如何赢变成了如何输 因为输起来很困难


  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
- - 检测中怀疑判断的那个循环没有完全执行 如果去掉itoa和continue 后果是在第一次下子时 无论如何 1号位置同时出现x子 这很令人费解 而加上后 就是1号位置出现‘0’ 这更令人费解


  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
起码来个人吧- -


  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好吧 感谢大神们的无视 今天为了这破玩意已经脑袋疼作业写不进去了 准备明天再研究一天


  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
发现了其中一个问题 使得一直出现随机状况 就是前句的if(k=9) 应该改为k==9 但是改完后第一个块出现乱码的情况依旧存在


  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
修改后问题更大了 已经出现输入便卡住的现象


2025-07-29 08:27:15
广告
不感兴趣
开通SVIP免广告
  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
通过不停的注释发现问题出现在以前没有出现问题的地方- -就在
s=--z/3;
m=z%3;
这两句话中 但是问题就在于这没有问题啊


  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
而奇怪的是这两句代码却没有问题
s=--q/3;
m=q%3;
难道是这么赋值会导致溢出?


  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char a[3][3]={'1','2','3','4','5','6','7','8','9'}; //九宫格
char b[3][3]={'1','2','3','4','5','6','7','8','9'}; //九宫格
int k,q,i,z;
char ch;
int s,m; //长和宽
unsigned winner=0;
void drawer() //玩家下子
{
printf("玩家 请输入你所下的位置");
scanf("%d",&k);
s=--k/3;
m=k%3;
for(;;)
{
if(a[s][m]=='o'||a[s][m]=='x')
{
printf("该位置已经被占用 请重新输入\n");
scanf("%d",&k);
s=--k/3;
m=k%3;
}
else
{
a[s][m]='x';
break;
}
}
}
void win() //胜利条件判定
{
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]||
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
winner=1;
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
winner=1;
}
}
}
int main() //开始位置
{
printf("\n"); //画图
printf(" %c | %c | %c \n",a[0][0],a[0][1],a[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[1][0],a[1][1],a[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[2][0],a[2][1],a[2][2]);
printf("---+---+---\n");
srand(unsigned(time(0)));
for(i=0;i<=9;i++)
{
drawer();
win();
if (i>=9)
{
printf("游戏结束 平局\n");
break;
}
if (winner==1)
{
printf("游戏结束 %s胜利\n",(i%2==0)?"玩家":"电脑");
break;
}
//判断电脑下子 (问题所在)
i+=1;
for(z=1;z<=9;z++)
{
//奇怪在这里 从这里开始直到除随机落子的语句全部注释 就是正常的随机下子 而把下面俩赋值语句取消注释 就会出现卡住现象
s=--z/3;
m=z%3;
if(a[s][m]=='o'||a[s][m]=='x') //如果此处有子 跳过
continue;
a[s][m]='o'; //判断胜利点
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]||
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
goto x;
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
goto x;
}
}
a[s][m]='x'; //防止玩家胜利点
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]||
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
{
a[s][m]='o';
goto x;
}
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
{
a[s][m]='o';
goto x;
}
}
}
a[s][m]=b[s][m];
//如果没有以上点 随机取点落子
if(z==9)
for(;;)
{
q=rand()%8+1;
s=--q/3;
m=q%3;
if(a[s][m]!='o'&&a[s][m]!='x')
{
a[s][m]='o';
goto x;
}
}
}
//问题结束
x:
win();
if (winner==1)
{
printf("游戏结束 %s胜利\n",(i%2==0)?"玩家":"电脑");
break;
}
system("cls"); //画图
printf("\n");
printf(" %c | %c | %c \n",a[0][0],a[0][1],a[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[1][0],a[1][1],a[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[2][0],a[2][1],a[2][2]);
printf("---+---+---\n");
printf("%c",ch);
}
system("pause");
return 0;
}
这是修改版 仍旧问题百出 通过注释的方法 其主要问题已经在前方注释


  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
谢谢大神~那么改成z-1就可以了么


  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
太感谢了 问题已经解决


  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最后把完整代码发出来 供大家使用吧- -
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char a[3][3]={'1','2','3','4','5','6','7','8','9'}; //九宫格
char b[3][3]={'1','2','3','4','5','6','7','8','9'}; //九宫格
int k,q,i,z;
char ch;
int s,m; //长和宽
unsigned winner=0;
void drawer() //玩家下子
{
printf("玩家 请输入你所下的位置");
scanf("%d",&k);
s=--k/3;
m=k%3;
for(;;)
{
if(a[s][m]=='o'||a[s][m]=='x')
{
printf("该位置已经被占用 请重新输入\n");
scanf("%d",&k);
s=--k/3;
m=k%3;
}
else
{
a[s][m]='x';
break;
}
}
}
void win() //胜利条件判定
{
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]||
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
winner=1;
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
winner=1;
}
}
}
int main() //开始位置
{
printf("\n"); //画图
printf(" %c | %c | %c \n",a[0][0],a[0][1],a[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[1][0],a[1][1],a[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[2][0],a[2][1],a[2][2]);
printf("---+---+---\n");
srand(unsigned(time(0)));
for(i=0;i<=9;i++)
{
drawer();
win();
if (i>=9)
{
printf("游戏结束 平局\n");
break;
}
if (winner==1)
{
printf("游戏结束 %s胜利\n",(i%2==0)?"玩家":"电脑");
break;
}
//判断电脑下子
i+=1;
for(z=1;z<=9;z++)
{
s=(z-1)/3;
m=(z-1)%3;
if(a[s][m]=='o'||a[s][m]=='x')//如果此处有子 跳过
continue;
a[s][m]='o'; //以下是胜利条件 即下在此处电脑赢
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]||
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
goto x;
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
goto x;
}
}
a[s][m]='x';//以下是防止玩家胜利的条件
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]||
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
{
a[s][m]='o';
goto x;
}
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
{
a[s][m]='o';
goto x;
}
}
}
a[s][m]=b[s][m]; //前面的判断都不成立时 把a[s][m]变回来
if(z==9) //如果没有以上点 随机取点落子
for(;;)
{
q=rand()%8+1;
s=--q/3;
m=q%3;
if(a[s][m]!='o'&&a[s][m]!='x')
{
a[s][m]='o';
goto x;
}
}
}
x:
win();
if (winner==1)
{
system("cls"); //画图
printf("\n");
printf(" %c | %c | %c \n",a[0][0],a[0][1],a[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[1][0],a[1][1],a[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[2][0],a[2][1],a[2][2]);
printf("---+---+---\n");
printf("%c",ch);
printf("游戏结束 %s胜利\n",(i%2==0)?"玩家":"电脑");
break;
}
system("cls"); //画图
printf("\n");
printf(" %c | %c | %c \n",a[0][0],a[0][1],a[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[1][0],a[1][1],a[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[2][0],a[2][1],a[2][2]);
printf("---+---+---\n");
printf("%c",ch);
}
system("pause");
return 0;
}
//话说还是需要一定的优化 还有一个下满了不提示平局的问题 不过那都是小问题了 就不解决了


2025-07-29 08:21:15
广告
不感兴趣
开通SVIP免广告
  • 当小鸟有了思想
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
电脑不会输版本 用于虐心 或者用于虐其他人
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char a[3][3]={'1','2','3','4','5','6','7','8','9'}; //九宫格
char b[3][3]={'1','2','3','4','5','6','7','8','9'}; //九宫格
int k,q,i,z;
char ch;
int s,m; //长和宽
unsigned winner=0;
void drawer() //玩家下子
{
printf("玩家 请输入你所下的位置");
scanf("%d",&k);
s=--k/3;
m=k%3;
for(;;)
{
if(a[s][m]=='o'||a[s][m]=='x')
{
printf("该位置已经被占用 请重新输入\n");
scanf("%d",&k);
s=--k/3;
m=k%3;
}
else
{
a[s][m]='x';
break;
}
}
}
void win() //胜利条件判定
{
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]||
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
winner=1;
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
winner=1;
}
}
}
int main() //开始位置
{
printf("\n"); //画图
printf(" %c | %c | %c \n",a[0][0],a[0][1],a[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[1][0],a[1][1],a[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[2][0],a[2][1],a[2][2]);
printf("---+---+---\n");
srand(unsigned(time(0)));
for(i=0;i<=9;i++)
{
drawer();
win();
if (i>=8)
{
printf("游戏结束 平局\n");
break;
}
if (winner==1)
{
printf("游戏结束 %s胜利\n",(i%2==0)?"玩家":"电脑");
break;
}
//判断电脑下子
i+=1;
for(z=1;z<=9;z++)
{
s=(z-1)/3;
m=(z-1)%3;
if(a[s][m]=='o'||a[s][m]=='x')//如果此处有子 跳过
continue;
a[s][m]='o'; //以下是胜利条件 即下在此处电脑赢
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]||
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
goto x;
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
goto x;
}
}
a[s][m]='x';//以下是防止玩家胜利的条件
if(a[0][0]==a[1][1]&&a[0][0]==a[2][2]||
a[0][2]==a[1][1]&&a[0][2]==a[2][0])
{
a[s][m]='o';
goto x;
}
else
{
for(int L=0;L<=2;L++)
{
if (a[L][0]==a[L][1]&&a[L][0]==a[L][2]||
a[0][L]==a[1][L]&&a[0][L]==a[2][L])
{
a[s][m]='o';
goto x;
}
}
}
a[s][m]=b[s][m]; //前面的判断都不成立时 把a[s][m]变回来
if(z==9) //如果没有以上点 随机取点落子
for(;;)
{
q=rand()%5+1;
q=q*2-1;
s=--q/3;
m=q%3;
if(a[s][m]!='o'&&a[s][m]!='x')
{
a[s][m]='o';
goto x;
}
}
}
x:
win();
if (winner==1)
{
system("cls"); //画图
printf("\n");
printf(" %c | %c | %c \n",a[0][0],a[0][1],a[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[1][0],a[1][1],a[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[2][0],a[2][1],a[2][2]);
printf("---+---+---\n");
printf("%c",ch);
printf("游戏结束 %s胜利\n",(i%2==0)?"玩家":"电脑");
break;
}
system("cls"); //画图
printf("\n");
printf(" %c | %c | %c \n",a[0][0],a[0][1],a[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[1][0],a[1][1],a[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",a[2][0],a[2][1],a[2][2]);
printf("---+---+---\n");
}
system("pause");
return 0;
}


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 14回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示