導航:首頁 > 源碼編譯 > c井字棋演算法

c井字棋演算法

發布時間:2022-05-09 13:56:55

❶ C語言井字游戲

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(&amt;gd,&amt;gm,"");
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;&amt;a[1][2]==1&amt;&amt;a[1][3]==1)/*判斷是否贏了*/
||(a[2][1]==1&amt;&amt;a[2][2]==1&amt;&amt;a[2][3]==1)
||(a[3][1]==1&amt;&amt;a[3][2]==1&amt;&amt;a[3][3]==1)
||(a[1][1]==1&amt;&amt;a[2][1]==1&amt;&amt;a[3][1]==1)
||(a[1][2]==1&amt;&amt;a[2][2]==1&amt;&amt;a[3][2]==1)
||(a[1][3]==1&amt;&amt;a[2][3]==1&amt;&amt;a[3][3]==1)
||(a[1][1]==1&amt;&amt;a[2][2]==1&amt;&amt;a[3][3]==1)
||(a[1][3]==1&amt;&amt;a[2][2]==1&amt;&amt;a[3][1]==1))
{
display(1);
END=1;
}
if(!END)
{
h=0;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
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;&amt;a[1][2]==20&amt;&amt;a[1][3]==20)/*判斷是否贏了*/
||(a[2][1]==20&amt;&amt;a[2][2]==20&amt;&amt;a[2][3]==20)
||(a[3][1]==20&amt;&amt;a[3][2]==20&amt;&amt;a[3][3]==20)
||(a[1][1]==20&amt;&amt;a[2][1]==20&amt;&amt;a[3][1]==20)
||(a[1][2]==20&amt;&amt;a[2][2]==20&amt;&amt;a[3][2]==20)
||(a[1][3]==20&amt;&amt;a[2][3]==20&amt;&amt;a[3][3]==20)
||(a[1][1]==20&amt;&amt;a[2][2]==20&amt;&amt;a[3][3]==20)
||(a[1][3]==20&amt;&amt;a[2][2]==20&amt;&amt;a[3][1]==20))

{
display(2);
END=1;
}
if(!END)
{ h=0;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
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;&amt;kai==1&amt;&amt;END!=1&amt;&amt;restart!=1)
{
computer();
kai=2;
if((a[1][1]==20&amt;&amt;a[1][2]==20&amt;&amt;a[1][3]==20)/*判斷是否贏了*/
||(a[2][1]==20&amt;&amt;a[2][2]==20&amt;&amt;a[2][3]==20)
||(a[3][1]==20&amt;&amt;a[3][2]==20&amt;&amt;a[3][3]==20)
||(a[1][1]==20&amt;&amt;a[2][1]==20&amt;&amt;a[3][1]==20)
||(a[1][2]==20&amt;&amt;a[2][2]==20&amt;&amt;a[3][2]==20)
||(a[1][3]==20&amt;&amt;a[2][3]==20&amt;&amt;a[3][3]==20)
||(a[1][1]==20&amt;&amt;a[2][2]==20&amt;&amt;a[3][3]==20)
||(a[1][3]==20&amt;&amt;a[2][2]==20&amt;&amt;a[3][1]==20))

{
display(2);
END=1;
}
if(!END)
{ h=0;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
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=1;i<4;i++)
for(j=1;j<4;j++)
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=1;i<4;i++)
for(j=1;j<4;j++)
{
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=0;i1<16;i1++)/*將32位位元組的點陣按位在屏幕上列印出來(1:列印,0:不列印),顯示漢字 */
for(n=0;n<ROW;n++)
for(j1=0;j1<2;j1++)
for(k=0;k<8;k++)
for(m=0;m<COL;m++)
if (((buffer[i1*2+j1]>>(7-k))&amt;0x1)!=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=1;i<4;i++)/*橫向判斷*/
if(a[i][1]+a[i][2]+a[i][3]==40)
for(j=1;j<4;j++)
if(a[i][j]==0)
{
hua(i,j,2);
return;
}
for(i=1;i<4;i++)/*橫向判斷*/
if(a[i][1]+a[i][2]+a[i][3]==2)
for(j=1;j<4;j++)
if(a[i][j]==0)
{
hua(i,j,2);
return;
}

