當前位置:首頁 » 軟體設計 » 五子棋程序設計

五子棋程序設計

發布時間: 2021-02-19 08:47:19

1. C語言程序設計 關於五子棋的

五子棋程序:

#include<iostream>
using namespace std;
int Hsheng(char a[][15]);//判斷o子是否獲勝的函數
int Bsheng(char a[][15]);//判斷x子是否獲勝的函數
int he(char a[][15]);//判斷是否平局(也就是棋盤下滿了)的函數
void qipan(char a[15][15])//執行輸出棋盤命令
{ for(int i=0;i<15;i++) //列印棋盤
{ for(int j=0;j<15;j++)
cout<<a[i][j];
cout<<endl; } }
int main()
{ char a[15][15]; int x,y;
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
a[i][j]=' '; qipan(a);
while(1)//用循環語句執行o,x交替下子,這些while語句看起來似乎是個死循環~實際上都會經過break結束
{ int a1=1;
while(1)
{ for(;a1;)
{ cout<<"請輸入o子下的位置:"; //輸入o子的位置
cin>>x>>y; if(a[x][y]=='o'||a[x][y]=='x')//判斷是否已有子
{cout<<"已有子請重下"<<",";continue;}
else if(x>=15||y>=15){cout<<"輸入錯誤請重輸"<<",";continue;}
else { a[x][y]='o'; a1=0;}
} break;}
qipan(a);//下好o子後將棋盤顯示
if(Hsheng(a))//判斷o子是否已經獲勝
{ cout<<"o子獲勝"<<endl; break; }
while(1)//下x子
{ cout<<"請輸入x子下的位置:";
cin>>x>>y;
if(a[x][y]=='o'||a[x][y]=='x'||x>=15||y>=15)
{ for( ; a[x][y]=='o'||a[x][y]=='x'; )
{ cout<<"已有子請重下";
cout<<"請輸入x子下的位置:";
cin>>x>>y;continue; }
for ( ; x>=15||y>=15||x; )
{ cout<<"輸入錯誤請重輸"<<","; //判斷輸入棋子位置是否正確
cout<<"請輸入x子下的位置:";
cin>>x>>y;continue ;}
a[x][y]='x';break; }
else
{ a[x][y]='x'; break; } }
qipan(a);//再一次輸出棋盤
if(Bsheng(a))//判斷x子是否已經獲勝
{ cout<<"x子獲勝"<<endl; break; }
if(he(a))//判斷是否平局
{ cout<<"平局"<<endl; break; } }
return 0; }
int Hsheng(char a[][15])
{ int i,j;//判斷橫著的5個是否都相等
for(i=0;i<15;i++)
for(j=0;j<15;j++)
if(a[i][j]=='o'&&a[i][j+1]=='o'&&a[i][j+2]=='o'&&a[i][j+3]=='o'&&a[i][j+4]=='o')
return 1;
for(j=0;j<15;j++)//判斷豎著的5個是否都相等
for(i=0;i<15;i++)
if(a[i][j]=='o'&&a[i+1][j]=='o'&&a[i+2][j]=='o'&&a[i+3][j]=='o'&&a[i+4][j]=='o')
return 1;
for(i=0;i<15;i++)//判斷左斜5個
for(j=0;j<15;j++)
if(a[i][j]=='o'&&a[i+1][j+1]=='o'&&a[i+2][j+2]=='o'&&a[i+3][j+3]=='o'&&a[i+4][j+4]=='o')
return 1;
for(i=0;i<15;i++)//右斜5個
for(j=14;j>3;j--)
if(a[i][j]=='H'&&a[i+1][j-1]=='o'&&a[i+2][j-2]=='o'&&a[i+3][j-3]=='o'&&a[i+4][j-4]=='o')
return 1;
return 0; }
int Bsheng(char a[][15])//同o,只是改字元
{ int i,j;
for(i=0;i<15;i++)
for(j=0;j<15;j++)
if(a[i][j]=='x'&&a[i][j+1]=='x'&&a[i][j+2]=='x'&&a[i][j+3]=='x'&&a[i][j+4]=='x')
return 1;
for(j=0;j<15;j++)
for(i=0;i<15;i++)
if(a[i][j]=='x'&&a[i+1][j]=='x'&&a[i+2][j]=='x'&&a[i+3][j]=='x'&&a[i+4][j]=='x')
return 1;
for(i=0;i<15;i++)
for(j=0;j<15;j++)
if(a[i][j]=='x'&&a[i+1][j+1]=='x'&&a[i+2][j+2]=='x'&&a[i+3][j+3]=='x'&&a[i+4][j+4]=='x')
return 1;
for(i=0;i<15;i++)
for(j=14;j>3;j--)
if(a[i][j]=='x'&&a[i+1][j-1]=='x'&&a[i+2][j-2]=='x'&&a[i+3][j-3]=='x'&&a[i+4][j-4]=='x')
return 1;
return 0; }
int he(char a[][15])
{ for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
{ if(a[i][j]==' ')//當棋盤全部子都不是' '時才能return 1,即棋盤已下滿
return 0;
}
return 1;
}

希望能幫到你!!

2. 經典五子棋的C++程序設計

#include<iostream>

#include<stdlib.h>

usingnamespacestd;

classfivegame

{charm,n;

inth,l;

charz;

charlist[20][20];

public:

intkk;

intinit();

intenterchar(charq);

intprint();

intpk();

intifwin();

boolison;

booltest();

charlist1[5];

intpuout();

};

intfivegame::puout()

{cout<<"這是個五字棋游戲"<<endl;

cout<<"製作--elva6401--"<<endl;

cout<<"(注:行列都要用大寫字母)"<<endl;

return0;

}

boolfivegame::test()

{

inti;

for(i=0;i<=4;i++)

{if(list1[i]!=z)

returnfalse;}

returntrue;

}

intfivegame::init()

{inti,j,m=0;

for(i=0;i<=9;i++)cout<<i<<"";

for(i=65;i<=75;i++)cout<<static_cast<char>(i)<<"";

cout<<0<<endl;

for(j=0;j<=8;j++)

{m=m+1;cout<<m<<"";

for(i=0;i<=19;i++)

{list[j][i]='';cout<<list[j][i]<<"";}

cout<<m<<endl;}

m=64;

for(j=9;j<=19;j++)

{m=m+1;cout<<static_cast<char>(m)<<"";

for(i=0;i<=19;i++)

{list[j][i]='';cout<<list[j][i]<<"";}

cout<<static_cast<char>(m)<<endl;}

for(i=0;i<=9;i++)cout<<i<<"";

for(i=65;i<=75;i++)cout<<static_cast<char>(i)<<"";

cout<<0<<endl;

return0;

}

intfivegame::enterchar(charq)

{chara,b;

cout<<"現在輪到"<<q<<"下."<<endl;

cout<<"請輸入要下的行號和列號."<<endl;

cin>>a>>b;

z=q;m=a;n=b;

return0;

}

intfivegame::print()

{if(static_cast<int>(m)>60)h=static_cast<int>(m)-56;

elseh=static_cast<int>(m)-49;

if(static_cast<int>(n)>60)l=static_cast<int>(n)-56;

elsel=static_cast<int>(n)-49;

inti,j,m=0;

if(list[h][l]!='')

{kk=0;

for(i=0;i<=9;i++)cout<<i<<"";

for(i=65;i<=75;i++)cout<<static_cast<char>(i)<<"";

cout<<0<<endl;

for(j=0;j<=8;j++)

{m=m+1;cout<<m<<"";

for(i=0;i<=19;i++)

cout<<list[j][i]<<"";

cout<<m<<endl;}

m=64;

for(j=9;j<=19;j++)

{m=m+1;cout<<static_cast<char>(m)<<"";

for(i=0;i<=19;i++)

cout<<list[j][i]<<"";

cout<<static_cast<char>(m)<<endl;}

for(i=0;i<=9;i++)cout<<i<<"";

for(i=65;i<=75;i++)cout<<static_cast<char>(i)<<"";

cout<<0<<endl;

return0;}

else

list[h][l]=z;

for(i=0;i<=9;i++)cout<<i<<"";

for(i=65;i<=75;i++)cout<<static_cast<char>(i)<<"";

cout<<0<<endl;

for(j=0;j<=8;j++)

{m=m+1;cout<<m<<"";

for(i=0;i<=19;i++)

cout<<list[j][i]<<"";

cout<<m<<endl;}

m=64;

for(j=9;j<=19;j++)

{m=m+1;cout<<static_cast<char>(m)<<"";

for(i=0;i<=19;i++)

cout<<list[j][i]<<"";

cout<<static_cast<char>(m)<<endl;}

for(i=0;i<=9;i++)cout<<i<<"";

for(i=65;i<=75;i++)cout<<static_cast<char>(i)<<"";

cout<<0<<endl;

return0;

}

