do
{
printf("Player %d,please enter where you want to put your %c:",player,(player==1)?'x':'o')
scanf("%d",&choice)
row=--choice/3
column=--choice%3 // 第一处错误
}while(i<1||i>9||board[row][column]>'9') // 第二处错误
第一处错误是:column=--choice%3
原因:--运算符没搞清楚。--运算符意思是先减一,再做别的运算。那么,这句话就相当于 choice -= 1coloumn = choice%3这样就看出来, choice -= 1这半句话是多余的,只要出现在 row=--choice/3这里就足够了。
因为这里多运算了一次choice-1,所以输入1的时候行运算正确而列运算少了1,要么触碰边界,要么遇到了其他格子。
由于--运算符很容易出错,所以一般谨慎的程序员很少用,转而用复杂的语句代替,至少意思比较明白。
第二处错误是: i<1||i>9
原因:i 这里应该是棋手的落子顺序。第一手是0,判断为棋手1。但是用在这个语句里明显出错。这个语句应当是判断棋手落子的位置,即是不是下在棋盘外面,所以应当是choice<1 || choice>9,然而结合第一处错误,仍然是错的,因为choice已经在计算row 和column的时候被改变了。
因为这处错误,第一手棋永远无法走完,因为i初始值为0,满足i<1这个条件,进而出现死循环
结合两处错误,建议这样改:
do
{
printf("Player %d,please enter where you want to put your %c:",player,(player==1)?'x':'o')
scanf("%d",&choice)
row=(choice-1)/3 // 修改
column=(choice-1)%3 // 修改
}while(choice<1||choice>9||board[row][column]>'9') // 修改
http://www.pudn.com/downloads112/sourcecode/game/49636984jzGame.rar还有这个
井字游戏:为双人对弈游戏,双方轮流放子,单任一行,列,斜线为三个相同的 子时即为胜利!
http://download.pudn.com/downloads63/sourcecode/game/57578890xtkdige.rar
还有
http://download.pudn.com/downloads76/sourcecode/game/55593407402922602.rar
还有这个
一个用c语言写的“井字游戏”,经过turbo c编译通过。
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<bios.h>
#include<alloc.h>
#include<stdlib.h>
#define x1 150
#define x2 250
#define x3 350
#define x4 450
#define y1 100
#define y2 200
#define y3 300
#define y4 400
/* 1表示O, 2表示X */
void *buf_yuan,*buf_cha,*buf
FILE *fp
int a[4][4]
int flag=0
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void main(void)
{
int gd=DETECT,gm
int END=0
int i,j,h,kai=0,restart,key
int heng=2,lie=2
int temp=1
void SystemInitial(void)/*初始化游戏界面*/
void SiJiao(int heng,int lie)/*显示将要走步的位格的边框*/
void hua(int heng,int lie,int type)/*走步,即画圆或画叉*/
void display(int type)/*显示谁赢了*/
void hz(int x,int y,int a,int COL,int b,char *s)/*显汉字,只可以显示中文*/
void computer(void)/*单人游戏时,电脑走步*/
void hanzi(int x,int y,char *p,int colour)/*也是显汉字,可以中文与英语混合显示*/
initgraph(&amtgd,&amtgm,"")
if ((fp=fopen("hzk16","rb"))==NULL)
{
printf("Can't open hzk16,Please add it")
getch()
closegraph()
exit(0)
}
cleardevice()
hz(220,100,40,2,YELLOW,"井字游戏")
setcolor(BLUE)
hanzi(400,460,"作者:04计科3班 邓永华 08号",BLUE)
setcolor(WHITE)
setfillstyle(SOLID_FILL,WHITE)
flag=0
if(flag==0)/*单人游戏*/
{
circle(195,242,4)
floodfill(195,242,WHITE)
}
else/*双人游戏*/
{
circle(195,262,4)
floodfill(195,262,WHITE)
}
outtextxy(200,220,"Please select:")
setcolor(RED)
outtextxy(205,240,"Play with computer")
outtextxy(205,260,"Two people play")
hanzi(30,350,"游戏说明:双方轮流走步,先连成三个符号一直线(横、竖、斜)就Win",GREEN)
while(temp)
{
switch(bioskey(0))
{
case 0x1c0d:/*回车*/
{
temp=0
break
}
case 0x11b:/*Esc*/
exit(0)
case 0x4800:/*上*/
if(flag==0)
break
else
{
flag=0
setcolor(BLACK)
setfillstyle(SOLID_FILL,BLACK)
circle(195,262,4)
floodfill(195,262,BLACK)
setcolor(WHITE)
setfillstyle(SOLID_FILL,WHITE)
circle(195,242,4)
floodfill(195,242,WHITE)
}
break
case 0x5000:/*下*/
if(flag==1)
break
else
{
flag=1
/*清除*/
setcolor(BLACK)
setfillstyle(SOLID_FILL,BLACK)
circle(195,242,4)
floodfill(195,242,BLACK)
setcolor(WHITE)
setfillstyle(SOLID_FILL,WHITE)
circle(195,262,4)
floodfill(195,262,WHITE)
break
}
}
}
cleardevice()
/*begin to play*/
SystemInitial()
while(END!=1)
{
restart=0
switch(bioskey(0))/*按键*/
{
case 0x11b:/*Esc退出*/
END=1
break
case 0x3920:/*space*/
if(kai==1)
break
if(a[heng][lie]) break
kai=1
hua(heng,lie,1)
a[heng][lie]=1
if((a[1][1]==1&amt&amta[1][2]==1&amt&amta[1][3]==1)/*判断是否赢了*/
||(a[2][1]==1&amt&amta[2][2]==1&amt&amta[2][3]==1)
||(a[3][1]==1&amt&amta[3][2]==1&amt&amta[3][3]==1)
||(a[1][1]==1&amt&amta[2][1]==1&amt&amta[3][1]==1)
||(a[1][2]==1&amt&amta[2][2]==1&amt&amta[3][2]==1)
||(a[1][3]==1&amt&amta[2][3]==1&amt&amta[3][3]==1)
||(a[1][1]==1&amt&amta[2][2]==1&amt&amta[3][3]==1)
||(a[1][3]==1&amt&amta[2][2]==1&amt&amta[3][1]==1))
{
display(1)
END=1
}
if(!END)
{
h=0
for(i=1i<4i++)
for(j=1j<4j++)
if(a[i][j])
h++
if(h==9)
{
display(3)
END=1
}
}
if(END==1)
{
outtextxy(260,450,"play again? Y/N ")
while(1)
{
key=bioskey(0)
if(key==0x1579||key==0x1559)/*y的大小写*/
{
END=0
restart=1
break
}
else if((key==0x316e)||(key==0x314e))/*n的大小写*/
break
else continue
}
}
break
case 0x5230:/*0*/
if(kai==2) break
if(a[heng][lie]) break
kai=2
hua(heng,lie,2)
a[heng][lie]=20
if((a[1][1]==20&amt&amta[1][2]==20&amt&amta[1][3]==20)/*判断是否赢了*/
||(a[2][1]==20&amt&amta[2][2]==20&amt&amta[2][3]==20)
||(a[3][1]==20&amt&amta[3][2]==20&amt&amta[3][3]==20)
||(a[1][1]==20&amt&amta[2][1]==20&amt&amta[3][1]==20)
||(a[1][2]==20&amt&amta[2][2]==20&amt&amta[3][2]==20)
||(a[1][3]==20&amt&amta[2][3]==20&amt&amta[3][3]==20)
||(a[1][1]==20&amt&amta[2][2]==20&amt&amta[3][3]==20)
||(a[1][3]==20&amt&amta[2][2]==20&amt&amta[3][1]==20))
{
display(2)
END=1
}
if(!END)
{ h=0
for(i=1i<4i++)
for(j=1j<4j++)
if(a[i][j])
h++
if(h==9)
{
display(3)
END=1
}
}
if(END==1)
{
outtextxy(260,450,"play again? Y/N ")
while(1)
{
key=bioskey(0)
if(key==0x1579||key==0x1559)
{
END=0
restart=1
break
}
if(key==0x316e||key==0x314e)
break
else continue
}
}
break
case 0x4800:
case 0x1177:
heng--
if(heng<1)
heng=1
SiJiao(heng,lie)
break
case 0x5000:
case 0x1f73:
heng++
if(heng>3)
heng=3
SiJiao(heng,lie)
break
case 0x4b00:
case 0x1e61:
lie--
if(lie<1)
lie=1
SiJiao(heng,lie)
break
case 0x4d00:
case 0x2064:
lie++
if(lie>3)
lie=3
SiJiao(heng,lie)
break
}
if(flag==0&amt&amtkai==1&amt&amtEND!=1&amt&amtrestart!=1)
{
computer()
kai=2
if((a[1][1]==20&amt&amta[1][2]==20&amt&amta[1][3]==20)/*判断是否赢了*/
||(a[2][1]==20&amt&amta[2][2]==20&amt&amta[2][3]==20)
||(a[3][1]==20&amt&amta[3][2]==20&amt&amta[3][3]==20)
||(a[1][1]==20&amt&amta[2][1]==20&amt&amta[3][1]==20)
||(a[1][2]==20&amt&amta[2][2]==20&amt&amta[3][2]==20)
||(a[1][3]==20&amt&amta[2][3]==20&amt&amta[3][3]==20)
||(a[1][1]==20&amt&amta[2][2]==20&amt&amta[3][3]==20)
||(a[1][3]==20&amt&amta[2][2]==20&amt&amta[3][1]==20))
{
display(2)
END=1
}
if(!END)
{ h=0
for(i=1i<4i++)
for(j=1j<4j++)
if(a[i][j])
h++
if(h==9)
{
display(3)
END=1
}
}
if(END==1)
{
outtextxy(260,450,"play again? Y/N ")
while(1)
{
key=bioskey(0)
if(key==0x1579||key==0x1559)
{
END=0
restart=1
break
}
if(key==0x316e||key==0x314e)
break
else continue
}
}
}
if(restart==1)
{
cleardevice()
SystemInitial()
kai=0
heng=2
lie=2
}
}
free(buf_yuan)
free(buf_cha)
free(buf)
fclose(fp)
closegraph()
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void SystemInitial(void)
{
void hz(int x,int y,int a,int COL,int b,char *s)
void SiJiao(int heng,int lie)
int size,i,j
for(i=1i<4i++)
for(j=1j<4j++)
a[i][j]=0
SiJiao(2,2)
hz(240,30,40,2,YELLOW,"井字游戏")
setcolor(GREEN)
outtextxy(10,200,"1P")
setcolor(WHITE)
outtextxy(10,220,"up: w")
outtextxy(10,240,"down: s")
outtextxy(10,260,"left: a")
outtextxy(10,280,"right: d")
outtextxy(10,300,"fill: space")
outtextxy(10,320,"exit: Esc")
if(flag==1)
{
setcolor(GREEN)
outtextxy(520,200,"2P")
setcolor(WHITE)
outtextxy(520,220,"up:")
outtextxy(520,240,"down:")
outtextxy(520,260,"left: ")
outtextxy(520,280,"right: ")
outtextxy(520,300,"fill: 0")
outtextxy(520,320,"exit: Esc")
hz(585,220,25,1,WHITE,"↑")
hz(585,240,25,1,WHITE,"↓")
hz(585,260,25,1,WHITE,"←")
hz(585,280,25,1,WHITE,"→")
}
line(x1,y1,x1,y4)
line(x1,y1,x4,y1)
line(x4,y1,x4,y4)
line(x1,y4,x4,y4)
line(x2,y1,x2,y4)/*shu*/
line(x3,y1,x3,y4)
line(x1,y2,x4,y2)/*heng*/
line(x1,y3,x4,y3)
circle((x2+x3)/2,(y2+y3)/2,(y3-y2)/2-10)/*hua yuan*/
size=imagesize((x2+x3)/2-(y3-y2)/2+9,(y2+y3)/2-(y3-y2)/2+9,(x2+x3)/2+(y3-y2)/2-9,(y2+y3)/2+(y3-y2)/2-9)
buf_yuan=malloc(size)
if(!buf_yuan) exit(1)
getimage((x2+x3)/2-(y3-y2)/2+9,(y2+y3)/2-(y3-y2)/2+9,(x2+x3)/2+(y3-y2)/2-9,(y2+y3)/2+(y3-y2)/2-9,buf_yuan)
setcolor(BLACK)
circle((x2+x3)/2,(y2+y3)/2,(y3-y2)/2-10)
setcolor(WHITE)/*hua cha*/
line(x2+10,y2+10,x3-10,y3-10)
line(x2+10,y3-10,x3-10,y2+10)
buf_cha=malloc(size)
getimage((x2+x3)/2-(y3-y2)/2+9,(y2+y3)/2-(y3-y2)/2+9,(x2+x3)/2+(y3-y2)/2-9,(y2+y3)/2+(y3-y2)/2-9,buf_cha)
setcolor(BLACK)
line(x2+10,y2+10,x3-10,y3-10)
line(x2+10,y3-10,x3-10,y2+10)
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void SiJiao(int heng,int lie)
{
int a1,b1,a2,b2
void huahei(void)/*把原来用白色显示的将要走步的边框用黑色覆盖*/
huahei()
setcolor(WHITE)
switch(heng)
{
case 1:
b1=y1
b2=y2
break
case 2:
b1=y2
b2=y3
break
case 3:
b1=y3
b2=y4
break
}
switch(lie)
{
case 1:
a1=x1
a2=x2
break
case 2:
a1=x2
a2=x3
break
case 3:
a1=x3
a2=x4
break
}
line(a1+3,b1+3,a1+30,b1+3)
line(a1+3,b1+3,a1+3,b1+30)
line(a1+3,b2-3,a1+3,b2-30)
line(a1+3,b2-3,a1+30,b2-3)
line(a2-30,b1+3,a2-3,b1+3)
line(a2-3,b1+3,a2-3,b1+30)
line(a2-30,b2-3,a2-3,b2-3)
line(a2-3,b2-30,a2-3,b2-3)
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void huahei(void)
{
int i,j,a1,b1,a2,b2
setcolor(BLACK)
for(i=1i<4i++)
for(j=1j<4j++)
{
switch(i)
{
case 1:
b1=y1
b2=y2
break
case 2:
b1=y2
b2=y3
break
case 3:
b1=y3
b2=y4
break
}
switch(j)
{
case 1:
a1=x1
a2=x2
break
case 2:
a1=x2
a2=x3
break
case 3:
a1=x3
a2=x4
break
}
line(a1+3,b1+3,a1+30,b1+3)
line(a1+3,b1+3,a1+3,b1+30)
line(a1+3,b2-3,a1+3,b2-30)
line(a1+3,b2-3,a1+30,b2-3)
line(a2-30,b1+3,a2-3,b1+3)
line(a2-3,b1+3,a2-3,b1+30)
line(a2-30,b2-3,a2-3,b2-3)
line(a2-3,b2-30,a2-3,b2-3)
}
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void hua(int heng,int lie,int type)/*type的值为1表示圆,2表示叉*/
{
int x,y
setcolor(WHITE)
switch(lie)
{
case 1:
x=(x1+x2)/2-(x2-x1)/2+9
break
case 2:
x=(x2+x3)/2-(x3-x2)/2+9
break
case 3:
x=(x3+x4)/2-(x4-x3)/2+9
break
}
switch(heng)
{
case 1:
y=(y1+y2)/2-(y2-y1)/2+9
break
case 2:
y=(y2+y3)/2-(y3-y2)/2+9
break
case 3:
y=(y3+y4)/2-(y4-y3)/2+9
break
}
switch(type)
{
case 1:
buf=buf_yuan
a[heng][lie]=1
break
case 2:
buf=buf_cha
a[heng][lie]=20
break
}
putimage(x,y,buf,COPY_PUT)
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void display(int type)
{
if(type==1)
outtextxy(270,430,"O Win")
if(type==2)
outtextxy(270,430,"X Win")
if(type==3)
outtextxy(270,430,"draw")
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void hz(int x,int y,int a,int COL,int b,char *s)/*x,y为显示的坐标,a为字与字之间的间隔,b为字的大小,s为指向为显示的汉字的指针*/
{
int ROW
char buffer[32]
register m,n,i1,j1,k
unsigned char qh,wh
unsigned long offset
ROW=COL
while(*s)
{
qh=*(s)-0xa0/*汉字区位码*/
wh=*(s+1)-0xa0
offset=(94*(qh-1)+(wh-1))*32L/*计算该汉字在字库中偏移量*/
fseek(fp,offset,SEEK_SET)
fread(buffer,32,1,fp)/*取出汉字32字节的点阵字模存入buffer中(一个汉字) */
for (i1=0i1<16i1++)/*将32位字节的点阵按位在屏幕上打印出来(1:打印,0:不打印),显示汉字 */
for(n=0n<ROWn++)
for(j1=0j1<2j1++)
for(k=0k<8k++)
for(m=0m<COLm++)
if (((buffer[i1*2+j1]>>(7-k))&amt0x1)!=NULL)
putpixel(x+8*j1*COL+k*COL+m,y+i1*ROW+n,b)
s+=2/*因为一个汉字内码占用两个字节,所以s必须加2*/
x+=a
}
}
/**************************************************************************/
void computer(void)
{
int i,j
for(i=1i<4i++)/*横向判断*/
if(a[i][1]+a[i][2]+a[i][3]==40)
for(j=1j<4j++)
if(a[i][j]==0)
{
hua(i,j,2)
return
}
for(i=1i<4i++)/*横向判断*/
if(a[i][1]+a[i][2]+a[i][3]==2)
for(j=1j<4j++)
if(a[i][j]==0)
{
hua(i,j,2)
return
}
for(i=1i<4i++)/*竖向判断*/
if(a[1][i]+a[2][i]+a[3][i]==40)
{
for(j=1j<4j++)
if(a[j][i]==0)
{
hua(j,i,2)
return
}
}
for(i=1i<4i++)/*竖向判断*/
if(a[1][i]+a[2][i]+a[3][i]==2)
for(j=1j<4j++)
if(a[j][i]==0)
{
hua(j,i,2)
return
}
if(a[1][1]+a[2][2]+a[3][3]==40)/*左上角到右下角判断*/
{
for(i=1i<4i++)
if(a[i][i]==0)
{
hua(i,i,2)
return
}
}
else if(a[1][1]+a[2][2]+a[3][3]==2)
for(i=1i<4i++)
if(a[i][i]==0)
{
hua(i,i,2)
return
}
if(a[3][1]+a[2][2]+a[1][3]==40)/*右上角到左下角判断*/
{
for(i=1i<4i++)
if(a[i][4-i]==0)
{
hua(i,4-i,2)
return
}
}
else if(a[3][1]+a[2][2]+a[1][3]==2)
for(i=1i<4i++)
if(a[i][4-i]==0)
{
hua(i,4-i,2)
return
}
for(i=1i<4i++)/*随便找到空位填上去*/
for(j=1j<4j++)
if(a[i][j]==0)
{
hua(i,j,2)
return
}
}
void hanzi(int x,int y,char *p,int colour)
{
FILE *fp
char buffer[32]
register i,j,k
unsigned char qh,wh
unsigned long location
if((fp=fopen("hzk16","rb"))==NULL)
{
printf("Can't open hzk16!")
getch()
exit(0)
}
while(*p)
{
if(((unsigned char)*p>=0xa1&amt&amt(unsigned char)*p<=0xfe)&amt&amt((unsigned char)*(p+1)>=0xal&amt&amt(unsigned char)*(p+1)<=0xfe))
{
qh=*p-0xa0
wh=*(p+1)-0xa0
location=(94*(qh-1)+(wh-1))*32L
fseek(fp,location,SEEK_SET)
fread(buffer,32,1,fp)
for(i=0i<16i++)
for(j=0j<2j++)
for(k=0k<8k++)
if(((buffer[i*2+j]>>(7-k))&amt0x1)!=NULL)
putpixel(x+8*j+k,y+i,colour)
p+=2
x+=18
if(x>600)
{
x=15y+=18
}
}
else
{
char q[2]
moveto(x,y)
*q=*p
*(q+1)='\0'
outtextxy(x,y+4,q)
x+=8+1p++
}
}
fclose(fp)
}
都是井字游戏,C语言的,你参考看看。
可以用tc里面的<graphics.h>来做,但是vc里面没有,那么就要通过形式的找规律来做了,要是你仅仅是想输出一个井字格,而不是做一个小游戏的话可以用下面的思路,但是你要是想做一个小游戏的话,那么就不可以了,因为下面说的是静态的,空都是自己输出的,是空格字符,不能实时的改变里面的内容,比如....*...*...
**********
..*...*...
**********
..*...*...
.就代表空格,那么你就定义5个一维数组了,或者是一个二维数组,然后吧里面的元素先赋值好,然后输出就可以了,办法有点笨...不笨点就是用循环,然后你自己输入行数和列数,但是这个就不能用数组输出了,就是找规律之后再一个一个的输出了~~