for(i=1;i<4;i++)/*豎向判斷*/
if(a[1][i]+a[2][i]+a[3][i]==40)
{
for(j=1;j<4;j++)
if(a[j][i]==0)
{
hua(j,i,2);
return;
}
}
for(i=1;i<4;i++)/*豎向判斷*/
if(a[1][i]+a[2][i]+a[3][i]==2)
for(j=1;j<4;j++)
if(a[j][i]==0)
{
hua(j,i,2);
return;
}

if(a[1][1]+a[2][2]+a[3][3]==40)/*左上角到右下角判斷*/
{
for(i=1;i<4;i++)
if(a[i][i]==0)
{
hua(i,i,2);
return;
}
}
else if(a[1][1]+a[2][2]+a[3][3]==2)
for(i=1;i<4;i++)
if(a[i][i]==0)
{
hua(i,i,2);
return;
}

if(a[3][1]+a[2][2]+a[1][3]==40)/*右上角到左下角判斷*/
{
for(i=1;i<4;i++)
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=1;i<4;i++)
if(a[i][4-i]==0)
{
hua(i,4-i,2);
return;
}

for(i=1;i<4;i++)/*隨便找到空位填上去*/
for(j=1;j<4;j++)
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=0;i<16;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if(((buffer[i*2+j]>>(7-k))&amt;0x1)!=NULL)
putpixel(x+8*j+k,y+i,colour);
p+=2;
x+=18;
if(x>600)
{
x=15;y+=18;
}
}
else
{
char q[2];
moveto(x,y);
*q=*p;
*(q+1)='\0';
outtextxy(x,y+4,q);
x+=8+1;p++;
}
}
fclose(fp);
}
都是井字游戲,C語言的,你參考看看。

❷ C++ 井字棋

好了 所有要求都有了

#include <iostream>
#include <string>

using namespace std;

const int MAX_MOVES=9;

void printBoard(char board[3][3]);

void getNextMove(char board[3][3]);

void win(char board[3][3]);

void whowin(char key);
int foot = 0;

int main()
{
int i;
int n = 0;
char board[3][3]={ '7','8','9', '4','5','6', '1','2','3' };

printBoard(board);

for(i=0;i<MAX_MOVES;i++)
{
getNextMove(board);
win(board);
n++;
}

if(n=MAX_MOVES)
cout<<"gameover";

system("PAUSE");
return 0;
}
void win(char a[3][3])
{
int i, j, k;
char key;
if((a[0][0] == a[1][1] && a[1][1] == a[2][2] && a[2][2] == a[0][0]) || (a[2][0] == a[1][1] && a[1][1] == a[0][2] && a[2][0] == a[0][2]))
{
key = a[0][0];
whowin(key);
}
else
{
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
if(a[i][j] == 15 || a[i][j] == 'X')
{
key = a[i][j];
for(k = 0; k < 3; k++)
{
if(a[i][k] != key)
break;
}
if(k == 3)
whowin(key);
for(k = 0; k < 3; k++)
{
if(a[k][j] != key)
break;
}
if(k == 3)
whowin(key);
}
}
}
void whowin(char key)
{
if(key == 15)
cout << "P1 Win!" << endl;
else
cout << "P2 Win!" << endl;
exit(0);
}
void printBoard(char board[3][3])
{
cout<<board[0][0]<<" | "<<board[0][1]<<" | "<<board[0][2]<<endl;
cout<<"--+---+--"<<endl;
cout<<board[1][0]<<" | "<<board[1][1]<<" | "<<board[1][2]<<endl;
cout<<"--+---+--"<<endl;
cout<<board[2][0]<<" | "<<board[2][1]<<" | "<<board[2][2]<<endl;
}

void getNextMove(char board[3][3])
{
int i,j,s,t;
char m;
while(1)
{
s = -1;
t = -1;
cout<<"Make your move: ";
cin>>m;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(board[i][j]==m)
{
s=i;
t=j;
}
if(s == -1 && t == -1)
cout << "that point already has a pawn!" << endl;
else
break;
}
if(foot % 2 == 0)
board[s][t] = 15;
else
board[s][t] = 'X';
foot++;
system("cls");
printBoard(board);
}