intfivegame::ifwin()

{inti,j,q=0,k=0;

for(i=0;i<=19;i++)

{q=0,k=0;

while(q<=15)

{for(j=q;j<=q+4;j++)

list1[j-k]=list[i][j];

if(fivegame::test())

{ison=true;returntrue;}

else

q++;k++;}

}

for(i=0;i<=19;i++)

{q=0,k=0;

while(q<=15)

{for(j=q;j<=q+4;j++)

list1[j-k]=list[j][i];

if(fivegame::test())

{ison=true;returntrue;}

else

q++;k++;}

}

for(i=0;i<=15;i++)

{q=0,k=0;

while(q<=15)

{

for(j=q;j<=q+4;j++)

list1[j-k]=list[i+j-k][j];

if(fivegame::test())

{ison=true;returntrue;}

else

q++;k++;}

}

for(i=18;i>=4;i--)

{q=0,k=0;

while(q<=15)

{

for(j=q;j<=q+4;j++)

list1[j-k]=list[i-j+k][19-j];

if(fivegame::test())

{ison=true;returntrue;}

else

q++;k++;}

}

for(i=0;i<=15;i++)

{q=0,k=0;

while(q<=15)

{

for(j=q;j<=q+4;j++)

list1[j-k]=list[i+j-k][19-j];

if(fivegame::test())

{ison=true;returntrue;}

else

q++;k++;}

}

for(i=18;i>=4;i--)

{q=0,k=0;

while(q<=15)

{

for(j=q;j<=q+4;j++)

list1[j-k]=list[i-j+k][19-j];

if(fivegame::test())

{ison=true;returntrue;}

else

q++;k++;}

}

for(i=18;i>=4;i--)

{q=0,k=0;

while(q<=15)

{

for(j=q;j<=q+4;j++)

list1[j-k]=list[i-j+k][j];

if(fivegame::test())

{ison=true;returntrue;}

else

q++;k++;}

}

return0;

}

intfivegame::pk()

{cout<<m<<""<<n<<""<<z<<endl;

cout<<static_cast<int>(m)<<static_cast<int>(n)<<endl;

return0;}

intmain()

{

intabc;

chary='a';

fivegamegame;

game.puout();

game.ison=false;

game.init();

while(game.ison==false)

{

game.kk=1;

game.enterchar(y);

system("cls");

game.puout();

game.print();

game.ifwin();

if(game.kk==1)

{

if(y=='a')y='b';

elsey='a';

}

}

if(y=='a')y='b';

elsey='a';

cout<<y<<"贏了!"<<endl;

cin>>abc;

return0;

}

3. C語言五子棋程序設計 謝謝!!

現在在變成語來言越變越快自,底層程序都可以用可視化的界面來完成了,就不要再固守c語言了,當然如果初學的話還是研究完c語言把,現在多用java和vs,高深多一點的是erlang,平時研究的同時多接觸點高級的東西,即便弄不懂也對自己有用處的。

4. 五子棋c程序設計

#include<stdio.h>
#define N 10
void welcome();
void initqipan();
void showqi(int i);
void save(int p);
void panan(int p);
void heqi();
void over();
int zouqihang();
int zouqilie();
/******************結構體*****************/
struct zuobiao
{
int x[N];
int y[N];
}wei[N];
/******************主函數*****************/
void main()
{
int p=0;
welcome();
initqipan();
for(p=1;p<=N;p++)
{
wei[p].x[p]=zouqihang();
wei[p].y[p]=zouqilie();
save(p);
showqi(p);
panan(p);
}
if(p==N)
heqi();
over();
}
/******************建立棋盤*****************/
void initqipan()
{
int i,j;
for(i=0;i<N;i++)
{
printf("%d",i);
printf(" ");
}
printf("\n");
for(i=1;i<N;i++)
{
for(j=0;j<N;j++)
{
if(j==0)
printf("%d",i);
else
printf("·");
}
printf("\n");
}
}
/******************顯示棋子*****************/
void showqi(int p)
{
int i,j,k,m;
int a[N],b[N];
FILE *fp;
fp=fopen("wuzi_list","rb");
for(i=1;i<=N;i++)
{
fread(&wei[i],sizeof(struct zuobiao),1,fp);
a[i]=wei[i].x[i];
b[i]=wei[i].y[i];
}
for(m=1;m<p;m++)
{
while(wei[p].x[p]==a[m]&&wei[p].y[p]==b[m])
{
printf("錯誤!\n");
wei[p].x[p]=zouqihang();
wei[p].y[p]=zouqilie();
m=1;
}
}
for(i=0;i<N;i++)
{
printf("%d",i);
printf(" ");
}
printf("\n");
for(i=1;i<N;i++)
{
for(j=1;j<N;j++)
{
if(j==1)
printf("%d",i);
for(k=1;k<=p;k++)
{
if(i==wei[k].x[k]&&j==wei[k].y[k])
{
if(k%2==1)
{printf("○");
break;}
else if(k%2==0)
{printf("●");
break;}
}
}
if(k>p)printf("·");
else continue;
}
printf("\n");
}
}
/******************走棋行*****************/
int zouqihang()
{
int x;
printf("請輸入要走棋子所在行數!\n");
printf("x=");
scanf("%d",&x);
while(x>N-1||x<1)
{
printf("錯誤!\n");
printf("請輸入要走棋子所在行數!\n");
printf("x=");
scanf("%d",&x);
}
return x;
}
/******************走棋列*****************/
int zouqilie()
{
int y;
printf("請輸入要走棋子所在列數!\n");
printf("y=");
scanf("%d",&y);
while(y>N-1||y<1)
{
printf("錯誤!\n");
printf("請輸入要走棋子所在列數!\n");
printf("y=");
scanf("%d",&y);
}
return y;
}
/******************文件保存*****************/
void save(int i)
{
FILE *fp;
fp=fopen("wuzi_list","wb");
fwrite(&wei[i],sizeof(struct zuobiao),1,fp);
}
/****************判斷輸贏*******************/
void panan(int p)
{
int i,j,k[8]={1,1,1,1,1,1,1,1,};
int a[N],b[N];
FILE *fp;
fp=fopen("wuzi_list","rb");
for(i=1;i<=p;i++)
{
fread(&wei[i],sizeof(struct zuobiao),1,fp);
a[i]=wei[i].x[i];
b[i]=wei[i].y[i];
}
/*****************判斷行******************/
for(i=1;i<=p;i++)
{
if(i%2==1)
{
for(j=1;j<=p;j=j+2)
{
if((a[i]==a[j])&&(b[i]==b[j]-1))
{
k[0]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-2))
{
k[0]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-3))
{
k[0]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-4))
{
k[0]++;
continue;
}
else if(k[0]==5)
{
printf("Player 1 wins!!!\n");
}
else
continue;
}
if(k[0]==5)
break;
k[0]=1;
}
else if(k[0]==5)
break;
else if(i%2==0)
{
for(j=2;j<=p;j=j+2)
{
if((a[i]==a[j])&&(b[i]==b[j]-1))
{
k[1]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-2))
{
k[1]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-3))
{
k[1]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-4))
{
k[1]++;
continue;
}
else if(k[1]==5)
{
printf("Player 2 wins!!!\n");
}
else
continue;
}
if(k[1]==5)
break;
k[1]=1;
}
}
/**********************判斷列************************/
for(i=1;i<=p;i++)
{
if(k[0]==5||k[1]==5)
break;
else if(i%2==1)
{
for(j=1;j<=p;j=j+2)
{
if((a[i]==a[j]-1)&&(b[i]==b[j]))
{
k[2]++;
continue;
}
else if((a[i]==a[j]-2)&&(b[i]==b[j]))
{
k[2]++;
continue;
}
else if((a[i]==a[j]-3)&&(b[i]==b[j]))
{
k[2]++;
continue;
}
else if((a[i]==a[j]-4)&&(b[i]==b[j]))
{
k[2]++;
continue;
}
else if(k[2]==5)
{
printf("Player 1 wins!!!\n");
}
else
continue;
}
if(k[2]==5)
break;
k[2]=1;
}
else if(k[2]==5)
break;
else if(i%2==0)
{
for(j=2;j<=p;j=j+2)
{
if((a[i]==a[j]-1)&&(b[i]==b[j]))
{
k[3]++;
continue;
}
else if((a[i]==a[j]-2)&&(b[i]==b[j]))
{
k[3]++;
continue;
}
else if((a[i]==a[j]-3)&&(b[i]==b[j]))
{
k[3]++;
continue;
}
else if((a[i]==a[j]-4)&&(b[i]==b[j]))
{
k[3]++;
continue;
}
else if(k[3]==5)
{
printf("Player 2 wins!!!\n");
}
else
continue;
}
if(k[3]==5)
break;
k[3]=1;
}
}
/****************判斷對角(左上-右下)******************/
for(i=1;i<=p;i++)
{
if(k[0]==5||k[1]==5||k[2]==5||k[3]==5)
break;
else if(i%2==1)
{
for(j=1;j<=p;j=j+2)
{
if((a[i]==a[j]-1)&&(b[i]==b[j]-1))
{
k[4]++;
continue;
}
else if((a[i]==a[j]-2)&&(b[i]==b[j]-2))
{
k[4]++;
continue;
}
else if((a[i]==a[j]-3)&&(b[i]==b[j]-3))
{
k[4]++;
continue;
}
else if((a[i]==a[j]-4)&&(b[i]==b[j]-4))
{
k[4]++;
continue;
}
else if(k[4]==5)
{
printf("Player 1 wins!!!\n");
}
else
continue;
}
if(k[4]==5)
break;
k[4]=1;
}
else if(k[2]==5)
break;
else if(i%2==0)
{
for(j=2;j<=p;j=j+2)
{
if((a[i]==a[j]-1)&&(b[i]==b[j]-1))
{
k[5]++;
continue;
}
else if((a[i]==a[j]-2)&&(b[i]==b[j]-2))
{
k[5]++;
continue;
}
else if((a[i]==a[j]-3)&&(b[i]==b[j]-3))
{
k[5]++;
continue;
}
else if((a[i]==a[j]-4)&&(b[i]==b[j]-4))
{
k[5]++;
continue;
}
else if(k[5]==5)
{
printf("Player 2 wins!!!\n");
}
else
continue;
}
if(k[5]==5)
break;
k[5]=1;
}
}
/**********判斷對角(左下-右上)************/
for(i=1;i<=p;i++)
{
if(k[0]==5||k[1]==5||k[2]==5||k[3]==5||k[4]==5||k[5]==5)
break;
else if(i%2==1)
{
for(j=1;j<=p;j=j+2)
{
if((a[i]==a[j]+1)&&(b[i]==b[j]-1))
{
k[6]++;
continue;
}
else if((a[i]==a[j]+2)&&(b[i]==b[j]-2))
{
k[6]++;
continue;
}
else if((a[i]==a[j]+3)&&(b[i]==b[j]-3))
{
k[6]++;
continue;
}
else if((a[i]==a[j]+4)&&(b[i]==b[j]-4))
{
k[6]++;
continue;
}
else if(k[6]==5)
{
printf("Player 1 wins!!!\n");
}
else
continue;
}
if(k[6]==5)
break;
k[6]=1;
}
else if(k[6]==5)
break;
else if(i%2==0)
{
for(j=2;j<=p;j=j+2)
{
if((a[i]==a[j]+1)&&(b[i]==b[j]-1))
{
k[7]++;
continue;
}
else if((a[i]==a[j]+2)&&(b[i]==b[j]-2))
{
k[7]++;
continue;
}
else if((a[i]==a[j]+3)&&(b[i]==b[j]-3))
{
k[7]++;
continue;
}
else if((a[i]==a[j]+4)&&(b[i]==b[j]-4))
{
k[7]++;
continue;
}
else if(k[7]==5)
{
printf("Player 2 wins!!!\n");
}
else
continue;
}
if(k[7]==5)
break;
k[7]=1;
}
}
}
/****************和棋*******************/
void heqi()
{
printf("平局\n");
}
/****************游戲結束*******************/
void over()
{
printf("游戲結束!!!\n");
}
/****************游戲開始*******************/
void welcome()
{
printf("歡迎使用!!!\n");
}

