更正一个错误,在上面的代码中没有考虑到玩家赢棋的情况,其结果只能是计算机赢或合棋,下面的代码是我修改后的,试试吧,走5--1--7--3--6你就赢了!!!
#include <stdio.h>
typedef char chess[10];
typedef int temparr[10];
chess arr;
temparr brr;
int number,suc,c3,n2,c2,n1,c1;
char ch;
void inarrdata(chess a)
{
a[1]='1';a[2]='2';a[3]='3';
a[4]='4';a[5]='5';a[6]='6';
a[7]='7';a[8]='8';a[9]='9';
}
void display(chess a)
{
printf("\n");printf("\n");
printf(" %c | %c | %c\n",a[1],a[2],a[3]);
printf(" --------------\n");
printf(" %c | %c | %c\n",a[4],a[5],a[6]);
printf(" --------------\n");
printf(" %c | %c | %c\n",a[7],a[8],a[9]);
printf("\n");printf("\n");
}
int arrfull()
{
int i;
int arrf=0;
for(i=1;i<=9;i++)
if(i==arr[i]-48)
arrf=1;
return arrf;
}
void cn(int line)
{
switch(line)
{
case 0:c3=c3+1;break;
case 1:n2=n2+1;break;
case 2:c2=c2+1;break;
case 3:n1=n1+1;break;
case 4:c1=c1+1;break;
}
}
int linenum(char a,char b,char c)
{
int ln=5;
if((a=='X')&&(b=='X')&&(c=='X'))
ln=0;
if(((a=='O')&&(b=='O')&&(c!='O'))||((a=='O')&&(b!='O')&&(c=='O'))||((a!='O')&&(b=='O')&&(c=='O')))
ln=1;
if(((a=='X')&&(b=='X')&&(c!='X'))||((a=='X')&&(b!='X')&&(c=='X'))||((a!='X')&&(b=='X')&&(c=='X')))
ln=2;
if(((a=='O')&&(b!='O')&&(c!='O'))||((a!='O')&&(b=='O')&&(c!='O'))||((a!='O')&&(b!='O')&&(c=='O')))
ln=3;
if(((a=='X')&&(b!='X')&&(c!='x'))||((a!='X')&&(b=='X')&&(c!='X'))||((a!='X')&&(b!='X')&&(c=='X')))
ln=4;
return ln;
}
int maxbrr(int *br)
{
int temp,i,mb;
temp=-888;
for(i=1;i<=9;i++)
{
if(temp<=br[i])
{
temp=br[i];
mb=i;
}
}
return mb;
}
void manstep() //人走棋处理模块
{
int j;
display(arr);
if(arrfull()) //如果棋盘上还有下棋的位置,给人走一步棋
{
printf("您要走哪一步?请输入数字(1--9):");
scanf("%d",&j);
while((j<1)||(j>9)||(j!=arr[j]-48))
{
printf("对不起,您输入的数字不对,请重新输入(1--9):");
scanf("%d",&j);
}
arr[j]='O';
}
}
void computerstep() //计算机走棋处理模块
{
int i;
if(arrfull()) //如果棋盘上还有可下棋的位置,则计算机走棋
{
for(i=1;i<=9;i++) //对每一步可走的棋进行计算
{
if(i==arr[i]-48)
{
c3=0;n2=0;c2=0;n1=0;c1=0;
arr[i]='X';
number=linenum(arr[1],arr[2],arr[3]);cn(number);
number=linenum(arr[4],arr[5],arr[6]);cn(number);
number=linenum(arr[7],arr[8],arr[9]);cn(number);
number=linenum(arr[1],arr[4],arr[7]);cn(number);
number=linenum(arr[2],arr[5],arr[8]);cn(number);
number=linenum(arr[3],arr[6],arr[9]);cn(number);
number=linenum(arr[1],arr[5],arr[9]);cn(number);
number=linenum(arr[3],arr[5],arr[7]);cn(number);
brr[i]=(128*c3-63*n2+31*c2-15*n1+7*c1); //计算此步权值
arr[i]=i+48;
}
else
brr[i]=-999;
}
arr[maxbrr(brr)]='X'; //确定计算机走哪一步,权值最大的一步
c3=0;n2=0;c2=0;n1=0;c1=0;
number=linenum(arr[1],arr[2],arr[3]);cn(number);
number=linenum(arr[4],arr[5],arr[6]);cn(number);
number=linenum(arr[7],arr[8],arr[9]);cn(number);
number=linenum(arr[1],arr[4],arr[7]);cn(number);
number=linenum(arr[2],arr[5],arr[8]);cn(number);
number=linenum(arr[3],arr[6],arr[9]);cn(number);
number=linenum(arr[1],arr[5],arr[9]);cn(number);
number=linenum(arr[3],arr[5],arr[7]);cn(number);
if(c3!=0) //计算机已赢
{
display(arr);
printf("\n");
printf("计算机赢了!!!\n");
exit(0);
suc=0;
}
}
else
{
printf("\n 恭喜你赢了!\n");
exit(1);
suc=0;
}
}
main()
{
printf("游戏规则:\n棋盘格式如图,人和计算机在棋盘上交替走棋\n");
printf("约定计算机使用符号X,人使用符号O\n");
printf("谁先使一横行或一竖行或对角线上有三个自己的符号,就胜利了!");
inarrdata(arr); //棋盘坐标编号
display(arr); //显示初始棋盘
suc=1;
printf("请选择您是否先走?(y/n)");
scanf("%c",&ch);
if((ch=='y')||(ch=='Y')) //输入Y,表示人先走棋
{
while(suc)
{
manstep();
computerstep();
}
display(arr);
}
else //计算机先走棋
{
while(suc)
{
computerstep();
if(suc)
manstep();
}
}
printf("\n 和棋!\n");
}
----------------解决方案--------------------------------------------------------
其实到3的时候就已经赢了嘛 感觉这个棋要想赢或输都比较难啊
不比5子棋
----------------解决方案--------------------------------------------------------
编译没通过~~~
EXIT没定义~~~~
难道你的编译器有这个函数????
我的编译器好象有些函数没有的,像getch
----------------解决方案--------------------------------------------------------
二楼说的没错,这代码的确有需要改进的地方,话又说回来,哪有没有缺点的代码呀?容我慢慢改吗!
三楼的同志:
摆脱!不要败坏我的名声!这代码没错,你换个编译器吧,用C-Free 3.5很不错的!
----------------解决方案--------------------------------------------------------
不是吧,真的通不过编译的,~~~~~
你用的exit没定义,我第一次没仔细看,没通过编译就回复帖子了,现在看了一下,原来你使用的是系统函数,这个函数是在stdlib.h头文件里定义的.
难道你的编译器不需要头文件就能编译通过?
如果是这样的话,我就没话说了~~~~
至于你写的程序,研究了一下,算法思路还是很清晰的.
但是.....有点小错误好象和棋显示的是错误的,~~下面是我试运行和棋时的结果.
游戏规则:
棋盘格式如图,人和计算机在棋盘上交替走棋
约定计算机使用符号X,人使用符号O
谁先使一横行或一竖行或对角线上有三个自己的符号,就胜利了!
1 | 2 | 3
--------------
4 | 5 | 6
--------------
7 | 8 | 9
请选择您是否先走?(y/n)y
1 | 2 | 3
--------------
4 | 5 | 6
--------------
7 | 8 | 9
您要走哪一步?请输入数字(1--9):5
1 | 2 | 3
--------------
4 | O | 6
--------------
7 | 8 | X
您要走哪一步?请输入数字(1--9):3
1 | 2 | O
--------------
4 | O | 6
--------------
X | 8 | X
您要走哪一步?请输入数字(1--9):8
1 | X | O
--------------
4 | O | 6
--------------
X | O | X
您要走哪一步?请输入数字(1--9):4
1 | X | O
--------------
O | O | X
--------------
X | O | X
您要走哪一步?请输入数字(1--9):1
恭喜你赢了!
Terminated with return code 1
Press any key to continue ...
----------------解决方案--------------------------------------------------------
再给一点建议.
楼主写的程序,可以说想赢电脑这块似乎没可能的(我没仔细验证,代码也只是粗看看).
也就是说有一块函数完全白写了.
可以删掉,或者可以改变一下程序,使得更有可玩性.(比如,在人和电脑下的棋没有任何机会在下一步凑齐三个的话,电脑下哪步可以使用一个随机数来实现,可以用时间做种子)
感觉这样才会比较"智能"一点.
要不然的话,程序显得死板,说得难听一点,就是不考虑算法,直接把所有可能都穷举了也可以编出相同的效果,毕竟9个格子很容易就穷举完的.
----------------解决方案--------------------------------------------------------
嗯,有道理,看来这代码还是有不少问题,我再改改,哎,人生就是这样,有问题不要紧,重要的是知错就改!!编程更是如此了!!哪能一步到位呀
----------------解决方案--------------------------------------------------------
前两个版本都多多少少有些缺陷,经过本人仔细研究,终于克服重重困难,编写出了井字游戏终结版,经过大量实验,应该没什么问题了,大家试试吧!!!!!不知道这个游戏能不能评为精品呀???同时还推出了C++版
#include <stdio.h>
typedef char chess[10];
typedef int temparr[10];
chess arr;
temparr brr;
int number,suc,n3,c3,n2,c2,n1,c1;
char ch;
void inarrdata(chess a)
{
a[1]='1';a[2]='2';a[3]='3';
a[4]='4';a[5]='5';a[6]='6';
a[7]='7';a[8]='8';a[9]='9';
}
void display(chess a)
{
printf("\n");printf("\n");
printf(" %c | %c | %c\n",a[1],a[2],a[3]);
printf(" --------------\n");
printf(" %c | %c | %c\n",a[4],a[5],a[6]);
printf(" --------------\n");
printf(" %c | %c | %c\n",a[7],a[8],a[9]);
printf("\n");printf("\n");
}
int arrfull()
{
int i;
int arrf=0;
for(i=1;i<=9;i++)
if(i==arr[i]-48)
arrf=1;
return arrf;
}
void cn(int line)
{
switch(line)
{
case 0:c3=c3+1;break;
case 1:n2=n2+1;break;
case 2:c2=c2+1;break;
case 3:n1=n1+1;break;
case 4:c1=c1+1;break;
case 5:n3=n3+1;break;
}
}
int linenum(char a,char b,char c)
{
int ln=6;
if((a=='X')&&(b=='X')&&(c=='X'))
ln=0;
if(((a=='O')&&(b=='O')&&(c!='O'))||((a=='O')&&(b!='O')&&(c=='O'))||((a!='O')&&(b=='O')&&(c=='O')))
ln=1;
if(((a=='X')&&(b=='X')&&(c!='X'))||((a=='X')&&(b!='X')&&(c=='X'))||((a!='X')&&(b=='X')&&(c=='X')))
ln=2;
if(((a=='O')&&(b!='O')&&(c!='O'))||((a!='O')&&(b=='O')&&(c!='O'))||((a!='O')&&(b!='O')&&(c=='O')))
ln=3;
if(((a=='X')&&(b!='X')&&(c!='x'))||((a!='X')&&(b=='X')&&(c!='X'))||((a!='X')&&(b!='X')&&(c=='X')))
ln=4;
if((a=='O')&&(b=='O')&&(c=='O'))
ln=5;
return ln;
}
int maxbrr(int *br)
{
int temp,i,mb;
temp=-888;
for(i=1;i<=9;i++)
{
if(temp<=br[i])
{
temp=br[i];
mb=i;
}
}
return mb;
}
void manstep() //人走棋处理模块
{
int j;
display(arr);
if(arrfull()) //如果棋盘上还有下棋的位置,给人走一步棋
{
printf("您要走哪一步?请输入数字(1--9):");
scanf("%d",&j);
while((j<1)||(j>9)||(j!=arr[j]-48))
{
printf("对不起,您输入的数字不对,请重新输入(1--9):");
scanf("%d",&j);
}
arr[j]='O';
c3=0;n2=0;c2=0;n1=0;c1=0;
number=linenum(arr[1],arr[2],arr[3]);cn(number);
number=linenum(arr[4],arr[5],arr[6]);cn(number);
number=linenum(arr[7],arr[8],arr[9]);cn(number);
number=linenum(arr[1],arr[4],arr[7]);cn(number);
number=linenum(arr[2],arr[5],arr[8]);cn(number);
number=linenum(arr[3],arr[6],arr[9]);cn(number);
number=linenum(arr[1],arr[5],arr[9]);cn(number);
number=linenum(arr[3],arr[5],arr[7]);cn(number);
if(n3!=0) //你赢了
{
display(arr);
printf("\n");
printf("恭喜您赢了!!!\n");
exit(0);
suc=0;
}
}
}
void computerstep() //计算机走棋处理模块
{
int i;
if(arrfull()) //如果棋盘上还有可下棋的位置,则计算机走棋
{
for(i=1;i<=9;i++) //对每一步可走的棋进行计算
{
if(i==arr[i]-48)
{
c3=0;n2=0;c2=0;n1=0;c1=0;
arr[i]='X';
number=linenum(arr[1],arr[2],arr[3]);cn(number);
number=linenum(arr[4],arr[5],arr[6]);cn(number);
number=linenum(arr[7],arr[8],arr[9]);cn(number);
number=linenum(arr[1],arr[4],arr[7]);cn(number);
number=linenum(arr[2],arr[5],arr[8]);cn(number);
number=linenum(arr[3],arr[6],arr[9]);cn(number);
number=linenum(arr[1],arr[5],arr[9]);cn(number);
number=linenum(arr[3],arr[5],arr[7]);cn(number);
brr[i]=(128*c3-63*n2+31*c2-15*n1+7*c1); //计算此步权值
arr[i]=i+48;
}
else
brr[i]=-999;
}
arr[maxbrr(brr)]='X'; //确定计算机走哪一步,权值最大的一步
c3=0;n2=0;c2=0;n1=0;c1=0;
number=linenum(arr[1],arr[2],arr[3]);cn(number);
number=linenum(arr[4],arr[5],arr[6]);cn(number);
number=linenum(arr[7],arr[8],arr[9]);cn(number);
number=linenum(arr[1],arr[4],arr[7]);cn(number);
number=linenum(arr[2],arr[5],arr[8]);cn(number);
number=linenum(arr[3],arr[6],arr[9]);cn(number);
number=linenum(arr[1],arr[5],arr[9]);cn(number);
number=linenum(arr[3],arr[5],arr[7]);cn(number);
if(c3!=0) //计算机已赢
{
display(arr);
printf("\n");
printf("计算机赢了!!!\n");
exit(0);
suc=0;
}
}
else
suc=0;
}
main()
{
printf("游戏规则:\n棋盘格式如图,人和计算机在棋盘上交替走棋\n");
printf("约定计算机使用符号X,人使用符号O\n");
printf("谁先使一横行或一竖行或对角线上有三个自己的符号,就胜利了!");
inarrdata(arr); //棋盘坐标编号
display(arr); //显示初始棋盘
suc=1;
printf("请选择您是否先走?(y/n)");
scanf("%c",&ch);
if((ch=='y')||(ch=='Y')) //输入Y,表示人先走棋
{
while(suc)
{
manstep();
computerstep();
}
display(arr);
}
else //计算机先走棋
{
while(suc)
{
computerstep();
if(suc)
manstep();
}
}
printf("\n 和棋!\n");
}
----------------解决方案--------------------------------------------------------