❸ 用c語言寫井字棋游戲 求教一個問題

用char數組存棋盤,並記錄當前是玩家1還是玩家2。

如果用戶輸入0,首先判斷當前玩家是1還是2。如果是1,就board[0] = 'O';否則board[0] = 'X'。

偽代碼就類似於:

charboard[10]="";//初始為9個空格,並且多留一個位置放''
intplayer=1;//從玩家1開始,取值為1或2
intposition;//玩家在哪個格子放O或X。取值為0~8
while(true){
scanf("%d",&position);//獲取玩家輸入
if(player==1){//對於玩家1,應該往棋盤上放O,下一次就輪到玩家2
board[position]='O';
player=2;
}else{//對於玩家2,應該往棋盤上放X,下一次就輪到玩家1
board[position]='X';
player=1;
}
print(board);//輸出棋盤(需要另外實現)
if(gameOver(board)){//檢查輸贏(需要另外實現)
//輸出誰贏了並退出
break;
}
}

❹ C++ 井字棋 (注釋) 一定要給注釋!!!

#include <stdio.h>
#include <stdlib.h>

#define SIZE 3
typedef enum {CBLANK, CBLACK, CWHITE} CHESS;
typedef enum {GM_WIN, GM_LOST, GM_UNKNOW, GM_ERROR} GAMEFLAG;

void init_board(CHESS board[SIZE][SIZE]) //初始化
{
int i, j;
for (i = 0; i < SIZE; i++)
{
for (j = 0; j < SIZE; j++)
{
board[i][j] = CBLANK;
}
}
}

void print_chess(CHESS board[SIZE][SIZE]) //列印棋盤
{
int i, j;

putchar(' ');
for (i=0; i < SIZE; i++)
{
printf("%2d", i+1);
}
putchar('\n');

for (i=0; i < SIZE; i++)
{
printf("%-2d", i+1);
for (j=0; j < SIZE; j++)
{
switch (board[i][j])
{
case CWHITE:
putchar('O');
break;
case CBLACK:
putchar('*');
break;
case CBLANK:
putchar('_');
break;
default:
putchar('?');
break;
}
putchar(' ');
}
putchar('\n');
}
}

void swc(CHESS chess, int *black, int *white, int *bmax, int *wmax) //判斷
{
switch (chess)
{
case CBLACK:
*white = 0;
(*black)++;
break;
case CWHITE:
*black = 0;
(*white)++;
break;
case CBLANK:
*black = 0;
*white = 0;
break;
default:
break;
}

if (*black > *bmax) *bmax = *black;
if (*white > *wmax) *wmax = *white;
}

GAMEFLAG res(CHESS board[SIZE][SIZE]) //判斷輸贏
{
int i, j;
int win[4] = {0, 0, 0, 0};
int rblack, rwhite, cblack, cwhite,
loblack = 0, lowhite = 0,
roblack = 0, rowhite = 0,
bmax = 0, wmax = 0;

for (i=0; i < SIZE; i++)
{
rblack = 0;
rwhite = 0;
cblack = 0;
cwhite = 0;

swc(board[i][i], &loblack, &lowhite, &bmax, &wmax);
swc(board[i][SIZE-i-1], &roblack, &rowhite, &bmax, &wmax);

for (j=0; j < SIZE; j++)
{
swc(board[i][j], &rblack, &rwhite, &bmax, &wmax);
swc(board[j][i], &cblack, &cwhite, &bmax, &wmax);

}

}

if (bmax >= 3)
{
if (wmax >= 3)
{
return GM_ERROR;
}
else
{
return GM_WIN;
}
}
else
{
if (wmax >= 3)
{
return GM_LOST;
}
else
{
return GM_UNKNOW;
}
}

}

int move(CHESS board[SIZE][SIZE], CHESS chs, int x, int y)
{
int bs = 1;
if (board[x][y])
bs = 0;
else if (y >= SIZE || y < 0 || x >= SIZE || x < 0)
bs = 0;
else
board[x][y] = chs;

return bs;
}