這個是10x10的,你改一下了就行 別忘了給分哦

5. 求一個五子棋程序設計實驗報告

我給你一個c++五子棋的程序mian.cpp#include <cstdio>
#include <string>
#include <cstdlib>
#include <ctime>
#include <Windows.h>
#include "pl.h"
using namespace std;pl game;
pl game2;void srandput(int &x,int &y) {
srand(time(NULL));
do {
x = rand() % 20;
y = rand() % 20;
} while (!game.isok(x,y));
}void scanfput(int &x,int &y) {
do {
scanf("%d %d",&x,&y);
} while (!game.isok(x,y));
}int main() {
int x,y;
char who = com;
x = y = -1;
do {
if (who == com) who = me;
else who = com;
if (who == me) {
game.getxy(x,y);
printf("Com put chess in (%d,%d)\n",x,y);
game.printmap();
if (game.isend(x,y,com)) {
who = com;
break;
} game.sendxy(x,y);
printf("I put chess in (%d,%d)\n",x,y);
game.printmap();
if (game.isend(x,y,me)) break;
//system("pause");
}
else {
//srandput(x,y);
scanfput(x,y);
//game2.getxy(x,y);
//game2.sendxy(x,y);
}
} while (true);
if (who == me) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwMe);
puts("You Win, Computer Lose.");
}
else {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwCom);
puts("Computer Win, You Lose.");
}
printf("Use %d Steps\n",game.getstep());
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwWhite);
} pi.hconst DWORD dwWhite = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;
const DWORD dwMe = FOREGROUND_GREEN;
const DWORD dwCom = FOREGROUND_RED;
//■□○●
char rec1[] = {-95,-10,0};
char rec2[] = {-95,-11,0};
char cir1[] = {-95,-16,0};
char cir2[] = {-95,-15,0};
//////////////////////////////////////////////////////////////////////////
//class pl
//////////////////////////////////////////////////////////////////////////
const int NMAX = 20;
const int MAX = 1200;
const char blank = '0';
const char me = '1';
const char com = '2';class pl {
public:
void sendxy(int &,int &);
void getxy(int,int);
void initscore();
void refreshscore(char,int,int);
void calscore(char);
void solve(int &,int &);
void printmap();
bool isok(int,int);
bool isend(int,int,char);
int getstep();
pl();
private:
int usestep;
int wincount;
char chess[NMAX][NMAX];
int win[2][MAX];
//ps,pt -> me
//cs,ct -> com
int ps[NMAX][NMAX],
cs[NMAX][NMAX];
bool pt[NMAX][NMAX][MAX],
ct[NMAX][NMAX][MAX];
};pl::pl() {
memset(chess,blank,sizeof(chess));
memset(pt,false,sizeof(pt));
memset(ct,false,sizeof(ct));
memset(win,0,sizeof(win));
wincount = 0;
usestep = 0;
initscore();
}void pl::printmap() {
int i,j; for (i=0;i<NMAX;i++) {
printf("\t\t\t%d\t",i);
for (j=0;j<NMAX;j++) {
if (chess[i][j] == me) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwMe);
printf("%s",cir2);
}
else if (chess[i][j] == com) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwCom);
printf("%s",cir2);
}
else printf("%s",rec2);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwWhite);
}
putchar('\n');
}
printf("\n\t\t\t\t");
for (i=0;i<NMAX;i++) printf("%2d",i);
putchar('\n');
}void pl::getxy(int x,int y) {
if (x==-1 && y==-1) return;
refreshscore(com,x,y);
}bool pl::isok(int x,int y) {
return (chess[x][y] == blank);
}bool pl::isend(int x,int y,char who) {
int i,j;
int l,r,u,d,c1,c2,c3,c4;
if (x==-1 && y==-1) return false;
l = r = u = d = 0;
c1 = c2 = c3 = c4 = 0;
for (i=1;i<5 && x+i < NMAX;i++) {
if (who == chess[x+i][y]) u ++;
else break;
}
for (i=1;i<5 && x-i >= 0;i++) {
if (who == chess[x-i][y]) d ++;
else break;
}
for (i=1;i<5 && y+i < NMAX;i++) {
if (who == chess[x][y+i]) r ++;
else break;
}
for (i=1;i<5 && y-i >= 0;i++) {
if (who == chess[x][y-i]) l ++;
else break;
}
for (i=1;i<5 && x+i < NMAX && y+i < NMAX;i++) {
if (who == chess[x+i][y+i]) c1 ++;
else break;
}
for (i=1;i<5 && x+i < NMAX && y-i >= 0;i++) {
if (who == chess[x+i][y-i]) c2 ++;
else break;
}
for (i=1;i<5 && x-i >= 0 && y-i >= 0;i++) {
if (who == chess[x-i][y-i]) c3 ++;
else break;
}
for (i=1;i<5 && x-i >= 0 && y+i < NMAX;i++) {
if (who == chess[x-i][y+i]) c4 ++;
else break;
}
return ( (u+1+d)>=5 || (l+1+r)>=5 || (c1+1+c3)>=5 || (c2+1+c4)>=5 );
}void pl::sendxy(int &x, int &y) {
solve(x,y);
usestep ++;
}//枚舉贏的局面
void pl::initscore() {
int i,j,k;
//豎
for (i=0;i<NMAX;i++) {
for (j=0;j<NMAX-4;j++) {
for (k=0;k<5;k++) pt[j+k][i][wincount] = ct[j+k][i][wincount] = true;
wincount ++;
}
}
//橫
for (i=0;i<NMAX;i++) {
for (j=0;j<NMAX-4;j++) {
for (k=0;k<5;k++) pt[i][j+k][wincount] = ct[i][j+k][wincount] = true;
wincount ++;
}
}
//斜1
for (i=0;i<NMAX-4;i++) {
for (j=0;j<NMAX-4;j++) {
for (k=0;k<5;k++) pt[j+k][i+k][wincount] = ct[j+k][i+k][wincount] = true;
wincount ++;
}
}
//斜2
for (i=0;i<NMAX-4;i++) {
for (j=NMAX-1;j>=4;j--) {
for (k=0;k<5;k++) pt[j-k][i+k][wincount] = ct[j-k][i+k][wincount] = true;
wincount ++;
}
}
}//計算全局位置的分值
void pl::calscore(char who) {
bool (*table)[NMAX][MAX];
int (*score)[NMAX];
int iwho;
if (who == me) {
table = pt;
score = ps;
iwho = 1;
}
else {
table = ct;
score = cs;
iwho = 0;
}
srand(time(NULL));
int i,j,k;
for (i=0;i<NMAX;i++) {
for (j=0;j<NMAX;j++) {
score[i][j] = 0;
if (chess[i][j] == blank) {
for (k=0;k<wincount;k++) {
if (!table[i][j][k]) continue;
//分值的大小影響棋子位置的選擇
srand(rand());
switch (win[iwho][k]) {
case 1:
score[i][j] += 1;
break;
case 2:
score[i][j] += 10;
break;
case 3:
score[i][j] += 100;
break;
case 4:
score[i][j] += 1000;
}
}
}
}
}
}void pl::solve(int &x, int &y) {
calscore(me);
calscore(com);
int i,j;
int me_score,com_score;
int me_x,me_y,com_x,com_y;
me_score = com_score = -1;
//選取我方或對方得分最大值
for (i=0;i<NMAX;i++) {
for (j=0;j<NMAX;j++) {
if (chess[i][j] == blank) {
if (me_score < ps[i][j]) {
me_score = ps[i][j];
me_x = i;
me_y = j;
}
if (com_score < cs[i][j]) {
com_score = cs[i][j];
com_x = i;
com_y = j;
}
}
}
}
if (me_score > com_score) {
x = me_x;
y = me_y;
}
else {
x = com_x;
y = com_y;
}
refreshscore(me,x,y);
}//更新分數
void pl::refreshscore(char who,int x,int y) {
bool (*table)[NMAX][MAX];
bool (*antitable)[NMAX][MAX];
int iwho;
if (who == me) {
table = pt;
antitable = ct;
iwho = 1;
}
else {
table = ct;
antitable = pt;
iwho = 0;
}
chess[x][y] = who;
for (int i=0;i<wincount;i++) {
//一方位置能勝利次數
if (table[x][y][i] && win[iwho][i] < INT_MAX) win[iwho][i] ++;
if (antitable[x][y][i]) {
//另一方無法放置
antitable[x][y][i] = false;
win[1-iwho][i] = INT_MAX;
}
}
}int pl::getstep() {
return usestep;
}