int main()
{
CHESS b[SIZE][SIZE];
char *msg[] = {"BLACK WIN!\n", "WHITE LOST!", "NOT YET", "ERROR!!"};
char *plr[] = {"NON", "BLACK", "WHITE"};
CHESS p = CBLACK;
GAMEFLAG flg;

init_board(b);
while ((flg = res(b)) == GM_UNKNOW)
{
int x, y, bmv = 1;
system("cls");
print_chess(b);
while (bmv)
{
printf("%s回合,輸入坐標:", plr[p]);
scanf("%d%d", &x, &y);
bmv = !move(b,p,x-1,y-1);
}
p = (CHESS)(CWHITE + CBLACK - p);
}

printf("%s", msg[flg]);
system("pause");

return 0;
}

有加分有注釋!!

❺ 這是一個關於C語言的問題,在井字棋局中如何確定的玩家落子求解!!

輸入0~8的數字來確定落子位置,簡單的程序啊

scanf("%d",&choice);
row=--choice/3;
column=choice%3;

❻ 用C寫一個井字棋程序,但第(1,1)格總是顯示5,代碼如下,望解答

#include<stdio.h>
#include<ctype.h>
#include<conio.h>
int n=9, z=0, qp[10]={0};
int chkwin(int t[], int w)
{if (t[1]==w && t[1]==t[2] && t[2]==t[3]) return(w);
if (t[4]==w && t[4]==t[5] && t[5]==t[6]) return(w);
if (t[7]==w && t[7]==t[8] && t[8]==t[9]) return(w);
if (t[1]==w && t[1]==t[4] && t[4]==t[7]) return(w);
if (t[2]==w && t[2]==t[5] && t[5]==t[8]) return(w);
if (t[3]==w && t[3]==t[6] && t[6]==t[9]) return(w);
if (t[1]==w && t[1]==t[5] && t[5]==t[9]) return(w);
if (t[3]==w && t[3]==t[5] && t[5]==t[7]) return(w);
return(0);
}

long search(int n, int k, int t[])
{int i, h, f, g;
long j;
if (n==0) return(chkwin(t,k));
for (f=0, j=0,i=1; i<10; i++)
if (t[i]==0)
{t[i]=k; h=chkwin(t,k);
if (h==k) f++;
else j+=search(n-1,k*-1,t);
t[i]=0;
}
if (f>z) for (j=k, g=n; g>0; j*=g--);
return(j);
}
/* 電腦選位置走棋,擇位原則1.當前位置必須為空 */
/* 2.若走當前位置電腦能贏,則走這一步,否則轉(3) */
/* 3.若當前位置被人走電腦會輸,則走這一步,否則轉(4) */
/* 4.試走當前位置並調用 search()函數,求走當前位置電腦的有利程度 */
/* 5.找對電腦有利程度最大的位置走 */
void cgo()
{int i, ti=0;
long j=-8000000, t=0;
for (ti=1; ti>-2; ti-=2) /*ti=1,先看自己能否贏;ti=-1,看對受能否贏*/
for (i=1; i<10; i++)
if (qp[i]==0)
{qp[i]=ti;
if (chkwin(qp, ti)!=0) {n--; qp[i]=1; return;}
qp[i]=0;
}
for (i=1; i<10;i++)
if (qp[i]==0)
{qp[i]=1; t=search(n-1,-1,qp);
if (t>j) {j=t; ti=i;}
qp[i]=0;
}
n--; qp[ti]=1;
}
/* 函數mgo(),人輸入走棋位置 */
void mgo()
{int c=0;
printf ("\nPlease enter the Num to go: ");
for (c=getche(); ; printf("\n"), c=getche() )
if (isdigit(c) && c!='0' && qp[c-48]==0)
{n--; qp[c-48]=-1; return;
} }
/* 屏幕輸出函數display,在屏幕上輸出當前的棋盤 */
void display(int x)
{int i;
char t[10]={0};
for (i=1; i<10; i++)
{if (qp[i]>0) t[i]=88;
if (qp[i]<0) t[i]=79;
}
printf ("\n%c|%c|%c\n-----\n%c|%c", t[1], t[2], t[3], t[4], t[5]);
printf ("|%c\n-----\n%c|%c|%c\n", t[6], t[7], t[8], t[9]);
if (x==0) printf("\ndraw! \n");
if (x==1) printf("\ncomputer win!\n");
if (x==2) printf("\ncontinue \n");
}
main()
{char c;
printf ("\nGo first? [Y/N]:"); /*選擇誰先走*/
for (c=getche(); c!='Y'&&c!='y'&&c!='N'&&c!='n'; c=getche());
if (c=='N'||c=='n') {cgo(); z=1; display(2);}
while (1)
{mgo(); if (!n) {display(0); break;} /*人走,若不是最後一步,繼續;否則跳出*/
cgo(); if (chkwin(qp,1)) {display(1); break;} /*電腦走,若沒贏,繼續;否則跳出*/
if (n) display(2); /*還沒走到最後一步,繼續;否則跳出*/
else {display(0); break;}
}
getchar();
return 0;
}

❼ 要求用c語言寫一個井字棋游戲 問題如下

簡單來說,定義數據結構(比如棋盤數組,棋盤格子以及棋子,雙方玩家等相關的數據結構表示),定義規則(比如同一個位置不能放兩顆棋子,三顆棋子連線放勝利)。

具體取決於需求,比如圖形表示和AI(人工智慧)等等。如果你只是想要簡單的用命令行和文字輸出表示,那麼編寫一個控制台應用程序就可以。如果需要圖形等控制,需要藉助一些圖形以及UI庫等。但是這些外部表示可以跟核心數據結構和規則,演算法等分離開來。所以剛開始先用文字表示寫出核心代碼,後續可以逐漸加上UI圖形,AI等。

❽ 高分求演算法:關於井字棋(三子棋)的演算法!!面談感謝!!!!

「井字棋」游戲(又叫「三子棋」),是一款十分經典的益智小游戲,想必很多玩家都有玩過。「井字棋」的棋盤很簡單,是一個3×3的格子,很像中國文字中的「井」字,所以得名「井字棋」。「井字棋」游戲的規則與「五子棋」十分類似,「五子棋」的規則是一方首先五子連成一線就勝利;「井字棋」是一方首先三子連成一線就勝利。

井字棋(英文名Tic-Tac-Toe)

井字棋的出現年代估計已不可考,西方人認為這是由古羅馬人發明的;但我們中國人認為,既然咱們都發明了圍棋、五子棋,那發明個把井字棋自然是不在話下。這些純粹是口舌之爭了,暫且不提。

想起小時候上課喜歡玩井字棋,只要一張草稿紙、一支筆、同桌兩人就可以玩了。上體育課,也可以拿著樹枝在沙坑裡玩。但一直感覺這游戲太簡單了,後來接觸了五子棋,著迷了一陣,但水平總是很差,便也不玩了。

一字棋游戲極小極大分析法

設有九個空格,由MAX,MIN二人對弈,輪到誰走棋誰就往空格上放一隻自己的棋子,誰先使自己的棋子構成「三子成一線」(同一行或列或對角線全是某人的棋子),誰就取得了勝利。
用叉號表示MAX,用圓圈代表MIN。

比如右圖中就是MIN取勝的棋局。

為了不致於生成太大的博弈樹,假設每次僅擴展兩層。估價函數定義如下:

設棋局為P,估價函數為e(P)。
(1) 若P對任何一方來說都不是獲勝的位置,則e(P)=e(那些仍為MAX空著的完全的行、列或對角線的總數)-e(那些仍為MIN空著的完全的行、列或對角線的總數)

(2) 若P是MAX必勝的棋局,則e(P)=+∞。

(3) 若P是B必勝的棋局,則e(P)=-∞。
比如P如右圖示,則e(P)=6-4=2

要注意利用棋盤位置的對稱性,在生成後繼節點的位置時,下列博弈結局