6. 五子棋游戲程序設計(VB)

五子棋的構想 有句話叫「當局者迷,旁觀者清。」,但這句話在由AI所控制的計算機玩家上是不成立的,因為計算機必須知道有那些獲勝方式,並計算出每下一步棋到棋盤上任一格子的獲勝幾率,也就是說,一個完整的五子棋的AI構想必須:

1、能夠知道所有的獲勝組合; 2、建立和使用獲勝表; 3、設定獲勝的分數; 4、使電腦具有攻擊和防守的能力; 一、求五子棋的獲勝組合 在一場五子棋的游戲中,計算機必須要知道有那些的獲勝組合,因此我們必須求得獲勝組合的總數。我們假定當前的棋盤為10*10。 (1)計算水平方向的獲勝組合數,每一列的獲勝組合是:6,共10列,所以水平方向的獲勝組合數為:6*10=60 (2)計算垂直方向的獲勝組合總數,每一行的獲勝組合是:6,共10行,則垂直方向的獲勝組合數為:6*10=60 (3)計算正對角線方向的獲勝組合總數,正對角線上的獲勝組合總數為6+(5+4+3+2+1)*2=36 (4)計算反對角線方向的獲勝組合總數,反對角線上的獲勝組合總數為6+(5+4+3+2+1)*2=36 ,這樣所有的獲勝組合數為:60+60+36+36=192 二、建立和使用獲勝表 我們已經計算出了一個10*10的五子棋盤會有192種獲勝方式,這樣我們可以利用數組建立獲勝表,獲勝表的主要作用是:1,判斷當前的獲勝方式是否有效;2,判斷當前的獲勝方式中到底有多少子落入該獲勝組合中。詳細的使用您將在後面的程序中可以看出。 三,分數的設定 在游戲中為了讓計算機能夠決定下一步最佳的走法,必須先計算出計算機下到棋盤上任一空格的分數,而其中最高分數便是計算機下一步的最佳走法。 原理:我們判定當前討論的空格與當前討論的點有幾種獲勝的方式,有幾種該空格就加幾分。這種原理初聽起來似乎是無法入手,沒關系,當您了解我們後面的程序後您就會明白這種決策原理了。 這種決策有一些缺陷,因為如果只根據這個模型設計,就有可能出現電腦或玩家有三個子連成一線的時候,計算機卻判斷不出,它認為其他某些空格是當前的獲勝的最佳位置而不去攻擊或防守。沒關系我們完全可以通過一個加強演算法來改變當前的分值情況,也就是說當電腦或玩家有三個子或四個子連成一線時,我們通過加強演算法將當前與三個子或四個子有關的空格的分值提高,從而可以彌補這一缺憾。 四、攻擊與防守 以上的方式,事實上計算機只是計算出了最佳的攻擊位置,為了防守我們還應計算當前玩家的最佳的攻擊位置。這樣有什麼用呢?道理很簡單,如果玩家最佳攻擊位置的分數大於計算機最佳攻擊位置上的分數,那麼計算機就將下一步的棋子擺在玩家的最佳攻擊位上以阻止玩家的進攻,否則計算機便將棋子下在自己的最佳攻擊位置上進行攻擊。 事實上,這個AI構想是很強大的如果你不是很厲害的五子棋高手的話,可能很快會被計算機打敗。我在聯眾上可是中級棋手啊,跟這種構想打的時候勝率也不是很高。 使用vb.net編寫五子棋 一、編寫前的准備: 1、用計算機的思想描述整個下棋的過程 考慮步驟: (1)為了簡便我們可以先讓電腦先走第一步棋,電腦每走一步就會封掉許多玩家的獲勝可能情況。 (2)當玩家走棋的時候我們首先應該考慮玩家走棋的合法性。 (3)如果合法,那麼玩家也會封掉許多電腦的獲勝的可能情況。 (4)電腦的思考路徑:首先判斷當前玩家和電腦的所有獲勝組合是否需要進行加強賦值,
是進行加強賦值,否則進行普通的賦值。 (5)比較當前玩家和電腦誰的分值最大。將分值最大的點作為電腦的下一步走法。 2、利用vb.net窗體和圖形工具建立五子棋的棋盤界面 (1)添加一個picturebox控制項 作用:使用picturebox控制項繪制棋子和棋盤 (2)添加一個label控制項 作用:顯示當前的獲勝標志,也就是當某一方獲勝或和棋時顯示此標簽。 (3)添加一個mainmenu控制項 作用:控制游戲的開始或結束 (4)添加一個mediaplay組件 作用:使程序可以播放音樂。 3、設置整體框價 我們採取10*10的棋盤,為主要的平台。利用數組定義整個棋盤桌面,利用數組定義獲勝組合以及獲勝標志等。 二,聲明全局數組和變數 定義虛擬桌面: Dim table(9, 9) As Integer 定義當前玩家桌面空格的分數: Dim pscore(9, 9) As Integer 定義當前電腦桌面空格的分數: Dim cscore(9, 9) As Integer 定義玩家的獲勝組合: Dim pwin(9, 9, 191) As Boolean 定義電腦的獲勝組合: Dim cwin(9, 9, 191) As Boolean 定義玩家的獲勝組合標志: Dim pflag(191) As Boolean 定義電腦的獲勝組合標志:
Dim cflag(191) As Boolean 定義游戲有效標志: Dim theplayflag As Boolean 三、初始化游戲 '*****************************************************************************
'** 模塊名稱: initplayenvironment
'**
'** 描述: 此函數主要功能如下:
'** 1. 設置背景音樂。
'** 2. 設置游戲狀態有效。
'** 3. 初始化游戲狀態標簽。
'** 4. 直接指定電腦的第一步走法。
'** 5. 初始化基本得分桌面。
'** 6. 電腦和玩家獲勝標志初始化。
'** 7. 初始化所有獲勝組合。
'** 8. 重新設定玩家的獲勝標志。
'**
'*****************************************************************************
Sub initplayenvironment()
player.FileName = ".\music\zhyu01.mid"
player.Play()
theplayflag = True
'游戲有效
Label1.Visible = False
'游戲狀態標簽不顯示
PictureBox1.Refresh()
'清空picturebox1的內容
yuandian(130, 130)
'調用繪圖函數繪制當前電腦先走的位置
Dim i, j, m, n As Integer
For i = 0 To 9
For j = 0 To 9
table(i, j) = 0
Next
Next
'桌面初始化
For i = 0 To 191
pflag(i) = True
cflag(i) = True
Next
'獲勝標志初始化
table(4, 4) = 1
'由於我們設定電腦先手,並下了4,4位所以將其值設為1
''' ******** 初始化獲勝組合 ********
n = 0
For i = 0 To 9
For j = 0 To 5
For m = 0 To 4
pwin(j + m, i, n) = True
cwin(j + m, i, n) = True
Next
n = n + 1
Next
Next
For i = 0 To 9
For j = 0 To 5
For m = 0 To 4
pwin(i, j + m, n) = True
cwin(i, j + m, n) = True
Next
n = n + 1
Next
Next
For i = 0 To 5
For j = 0 To 5
For m = 0 To 4
pwin(j + m, i + m, n) = True
cwin(j + m, i + m, n) = True
Next
n = n + 1
Next
Next
For i = 0 To 5
For j = 9 To 4 Step -1
For m = 0 To 4
pwin(j - m, i + m, n) = True
cwin(j - m, i + m, n) = True
Next
n = n + 1
Next
Next
''' ******** 初始化獲勝組合結束 ********
For i = 0 To 191
If pwin(4, 4, i) = True Then
pflag(i) = False
End If
Next
'由於電腦已下了4,4位所以我們需要重新設定玩家的獲勝標志
End Sub
四,處理滑鼠事件 '*****************************************************************************
'** 模塊名稱: themousedown
'**
'** 描述: 此函數主要實行以下功能:
'** 1. 判定當前游戲標志是否有效。
'** 2. 將實際坐標轉化成虛擬坐標。
'** 3. 繪制玩家的棋子。
'** 4. 執行檢查獲勝函數。
'** 5. 執行電腦演算法函數。
'**
'*****************************************************************************
Sub themousedown(ByVal x As Integer, ByVal y As Integer)
If theplayflag = False Then
Exit Sub
End If
'檢查游戲狀態是否有效
Dim i, j As Integer
Dim zhx, zhy As Integer
zhx = Int((x - 10) / 30)
zhy = Int((y - 10) / 30)
For i = 0 To 9
For j = 0 To 9
If table(zhx, zhy) > 0 Then
Exit Sub
End If
Next
Next
'檢查當前滑鼠點擊的格子是否有效
Dim mycolor As Color
Dim g As System.Drawing.Graphics
g = PictureBox1.CreateGraphics
mycolor = Color.White
Dim brush1 As System.Drawing.Brush = New SolidBrush(mycolor)
g.FillEllipse(brush1, zhx * 30 + 10, zhy * 30 + 10, 30, 30)
'繪制玩家的棋子
table(zhx, zhy) = 2
For i = 0 To 191
If cwin(zhx, zhy, i) = True Then
cflag(i) = False
End If
Next
'重設電腦的獲勝標志
checkwin()
'檢查當前玩家是否獲勝
diannao()
'調用電腦演算法
End Sub 五、獲勝檢查演算法。 '*****************************************************************************
'** 模塊名稱: checkwin
'**
'** 描述: 此模塊執行以下功能:
'** 1. 檢查是否和棋。
'** 2. 檢查電腦是否獲勝。
'** 3. 檢查玩家是否獲勝。
'**
'*****************************************************************************
Sub checkwin()
Dim i, j, k, m, n As Integer
Dim ca As Integer
Dim pa As Integer
Dim cnormal As Integer = 0
For i = 0 To 191
If cflag(i) = False Then
cnormal = cnormal + 1
End If
Next
If cnormal = 190 Then
Label1.Visible = True
Label1.Text = "和棋,請重新開始!"
PictureBox1.Refresh()
theplayflag = False
Exit Sub
End If
'設定和棋規則
For i = 0 To 191
If cflag(i) = True Then
ca = 0
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 1 Then
If cwin(j, k, i) = True Then
ca = ca + 1
End If
End If
Next
Next
If ca = 5 Then
Label1.Visible = True
Label1.Text = "電腦獲勝,請重新開始"
PictureBox1.Refresh()
theplayflag = False
Exit Sub
End If
End If
Next
'檢查電腦是否獲勝
For i = 0 To 191
If pflag(i) = True Then
pa = 0
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 2 Then
If pwin(j, k, i) = True Then
pa = pa + 1
End If
End If
Next
Next
If pa = 5 Then
Label1.Visible = True
Label1.Text = "玩家獲勝,請重新開始"
PictureBox1.Refresh()
theplayflag = False
Exit Sub
End If
End If
Next
'檢查玩家是否獲勝
End Sub 六、電腦演算法 '*****************************************************************************
'** 模塊名稱: diannao
'**
'** 描述: 此程序主要執行以下功能:
'** 1. 初始化賦值系統。
'** 2. 賦值加強演算法。
'** 3. 計算電腦和玩家的最佳攻擊位。
'** 4. 比較電腦和玩家的最佳攻擊位並決定電腦的最佳策略。
'** 5. 執行檢查獲勝函數。
'**
'***************************************************************************** Sub diannao()
Dim i, j, k, m, n As Integer
Dim dc As Integer
Dim cab As Integer
Dim pab As Integer
For i = 0 To 9
For j = 0 To 9
pscore(i, j) = 0
cscore(i, j) = 0
Next
Next
'初始化賦值數組
''' ******** 電腦加強演算法 ********
For i = 0 To 191
If cflag(i) = True Then
cab = 0
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 1 Then
If cwin(j, k, i) = True Then
cab = cab + 1
End If
End If
Next
Next
Select Case cab
Case 3
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 0 Then
If cwin(m, n, i) = True Then
cscore(m, n) = cscore(m, n) + 5
End If
End If
Next
Next
Case 4
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 0 Then
If cwin(m, n, i) = True Then
yuandian(m * 30 + 10, n * 30 + 10)
table(m, n) = 1
For dc = 0 To 191
If pwin(m, n, dc) = True Then
pflag(dc) = False
checkwin()
Exit Sub
End If
Next
End If
End If
Next
Next
End Select
End If
Next
For i = 0 To 191
If pflag(i) = True Then
pab = 0
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 2 Then
If pwin(j, k, i) = True Then
pab = pab + 1
End If
End If
Next
Next
Select Case pab
Case 3
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 0 Then
If pwin(m, n, i) = True Then
pscore(m, n) = pscore(m, n) + 30
End If
End If
Next
Next
Case 4
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 0 Then
If pwin(m, n, i) = True Then
yuandian(m * 30 + 10, n * 30 + 10)
table(m, n) = 1
For dc = 0 To 191
If pwin(m, n, dc) = True Then
pflag(dc) = False
checkwin()
Exit Sub
End If
Next
End If
End If
Next
Next
End Select
End If
Next
''' ******** 電腦加強演算法結束 ******** ' ******** 賦值系統 ********
For i = 0 To 191
If cflag(i) = True Then
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 0 Then
If cwin(j, k, i) = True Then
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 1 Then
If cwin(m, n, i) = True Then
cscore(j, k) = cscore(j, k) + 1
End If
End If
Next
Next
End If
End If
Next
Next
End If
Next
For i = 0 To 191
If pflag(i) = True Then
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 0 Then
If pwin(j, k, i) = True Then
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 2 Then
If pwin(m, n, i) = True Then
pscore(j, k) = pscore(j, k) + 1
End If
End If
Next
Next
End If
End If
Next
Next
End If
Next
''' ******** 賦值系統結束 ********
''' ******** 分值比較演算法 ********
Dim a, b, c, d As Integer
Dim cs As Integer = 0
Dim ps As Integer = 0
For i = 0 To 9
For j = 0 To 9
If cscore(i, j) > cs Then
cs = cscore(i, j)
a = i
b = j
End If
Next
Next
For i = 0 To 9
For j = 0 To 9
If pscore(i, j) > ps Then
ps = pscore(i, j)
c = i
d = j
End If
Next
Next
If cs > ps Then
yuandian(a * 30 + 10, b * 30 + 10)
table(a, b) = 1
For i = 0 To 191
If pwin(a, b, i) = True Then
pflag(i) = False
End If
Next
Else
yuandian(c * 30 + 10, d * 30 + 10)
table(c, d) = 1
For i = 0 To 191
If pwin(c, d, i) = True Then
pflag(i) = False
End If
Next
End If
''' ******** 分值比較演算法結束 ********
checkwin()
End Sub 七、繪制棋子 '*****************************************************************************
'** 模塊名稱: yuandian
'**
'** 描述: 此函數主要進行電腦棋子的繪制。
'**
'***************************************************************************** Sub yuandian(ByVal x As Integer, ByVal y As Integer)
Dim mycolor As Color
Dim g As System.Drawing.Graphics
g = PictureBox1.CreateGraphics
Dim zhx, zhy As Integer
zhx = Int((x - 10) / 30)
zhy = Int((y - 10) / 30)
mycolor = Color.Black
Dim brush1 As System.Drawing.Brush = New SolidBrush(mycolor)
g.FillEllipse(brush1, zhx * 30 + 10, zhy * 30 + 10, 30, 30)
End Sub

7. 五子棋的程序設計.

// 程序「五子棋第三方版.exe」運行時,把以前下棋的棋譜保存在「棋譜.txt」文件中,
// 然後調用本程序。
// 本程序的作用是:首先讀入以前的棋譜,然後調用函數「qxwz()」計算出計算機應該
// 下棋的位置,並保存在c中,然後把應下棋的位置寫入文件「當前棋子.txt」
#include <stdio.h>
typedef struct
{
char x;
char y;
} QZ;
QZ qzwz(); //取得應下棋位置,返回值為QZ類型,其中的x,y兩個成員代表應下棋位置
char qp[19][19]; //用於保存棋盤上每個點的狀態,0--空,1--黑棋,2--白棋
void main()
{
FILE *fp;
int tmp1,tmp2,tmp3;
QZ c;
/* 讀入當前棋譜 */
if((fp=fopen("棋譜.txt","r"))==NULL)
{
printf("[棋譜.TXT]文件打開失敗!\n");
return;
}
while(!feof(fp))
{
tmp1=tmp2=tmp3=-1;
fscanf(fp,"%d%d%d",&tmp1,&tmp2,&tmp3);
if(tmp3!=-1)
{
qp[tmp1][tmp2]=tmp3;
}
}
fclose(fp);
c=qzwz();
if((fp=fopen("當前棋子.txt","w"))==NULL)
{
printf("[當前棋子.TXT]文件打開失敗!\n");
return;
}
fprintf(fp,"%d,%d,%d",c.x,c.y,2); //將應下棋位置傳送到文件中
fclose(fp);
}

QZ qzwz()
{
(把這裡面的程序補充完整就好了)

} 這個程序要求是:
1。只適用於人先下,機器後下的情況。有了「五子棋第三方版.exe」來製作下棋界面,就只需要編寫下棋演算法,而不必考慮其它的問題了。
2.當運行「五子棋第三方版.exe」程序時,該程序接受人下棋位置,然後調用「wzq.exe」程序,由「wzq.exe」程序計算出機器的應對並寫入到「當前棋子.txt」文件中(結束),機器的應對結果由「五子棋第三方版.exe」負責讀入,並等待人下一步的應對。
3.要做的工作就是,完成「wzq.cpp」 中「qxwz()」函數的設計,使之能返回一個比較好的下棋位置。在設計過程中,可以增加全局變數以保存你認為有必要保存的數據,可以增加其它文件,用來保存你認為下次調用還有必要使用的數據,可以增加其它函數以方便下棋位置的計算過程。總之,所給出的「wzq.cpp」程序只是一個框架,在不影響其功能的情況下,可以隨意更改。

8. 跪求五子棋的編程和流程圖

關鍵詞:五子棋;極大極小值;剪枝;演算法改進 近來隨著計算機的快速發展,各種棋類游戲被紛紛請進了電腦,使得那些喜愛下棋,又常常苦於沒有對手的棋迷們能隨時過足棋癮。而且這類軟體個個水平頗高,大有與人腦分庭抗禮之勢。其中戰勝過國際象棋世界冠軍-卡斯帕羅夫的「深藍」便是最具說服力的代表;其它像圍棋的「手淡」、象棋的「將族」等也以其優秀的人工智慧深受棋迷喜愛;而我們今天將向大家介紹的是五子棋的演算法。 當我們與電腦對戰時,您知道這些軟體是怎樣象人腦一樣進行思考的嗎?在這里就以此為例和大家一起探討探討。 為了使讀者對五子棋搜索復雜度有個形象的認識,舉一個中國象棋跟五子棋搜索次數的比較(如圖)。可以看出同中國象棋相比,五子棋的分支系數大的多,而且勝負條件判斷也復雜一些。在極大的分支系數下,搜索程序的最大搜索深度增加1層,耗費的運算時間都將大量增加。因此設計出一個有效的搜索演算法是非常重要的。 中國象棋 五子棋 棋子種類 14 2 棋盤大小 9×10 15×15 分支系數 約40 約200 棋子數量 遞減 遞增 勝負條件 某方將帥喪失 某方五個棋子連成一線 文章的組織如下:首先簡單介紹用C語言作圖的基本方法(Turbo C 2.0環境)以及主循環控制下棋模塊,其次介紹設計這個五子棋程序的數據結構,然後介紹了評分演算法以及勝負判斷,最後重點討論實現搜索演算法。 1. 基本的C作圖方法及主循環控制模塊 Turbo C提供了非常豐富的圖形函數,所有的圖形函數的原型均建立在graphics.h中,在使用圖形函數時要確保有顯示器圖形驅動程序*.BGI,同時將集成開發環境Options/Linker中的Graphics lib選為on,只有這樣才能保證正確使用圖形函數。 這個程序調用一個EGA、VGA顯示器下能獨立圖形運行的函數。所謂獨立圖形運行程序,就是在編譯和連接時將相應的驅動程序(*.BGI)直接裝入到執行程序,從而能在獨立的計算機上運行,避免需要重新編譯連接才能運行(請查閱參考書1以及源碼)。Turbo C進行畫點、畫線、封閉圖形填充以及圖形下文本輸出只需要調用graphics.h中相關的函數。 主循環控制模塊:控制下棋順序,當輪到某方下子時,負責將程序轉到相應的模塊中去,主要擔當一個調度者的角色。這個五子棋程序是用鍵盤控制下棋,所以要用到Turbo C中的bios.h。在一個循環塊中等待鍵盤信息,判斷鍵盤所輸入的信息是否需要響應,調用相關的代碼進行下棋(參考源碼中的main函數部分)。 2. 五子棋基本數據結構 為整個棋盤建立一張表格用以記錄棋子信息,使用一個15*15的二維數組 chessman[15][15] (15*15是五子棋棋盤的大小),數組的每一個元素對應棋盤上的一個交叉點,用「0」表示空位、「1」代表己方棋子、「2」代表對方棋子。這張表也是今後分析的基礎。其次要建立一個結構,主要用於搜索過程中,定義如下: typedef struct five_chess* point; struct five_chess{ int x; int y; int layer; int value; int score; int chess[LENGTH][LENGTH]; int record[LENGTH][LENGTH]; }; x,y表示在某個位置上擴展出來的新節點,layer是表示第幾層擴展,用於控制擴展深度。value表示該點上極大極小值,score表示葉子節點的得分,用於推算父輩節點的value,chess這個二維數組表示擴展出來的棋盤信息,record記錄在x、y點上擴展過的節點,如果沒有擴展record中對應某個值為0。如果record中沒有可以擴展的節點,那麼該層擴展結束,返回一個特定值。 數組和一個結構構成了程序的基本數據骨架,今後只要再加入一些輔助變數便可以應付自如了。 3. 評分規則以及勝負判斷 評估一個棋盤的分數,主要通過掃描整個棋盤,對每個點評分。對某個點上評分從四個方向(角度分別為0、45、90、135的四個方向)分別統計,進而累積該

9. 五子棋軟體設計

/*********************************************************************************
加分才能得到更多的回答呀!
游戲說明
1.本五子棋規則遵循一般五子棋游戲規則。
2.'W',',S','A','D'分別對應與游標的上、下、左、右。「Enter」為落子鍵.且在
游戲當中雙方必須分時復用。
3.本代碼在Turboc 2.0 SMALL模式下調試通過。
4.如果要單獨運行該代碼生成的EXE文件,請確保Turboc 2.0系統自帶的*.BGI與
該EXE在同一目錄下,以便圖形系統的正常運行。
*********************************************************************************/
#include <graphics.h>
#include <stdio.h>
#include <dos.h>
/*******************************全程變數****************************************/
#define HORIZON 150
#define VERTICAL 30
#define MAXX 15
#define MAXY 15

int curx=HORIZON,cury=VERTICAL;
char C='';
int AOrB=0;
int state[MAXY][MAXX]; /*state[][]為紅白方狀態:1為紅方,2為白方.*/
/*******************************************************************************/
struct Offset
{
int abs;
int array;
int offset;
int state;
};
struct XYPoint
{
int x;
int y;
};
struct WinPoint
{
struct XYPoint pointXY[5];
char win;
};
char getkey()
{
union REGS regs;
regs.h.ah=0;
return int86(0x16,®s,®s);
}
void DrawRectangle(int color)
{
int tmpcolor=0,i=0;
tmpcolor=getcolor();
setcolor(color);
for(i=0;i<16;i++)
line(20,190+i,100,190+i);
setcolor(tmpcolor);
}
void PutCharADSW(char ch)
{
setcolor(WHITE);
outtextxy(20,50,"W");
outtextxy(20,80,"S");
outtextxy(20,110,"A");
outtextxy(20,140,"D");

setcolor(LIGHTBLUE);
switch(ch)
{
case 'A':
case 'a':
outtextxy(20,110,"A");
break;
case 'D':
case 'd':
outtextxy(20,140,"D");
break;
case 'S':
case 's':
outtextxy(20,80,"S");
break;
case 'W':
case 'w':
outtextxy(20,50,"W");
break;
}
}
void InterFace(void)
{
int i;
char *tp=NULL;

tp="W: up";
outtextxy(20,50,tp);

tp="S: down";
outtextxy(20,80,tp);

tp="A: left";
outtextxy(20,110,tp);

tp="D: Right";
outtextxy(20,140,tp);

tp="Current:";
outtextxy(20,170,tp);
DrawRectangle(WHITE);
for(i=0;i<MAXX;i++)
line(HORIZON,i*30+VERTICAL,HORIZON+420,i*30+VERTICAL);
for(i=0;i<MAXY;i++)
line(HORIZON+i*30,VERTICAL,HORIZON+i*30,420+VERTICAL);
}
void DrawCircle(int x,int y,int radius,int colour)
{
int i;

setcolor(colour);
for(i=0;i<radius;i++)
circle(x,y,i);
}
void DrawLine(int x,int y,int xx,int yy,int col)
{
int tmpcolour=0;
tmpcolour=getcolor();
setcolor(col);
line(x,y,xx,yy);
setcolor(tmpcolour);
}
void SetCursor(int x1,int y1,int col)
{
DrawLine(curx-14+x1,cury-14+y1,curx-4+x1,cury-14+y1,col);
DrawLine(curx+4+x1,cury-14+y1,curx+14+x1,cury-14+y1,col);
DrawLine(curx-14+x1,cury-14+y1,curx-14+x1,cury-4+y1,col);
DrawLine(curx+14+x1,cury-14+y1,curx+14+x1,cury-4+y1,col);

DrawLine(curx-14+x1,cury+14+y1,curx-4+x1,cury+14+y1,col);
DrawLine(curx+4+x1,cury+14+y1,curx+14+x1,cury+14+y1,col);
DrawLine(curx-14+x1,cury+4+y1,curx-14+x1,cury+14+y1,col);
DrawLine(curx+14+x1,cury+4+y1,curx+14+x1,cury+14+y1,col);
}
/*struct Offset
{
int abs; curx,cury
int array; x,y
int offset; x1,y1
int state; 0表示:無空位;1表示:有空位
};*/
/*Test Vertical*/
/*Test x Y Or N Space*/
int TestxYOrNSpace(int y)
{
int i=0,sum=1;
for(i=0;i<MAXY;i++)
{
sum&=(1==state[i][y]||2==state[i][y]);
if(!sum)break;
}
return(sum);
/*sum==0表示該行列沒有空位*/
}
/*Go Left*/
struct Offset * TestMoveCursorLeft(int y,struct Offset * pointer)
{
int i=0,sum=1;
for(i=y-1;i>=0;i--)
{
sum=TestxYOrNSpace(i);
if(!sum)break;
}
if(sum)
{/*表示該點左邊已沒有空位*/
pointer->abs=0;
pointer->array=0;
pointer->offset=0;
pointer->state=0;/*若為0,表示無空位*/
}
else
{
pointer->abs=(30)*(y-i);
pointer->array=y-i;
pointer->offset=(30)*(y-i);
pointer->state=1;/*若為1,表示有空位*/
}
return(pointer);
}
/*Go Right*/
struct Offset * TestMoveCursorRight(int y,struct Offset * pointer)
{
int i=0,sum=1;
for(i=y+1;i<MAXX;i++)
{
sum=TestxYOrNSpace(i);
if(!sum)break;
}
if(sum)
{
pointer->abs=0;
pointer->array=0;
pointer->offset=0;
pointer->state=0;/*若為0,表示無空位*/
}
else
{
pointer->abs=(30)*(i-y);
pointer->array=i-y;
pointer->offset=(30)*(i-y);
pointer->state=1;/*若為1,表示有空位*/
}
return(pointer);
}
/*Test y Y Or N Space*/
int TestyYOrNSpace(int x)
{
int i=0,sum=1;
for(i=0;i<MAXX;i++)
{
sum&=(1==state[x][i]||2==state[x][i]);
if(!sum)break;
}
return(sum);
}
/*Go Up*/
struct Offset * TestMoveCursorUp(int x,struct Offset * pointer)
{
int i=0,sum=1;
for(i=x-1;i>=0;i--)
{
sum=TestyYOrNSpace(i);
if(!sum)break;
}
if(sum)
{
pointer->abs=0;
pointer->array=0;
pointer->offset=0;
pointer->state=0;/*若為0,表示無空位*/
}
else
{
pointer->abs=(30)*(x-i);
pointer->array=x-i;
pointer->offset=(30)*(x-i);
pointer->state=1;/*若為1,表示有空位*/
}
return(pointer);
}
/*Go Down*/
struct Offset * TestMoveCursorDown(int x,struct Offset * pointer)
{
int i=0,sum=1;
for(i=x+1;i<MAXY;i++)
{
sum=TestyYOrNSpace(i);
if(!sum)break;
}
if(sum)
{
pointer->abs=0;
pointer->array=0;
pointer->offset=0;
pointer->state=0;/*若為0,表示無空位*/
}
else
{
pointer->abs=(30)*(i-x);
pointer->array=i-x;
pointer->offset=(30)*(i-x);
pointer->state=1;/*若為1,表示有空位*/
}
return(pointer);
}
void ClearPoint(struct Offset * pointer)
{
pointer->abs=0;
pointer->array=0;
pointer->offset=0;
pointer->state=0;
}
void Delay(int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<32767;j++);
}
/*Move Cursor*/
void MoveCursor(struct XYPoint *PointXY)
{
int x1=0,y1=0,lop=1,x=0,y=0; /*x1,y1為游標在各方向的偏移量*/

struct Offset InfoOffset,*point=NULL;
point=&InfoOffset;
ClearPoint(point);

x=(curx-HORIZON)/30; /*(x,y)為STATE[][]數組坐標*/
y=(cury-VERTICAL)/30;
while(lop)
{
C=getkey();
switch(C)
{
case 'A':
case 'a':
PutCharADSW(C);
if(curx>HORIZON)
{
point=TestMoveCursorLeft(x,point);
if(point->state)
{
curx-=point->abs;
x-=point->array;
x1+=point->offset;

ClearPoint(point);
}
}
break;
case 'D':
case 'd':
PutCharADSW(C);
if(curx<420+HORIZON)
{
point=TestMoveCursorRight(x,point);
if(point->state)
{
curx+=point->abs;
x+=point->array;
x1-=point->offset;

ClearPoint(point);
}
}
break;
case 'W':
case 'w':
PutCharADSW(C);
if(cury>VERTICAL)
{
point=TestMoveCursorUp(y,point);
if(point->state)
{
cury-=point->abs;
y-=point->array;
y1+=point->offset;

ClearPoint(point);
}
}
break;
case 'S':
case 's':
PutCharADSW(C);
if(cury<VERTICAL+420)
{
point=TestMoveCursorDown(y,point);
if(point->state)
{
cury+=point->abs;
y+=point->array;
y1-=point->offset;
ClearPoint(point);
}
}
break;
case 13 : /*落子:AOrB==0 RED;AOrB==1 WHITE*/
if(!(state[y][x]&0x3))
{
if(1==AOrB)
{
state[y][x]|=0x1;
DrawCircle(curx,cury,15,RED);
AOrB=0;
DrawRectangle(WHITE);
}
else
{
state[y][x]|=0x2;
DrawCircle(curx,cury,15,WHITE);
AOrB=1;
DrawRectangle(RED);
}
lop=0;
PointXY->x=x;
PointXY->y=y;
}
break;
}
SetCursor(x1,y1,getbkcolor()); /*clear old*/
x1=0;
y1=0;
SetCursor(0,0,BLUE);
}
}
/*Example: MoveCircle(60+cou*30,20,'H',30,WHITE);*/
void MoveCircle(int x,int y,char way,int offset,int colour)
{
int tmp=0;
for(tmp=0;tmp<15;tmp++)
DrawCircle(x,y,15,getbkcolor());
DrawLine(x-15,y,x+15,y,WHITE);
DrawLine(x,y,x,y+15,WHITE);

switch(way)
{
case 'h':
case 'H':
DrawCircle(x+offset,y,15,colour);
break;
case 'v':
case 'V':
DrawCircle(x,y+offset,15,colour);
}
}
void DrawRLine(int x,int y)
{
if(x> HORIZON)
DrawLine(x-15,y,x,y,WHITE); /*Left*/
if(x<30*14+HORIZON)
DrawLine(x,y,x+15,y,WHITE); /*Right*/
if(y>VERTICAL)
DrawLine(x,y-15,x,y,WHITE); /*Up*/
if(y<30*14+VERTICAL)
DrawLine(x,y,x,y+15,WHITE); /*Down*/
}
void FlashCircle(struct WinPoint win)
{
int i=0,color=0,count=0,EXIT=0;
/*DrawCircle(curx,cury,15,RED)*/
switch(AOrB)
{
case 0: /*AOrB==0 RED*/
color=RED;
break;
case 1: /*AOrB==1 WHITE*/
color=WHITE;
break;
}
while(1)
{
if(count)
{
DrawCircle(HORIZON+30*win.pointXY[0].x,VERTICAL+30*win.pointXY[0].y,15,getbkcolor());
DrawRLine( HORIZON+30*win.pointXY[0].x,VERTICAL+30*win.pointXY[0].y);
DrawCircle(HORIZON+30*win.pointXY[1].x,VERTICAL+30*win.pointXY[1].y,15,getbkcolor());
DrawRLine( HORIZON+30*win.pointXY[1].x,VERTICAL+30*win.pointXY[1].y);
DrawCircle(HORIZON+30*win.pointXY[2].x,VERTICAL+30*win.pointXY[2].y,15,getbkcolor());
DrawRLine( HORIZON+30*win.pointXY[2].x,VERTICAL+30*win.pointXY[2].y);
DrawCircle(HORIZON+30*win.pointXY[3].x,VERTICAL+30*win.pointXY[3].y,15,getbkcolor());
DrawRLine( HORIZON+30*win.pointXY[3].x,VERTICAL+30*win.pointXY[3].y);
DrawCircle(HORIZON+30*win.pointXY[4].x,VERTICAL+30*win.pointXY[4].y,15,getbkcolor());
DrawRLine( HORIZON+30*win.pointXY[4].x,VERTICAL+30*win.pointXY[4].y);
}
else
{
DrawCircle(HORIZON+30*win.pointXY[0].x,VERTICAL+30*win.pointXY[0].y,15,color);
DrawCircle(HORIZON+30*win.pointXY[1].x,VERTICAL+30*win.pointXY[1].y,15,color);
DrawCircle(HORIZON+30*win.pointXY[2].x,VERTICAL+30*win.pointXY[2].y,15,color);
DrawCircle(HORIZON+30*win.pointXY[3].x,VERTICAL+30*win.pointXY[3].y,15,color);
DrawCircle(HORIZON+30*win.pointXY[4].x,VERTICAL+30*win.pointXY[4].y,15,color);
}
Delay(1000);
if(5==i)
{
i=0;
if(count)
count=0;
else
count=1;
}
i++;
EXIT++;
if(105==EXIT)break;
}
}
void InitializationState(int pointer[MAXY][MAXX])
{
int i,j;
for(i=0;i<MAXY;i++)
for(j=0;j<MAXX;j++)
{
*(*(pointer+i)+j)=0;
}
}
/*Test WIN*/
struct WinPoint TestWIN(int Tmp,struct WinPoint TmpWinPoint,struct XYPoint * PointXY)
{
int i=0,j=0,s=Tmp;

TmpWinPoint.win=0;
for(i=0;i<5;i++)
{
if(PointXY->x+i>=4 && PointXY->x+i <15)
{
for(Tmp=s,j=4;j>=0;j--)/*0度*/
{
TmpWinPoint.pointXY[j].x=PointXY->x+i-j;
TmpWinPoint.pointXY[j].y=PointXY->y;
Tmp&=state[PointXY->y][PointXY->x+i-j];
}
if(Tmp)
{
TmpWinPoint.win=1;
break;
}
}
if(PointXY->x-i>=0 && PointXY->x-i <11 && PointXY->y+i>=4 && PointXY->y+i <15)
{
for(Tmp=s,j=4;j>=0;j--)/*45度*/
{
TmpWinPoint.pointXY[j].x=PointXY->x-i+j;
TmpWinPoint.pointXY[j].y=PointXY->y+i-j;
Tmp&=state[PointXY->y+i-j][PointXY->x-i+j];
/*printf(" %d",state[PointXY->y+i-j][PointXY->x+i+j]);*/
}
if(Tmp)
{
TmpWinPoint.win=1;
break;
}
}
if(PointXY->y+i>=4 && PointXY->y+i <15)
{
for(Tmp=s,j=4;j>=0;j--)/*90度*/
{
TmpWinPoint.pointXY[j].x=PointXY->x;
TmpWinPoint.pointXY[j].y=PointXY->y+i-j;
Tmp&=state[PointXY->y+i-j][PointXY->x];
}
if(Tmp)
{
TmpWinPoint.win=1;
break;
}
}
if(PointXY->x+i>=4 && PointXY->x+i <15 && PointXY->y+i>=4 && PointXY->y+i <15)
{
for(Tmp=s,j=4;j>=0;j--)/*135度*/
{
TmpWinPoint.pointXY[j].x=PointXY->x+i-j;
TmpWinPoint.pointXY[j].y=PointXY->y+i-j;
Tmp&=state[PointXY->y+i-j][PointXY->x+i-j];
}
if(Tmp)
{
TmpWinPoint.win=1;
break;
}
}
}
return(TmpWinPoint);
}
/*Test Win Y or N*/
struct WinPoint Test_Win_YorN(struct XYPoint * PointXY)
{
struct WinPoint TmpWinPoint;

TmpWinPoint.win=0;
switch(AOrB)
{
case 0: /*AOrB==0 RED*/
TmpWinPoint=TestWIN(1,TmpWinPoint,PointXY);
break;
case 1: /*AOrB==1 WHITE*/
TmpWinPoint=TestWIN(2,TmpWinPoint,PointXY);
break;
}
return(TmpWinPoint);
}
main()
{
int driver,mode,NoWiner=1;
struct XYPoint CurrentXY;
struct WinPoint WIN;
START:
driver=DETECT;
mode=0;
detectgraph(&driver,&mode);
initgraph(&driver,&mode,"");

InterFace();
InitializationState(state);
CurrentXY.x=0;
CurrentXY.y=0;

SetCursor(0,0,BLUE);

while(NoWiner)
{
MoveCursor(&CurrentXY);
WIN=Test_Win_YorN(&CurrentXY);
if(WIN.win)break;
}
FlashCircle(WIN);
setcolor(WHITE);
outtextxy(280,215,"CONTINUE ?[Y/N]");
C=getkey();
if('Y'==C ||'y'==C)
{
C='';
goto START;
}
}

熱點內容
美發店認證 發布:2021-03-16 21:43:38 瀏覽:443
物業糾紛原因 發布:2021-03-16 21:42:46 瀏覽:474
全國著名不孕不育醫院 發布:2021-03-16 21:42:24 瀏覽:679
知名明星確診 發布:2021-03-16 21:42:04 瀏覽:14
ipad大專有用嗎 發布:2021-03-16 21:40:58 瀏覽:670
公務員協議班值得嗎 發布:2021-03-16 21:40:00 瀏覽:21
知名書店品牌 發布:2021-03-16 21:39:09 瀏覽:949
q雷授權碼在哪裡買 發布:2021-03-16 21:38:44 瀏覽:852
圖書天貓轉讓 發布:2021-03-16 21:38:26 瀏覽:707
寶寶水杯品牌 發布:2021-03-16 21:35:56 瀏覽:837