都是相同的棋局(在博弈中,一宇棋的分枝系數比較小起初是由於對稱性,而後是由於棋盤上未布子的空格減少所致)。圖3.15畫出了經過兩層搜索生成的博弈樹,靜態估值記在端節點下面,倒推值記在圓圈內。
由於右圖所示位置具有最大的倒推值,它應當選取為MAX的第一步(正好是MAX的最好的優先走步)。
現在我們假設MAX走了這一步,而MIN的回步是直接在X上方的空格里放上一個圓圈(對MAX來說這是一步壞棋,他一定沒有採用好的搜索策略)。下一步,MAX又在新的格局下搜索兩層,產生如圖3.16所示的搜索圖。

現在圖中MAX有兩個可能「最好的」優先走步,假設MAX走了圖上指明的那一步。而MIN為了避免立即敗北被迫走了另一步,從而產生如下棋局:MAX再次搜索,產生如圖3.17所示的樹。
在這棵樹中某些端節點(例如其中一個標記著A)代表MIN獲勝,因此它們的估值為—∞。當這些估值被倒推回去時,可看到MAX的最好的也是唯一能使他避免立即失敗的一個走步。現在,MIN可以看出MAX必然在他的下一走步中獲勝,因此,MIN只好認輸。
按極大極小演算法編程下一字棋的演示(右圖,可以點擊操作)...

我們就利用Visual Basic編寫一個「井字棋」的小游戲。

【設計思路】

首先,我們要知道,「井字棋」游戲是一款典型的棋類游戲,游戲時一方式是電腦,另一方是玩家。所以,這類游戲在開始時有兩種方式:一種是玩家先走;另一種是電腦先走。這是我們要考慮的第一個問題。

其次,由於與玩家對戰的是計算機,所以我們要編寫一個過程(Chuqi),它可以使程序模擬人的思維與人下棋(其實就是「人工智慧」的體現),這個Chuqi過程也是本游戲軟體的關鍵。此外,我們還要編寫兩個過程(Lianxian和Shuying),Lianxian過程用來時刻判斷棋盤中是否有三個棋子連成一線;Shuying過程用來判斷如果有三個棋子連成一線,是哪一方連成一線的,即判斷哪一方獲勝。

以上幾個問題就是該「井字棋」游戲實現的關鍵思路。....
QQ:744192659
郵箱:[email protected]

❾ c語言井字棋雙人對戰

3x3的棋盤輸入0~8的數字來確定落子位置,簡單的程序啊 scanf("%d",&choice); 以下一句3的整倍數確定玩家落棋的行數 row = --choice / 3; 確定行數還不行,必須確定列數,所以除3的余數就是列數 column = choice % 3;

❿ C語言編寫井字棋游戲 代碼已有半成品

你初始化一個字元數組,裡面都給他一樣的初始值 E
X 下了就改成X ,O 下了就改成 O,下完以後判斷橫豎斜三條線有沒有一樣的,

一共就九個格子,下一步就少一步 ,下之前判斷一下,如果等於E ,就是空的,可以放子。
下完一步總步數減一,你這樣不就能確定還有幾步可以走了。
九步都下完如果沒有橫豎斜都一樣的不就是平局嗎,所有數組元素的值都不等於E了不就結束了,或者九步完了也結束了

另外,少用GOTO ,變數定義最好有意義,寫點注釋

閱讀全文

與c井字棋演算法相關的資料

熱點內容
gcc編譯手冊pdf 瀏覽:584
梁箍筋未標注加密區 瀏覽:627
自家網路連不上上面顯示加密 瀏覽:386
編譯後無法運行圖片 瀏覽:592
linux系統修改文件命令 瀏覽:702
iphone如何安裝中國石化app 瀏覽:176
app怎麼寫簡歷 瀏覽:680
金蝶kis雲app怎麼樣 瀏覽:708
cad命令xr 瀏覽:296
f如何設置ftp伺服器 瀏覽:833
編程題兔子生兔子python 瀏覽:421
加密數字卡專利申請 瀏覽:783
我的世界命令方塊該怎麼拿 瀏覽:785
浙江容錯伺服器廠家雲空間 瀏覽:196
linuxpython3idle 瀏覽:741
程序員成就感從哪來 瀏覽:547
游資抄底源碼公式 瀏覽:804
用VF命令 瀏覽:950
解壓速度14m 瀏覽:332
php獲取httpheader 瀏覽:301