五子棋人机对战设计任务书

五子棋人机对战设计任务书
五子棋人机对战设计任务书

五子棋人机对战设计任务书

目录

1.系统需求分析 (1)

2.总体设计 (1)

3.详细设计 (2)

4.系统调试 (4)

5.使用说明 (5)

6.编程体会 (6)

7.源程序清单 (7)

1.系统需求分析

五子棋是我国古代传统的黑白棋种之一,又称作连珠棋。五子棋游戏首先需要棋盘,并绘制棋子,若希望人机对战还要为计算机设置一定的算法,以使其能够自动判断落棋的位置,此外,还需要有一定的判断系统来判定胜负,还有悔棋功能。综上,五子棋人机对战游戏需要提供以下功能:(1)使用图形界面,绘制棋盘,并能够提供虚拟棋盘来作为计算机运算的依据。

(2)判断玩家的落子位置,并相应的画出对应颜色的棋子,判断落子位置时误差要很小。另外,需要记录玩家的落子情况。

(3)通过运算判定电脑的落子位置,如防范玩家连成五子,或进攻使自己连成五子取得胜利,并相应的显示对应颜色的棋子。另外,需要记录电脑的落子情况。

(4)根据规则判断出胜负,先连成五子者获得胜利,并显示出胜利的一方,之后可以按任意键再来一局。

(5)当玩家落棋出现重大失误时,可进行悔棋,清除棋子。

2.总体设计

五子棋人机对战游戏包括四个方面的功能,分别是绘制棋盘和棋子等图形化显示功能,获取玩家落子功能,计算并判断得到电脑落子位置的功能以及判断胜负的功能。

图形化显示功能方面,运用easyx图形库进行图形的绘制,可以进行背景色的设置,线条的绘制,文字的显示和字体的设置。通过initgraph初始化界面,设置坐标,用setbkcolor函数设置背景色,用settextcolor函数设置文本颜色,用settextstyle函数设置文本字体,用outtextxy函数显示文字,

用line和fillcircle函数进行棋盘的绘制,用fillcircle函数进行棋子的绘制。通过HWND句柄可以弹出选项框。建立二维数组作为虚拟棋盘。

玩家落子方面,首先需要判断鼠标所点击的位置,然后需要在链表上建立新的节点,在虚拟棋盘上设置玩家落子,并在棋盘上绘制出玩家的棋子。

电脑落子方面,需要遍历所有位置,分别对玩家在该处落子和电脑在该处落子进行评分,找出玩家或电脑落子评分最高的位置作为落子的位置,在虚拟棋盘上落子,并在棋盘上绘制出电脑的棋子。

判定胜负功能方面,在玩家及电脑每次落子之后,都通过调用判定函数来判断某一方是否连成五子,若一方胜利,显示游戏结果,跳出当前棋局的循环,并按任意键重新布置棋盘,开始新的一局。

悔棋方面,需要沿着链表的结构进行前一步棋子的清除。

五子棋游戏中的功能模块图:

3.详细设计

五子棋人机对战程序中的类的层次图为:

五子棋人机对战游戏中各功能模块的实现:

1.布置棋盘模块

2.

3.电脑落子模块

4.判定胜负模块

5.悔棋模块

五子棋人机对战游戏中六个类的UML图:

4.系统调试

由于使用了图形界面,很多功能的调试只能在程序基本编译完成后进行。对于棋盘等方面的调试,我是先将程序写为两个玩家的对战进行调试,开始的错误主要是语法错误,例如两次声明全局数组extern int a[16][16],却没有对其进行定义,导致了LNK2001错误。另外的一个错误是电脑自动先下时,未将数组坐标转化为图形界面上的坐标,使得棋子所在的位置与其应当出现的位置出现了较大的偏差。

接下来的调试主要是算法方面的调试。开始时,电脑下棋会出现一些致命的错误,例如:玩家执白旗,电脑执黑棋,玩家已在c8,d9,e10连成三珠,但电脑下棋时去选择了f4的位置,而不是b7或f11来堵住玩家,从而导致电脑输下此局,根据这个情况,我判断是f4左上方三颗棋子影响了电脑的判断,另外d4到f4处还可形成进攻,因而修改程序的过程中,我增大了连成三珠且两边没有另一方棋子堵住情况的权重。经过修改,电脑下棋便不再犯这样的低级错误,但不得不说,电脑下棋的方式也变得比之前保守。

此外,之前还出现过电脑没有注意边界,而依然在边界处下棋企图连成三子的情况,为此,我在程序中另加了判断语句,若连接的棋子数目小于5且一边已到达边界,则不在边界处着棋,另外如果对方棋子已在距边界小于等于五的距离处将该方向堵住,也扣除一定的权重。经过上述的处理,最佳落棋处的分数会比那些受限制的落棋处的分数高,而不是因为可能的分数相同而造成电脑判断的失误。

在进行悔棋功能的调试时,我先是处理了循环结构造成的问题,然后在棋盘上清除棋子图案的程序经过了两三次的修改,终于使得棋子的图案完全被清除。此外在悔棋直到没有棋子时,刚开始的时候程序会发生崩溃,原因是我没有添加头指针是否为空的判断,添加该判断后,棋盘上没有棋子时不再发生变化。

5.使用说明

启动游戏后,首先会进入开始界面。

此时按任意键(指键盘)即可进入游戏。

进入游戏后首先需要选择是否让电脑先下,另外,游戏中永远是玩家执白棋,电脑执黑棋,游戏中没有禁手的规则。

游戏的窗口大小不能改变,故高度较小、屏幕较小的电脑需要调节分辨率来显示全部的棋盘,否则可能有一部分棋盘(一半是棋盘的最下方)在屏幕中无法显示。若想要棋盘显示完全,请保证屏幕的竖直方向像素至少为800,水平方向的像素至少为900.

点击确定电脑先下,点击取消则玩家先下。电脑先下时,会自动选择天元的位置。

玩家获得胜利或电脑胜利时时,棋盘的上方会出现玩家胜利或玩家失利的的信息。

此时按任意键(键盘)可以重新布置棋盘,开始新的一局。

请注意,下棋时鼠标是有一定的点击范围的,起一定要点击到交点的中央区域附近,否则程序不会认为玩家已下棋,也不会在玩家认为自己下过棋的地方显示棋子,故一定要点击准确,下棋前一定要三思,点击一定要准确。

此外,游戏设置了悔棋功能,点击右键即可悔棋。

若希望结束游戏,直接点击右上方的关闭按钮关闭程序即可退出游戏。

此外,游戏编译通过是建立在有easyx C++图形库的基础上。故而没有安装easyx图形库的情况下,头文件graphics.h中是没有相关函数的,会使编译不通过。程序在VS2008下编译成功。

6.编程体会

这是我第一次应用图形界面编程,通过这个游戏程序的编写,我初步了解了MFC,easyx等图形化编程的工具,并初步学会使用easyx C++图形库进行编程。

除了图形界面编程,此程序中还应用了构造函数的重载,类的继承与抽象基类,动态内存分配与链表结构的建立等知识。这个程序中包含六个类,其中玩家棋子类与电脑棋子类属性与方法相似,通过棋子基类进行派生,各个类的功能分配等方面比我之前的编程也更加明晰。使用链表结构使得每一步棋间都通过链表进行了关联,既贴合实际,也是程序进一步完善的需要。通过链表的结构,每一步棋都可以追溯到上一步棋,通过为玩家和电脑双方各建立一个链表,方便了悔棋功能的设置。使用链表的同时还进行内存的动态分配,每一次添加棋子都通过调用list类的添加函数,使得主程序更加简洁。

判断胜负与对电脑应该下的位置进行打分通过两个函数实现。判断胜负的函数较简单,只需对当前所下位置处各个方向的连珠情况进行比较,返回游戏是否结束或某一方获胜的结果即可。难点在于计算机下棋算法的设计,在给计算机下棋的位置进行评估时,需要考虑四个方向,还需考虑一些其他的情况,想得越周到便意味着计算机算法越完善,同时还需要由不同的方面根据不同的情况对某一位置赋予不同的分数,分数的确定也是一个困难所在。在我的算法中,更多的考虑的是如何让电脑避免失败,同时也有一定的进攻能力。对每一位置程序都会对电脑下在该处和玩家下在该处同时进行评分,然后选择分数最高处,这样玩家最有威胁的位置和电脑最有威胁的位置都在程序的考虑之内。在这个评分函数中,取的是四个方向中的最大值,这样的设置虽然在一定程度上能够实现不同方向上的综合考虑(在某一方向评分已经较高的情况下还有另一方向评分更高,当然是一个好位置),但是还不足,因为有些位置落棋后可能对多个方向都有好处,此时仅仅取其中的最高值当然是不够的,可以在函数中增加其他方向加分

的功能,但这对分数权重的分配和细节考虑上无疑有更高的要求,否则可能会导致多方向的小利战胜了某一方向上的大利,直接影响电脑的输赢。这是我的程序还需完善的地方。

总之,这个程序满足了五子棋人机对战游戏的基本要求,同时也可以被改编为双人对战游戏。游戏还有添加功能的空间,算法也可以更加完善。以此作为我应用程序编程、电脑算法及图形界面编程的初步尝试。

7.源程序清单

1.chessboard.h文件

#include

#include

#include

usingnamespace std;

class chessboard

{

public:

chessboard(); //开始界面

void initboard(); //布置棋盘

};

2.chessboard.cpp文件

#include"chessboard.h"

chessboard::chessboard() //开始界面

{

initgraph(900,800); //初始化为横向个点,纵向个点

setbkcolor(WHITE);

cleardevice();

settextcolor(RED);

settextstyle(60, 0, _T("楷体"));

outtextxy(220, 100, _T("五子棋人机对战"));

settextstyle(30, 0, _T("宋体"));

outtextxy(300,300,_T("按任意键开始游戏"));

getch();

}

void chessboard::initboard()

{

int i;

initgraph(900,800);

setbkcolor(BROWN);

cleardevice(); //清除屏幕和图形缓冲区settextcolor(RED);

settextstyle(120, 0, _T("隶书"));

outtextxy(780, 80, _T("五"));

outtextxy(780, 200, _T("子"));

outtextxy(780, 320, _T("棋"));

settextstyle(30,0, _T("楷体"));

outtextxy(780,500,_T("按右键"));

outtextxy(800,530,_T("悔棋"));

for(i=50;i<=750;i=i+50) //绘制棋盘

{

setlinecolor(BLACK);

line(50,i,750,i);

line(i,50,i,750);

}

setfillcolor(BLACK); //绘制天元和星

fillcircle(200,200,4);

fillcircle(200,600,4);

fillcircle(600,200,4);

fillcircle(600,600,4);

fillcircle(400,400,4);

}

3.piece.h文件

#include

#include

usingnamespace std;

class piece //棋子基类

{

public:

piece();

virtual ~piece();

int getx();

int gety();

virtualvoid print() const=0; //绘制棋子函数

protected:

int x; //棋盘上的坐标

int y;

};

class piece_player:public piece //玩家棋子类

{

public:

piece_player();

piece_player(int,int);

virtual ~piece_player();

virtualvoid print() const; //绘制玩家棋子函数

piece_player *p_next; //链表结构

};

class piece_computer:public piece //电脑棋子类

{

public:

piece_computer();

piece_computer(int,int);

virtual ~piece_computer();

virtualvoid print() const; //绘制电脑棋子

piece_computer *c_next;

};

class player_list //玩家棋子链表

{

public:

player_list();

~player_list();

bool insert(int,int); //插入节点函数

bool Delete(int a[16][16]);

protected:

piece_player *p_head;

};

class computer_list //电脑棋子链表

{

public:

computer_list();

~computer_list();

bool insert(int,int); //插入节点函数

bool Delete(int a[16][16]);

protected:

piece_computer *c_head;

};

externint judge(int,int,int,int a[][16]); //判定胜负函数externint score(int,int,int,int a[][16]); //打分函数4.FiveChess.cpp文件

#include"piece.h"

piece::piece()

{

x=0;

y=0;

}

piece::~piece(){}

int piece::getx()

{

return x;

}

int piece::gety()

{

return y;

}

piece_player::piece_player()

{

x=0;

y=0;

}

piece_player::piece_player(int a, int b)

{

x=a;

y=b;

p_next=NULL;

}

piece_player::~piece_player(){}

void piece_player::print() const

{

setfillcolor(WHITE); //画一个白色的棋子fillcircle(x,y,20);

}

piece_computer::piece_computer()

{

x=0;

y=0;

}

piece_computer::piece_computer(int a, int b)

{

x=a;

y=b;

c_next=NULL;

}

piece_computer::~piece_computer(){}

void piece_computer::print() const

{

setfillcolor(BLACK); //画一个黑色的棋子

fillcircle(x,y,20);

}

player_list::player_list()

{

p_head=NULL;

}

player_list::~player_list()

{

piece_player *p=p_head; //链表析构函数,直到所有节点都被清除for(;p!=NULL;)

{

p_head=p->p_next;

delete p;

p=p_head;

}

}

bool player_list::insert(int a, int b) //插入新的节点

{

piece_player *ptemp=new piece_player(a,b);

if(ptemp==NULL)

returnfalse;

ptemp->p_next=p_head;

p_head=ptemp;

ptemp->print();

returntrue;

}

bool player_list::Delete(int a[16][16])

{

int x,y;

if(p_head==NULL)

returnfalse;

piece_player *p;

x=p_head->getx();

y=p_head->gety();

a[x/50][y/50]=0;

setfillcolor(BROWN);

fillcircle(x,y,20);

setcolor(BROWN);

circle(x,y,20);

setcolor(BLACK);

line(x-20,y,x+20,y);

line(x,y-20,x,y+20);

p=p_head->p_next;

delete p_head;

p_head=p;

returntrue;

}

computer_list::computer_list()

{

c_head=NULL;

}

computer_list::~computer_list()

{

piece_computer *p=c_head;

for(;p!=NULL;)

{

c_head=p->c_next;

delete p;

p=c_head;

}

}

bool computer_list::insert(int a, int b)

{

piece_computer *ctemp=new piece_computer(a,b);

if(ctemp==NULL)

returnfalse;

ctemp->c_next=c_head;

c_head=ctemp;

ctemp->print();

returntrue;

}

bool computer_list::Delete(int a[16][16])

{

int x,y;

if(c_head==NULL)

returnfalse;

piece_computer *p;

x=c_head->getx();

y=c_head->gety();

a[x/50][y/50]=0;

setfillcolor(BROWN);

fillcircle(x,y,20);

setcolor(BROWN);

circle(x,y,20);

setcolor(BLACK);

line(x-20,y,x+20,y);

line(x,y-20,x,y+20);

p=c_head->c_next;

delete c_head;

c_head=p;

returntrue;

}

externint a[16][16];

externint judge(int x,int y,int s,int a[][16])

{

int i,j; //坐标

int p,q; //记录连珠数

int vertical,horizon,rincline,lincline; //记录四个方向的连珠数

for(i=x,p=0;(i

{

if(a[i][y]!=s)

break;

else

p++;

}

for(i=x-1,q=0;(i>x-5)&&(i>0);i--)

{

if(a[i][y]!=s)

break;

else

q++;

}

horizon=p+q;

for(j=y,p=0;(j

{

if(a[x][j]!=s)

break;

else

p++;

}

for(j=y-1,q=0;(j>y-5)&&(j>0);j--)

{

if(a[x][j]!=s)

break;

else

q++;

}

vertical=p+q;

for(i=x,j=y,p=0;(i

{

if(a[i][j]!=s)

break;

else

p++;

}

for(i=x-1,j=y-1,q=0;(i>x-5)&&(j>y-5)&&(i>0)&&(j>0);i--,j--)

{

if(a[i][j]!=s)

break;

else

q++;

}

rincline=p+q;

for(i=x,j=y,p=0;(i>x-5)&&(j0)&&(j<16);i--,j++) //左斜方向连珠数

{

if(a[i][j]!=s)

break;

else

p++;

}

for(i=x+1,j=y-1,q=0;(iy-5)&&(i<16)&&(j>0);i++,j--)

{

if(a[i][j]!=s)

break;

else

q++;

}

lincline=p+q;

if((vertical>=5)||(horizon>=5)||(rincline>=5)||(lincline>=5)) //判断某一方是否胜利

{

if(s==1)

return 1;

elseif(s==2)

return 2;

else

return 0;

}

elsereturn 0;

}

externint score (int m,int n,int s,int a[][16]) //打分函数

{

int i1,j1,i2,j2; //坐标记录

int i;

int p=0,q=0; //计算连子数

int score[4]={0,0,0,0}; //记录四个方向的一串连子的两头的情况,是否被另一方堵上

int x=0; //分数

int vertical,horizon,lincline,rincline; //四个方向的连子数for(i1=m;(i1

{

if(a[i1][n]!=s)

{

if(a[i1][n]==0) score[0]++;

elseif(i1<=5) //棋盘大小限制

score[0]--;

break;

else

p++;

}

for(i2=m-1;(i2>m-5)&&(i2>0);i2--)

{

if(a[i2][n]!=s)

{

if(a[i2][n]==0) score[0]++;

elseif(i2>=10) //棋盘大小限制

score[0]=0;

break;

}

else

q++;

}

horizon=p+q;

if((horizon<=4)&&((m==1)||(m==15))) //棋盘边界位置score[0]=0;

if((horizon>=4)&&(a[i2][n]==0)&&(a[i1][n]==0)) //防止四连珠或形成四连珠{

if(s==2)

score[3]+=3;

score[3]+=2;

}

for(j1=n,p=0;(j1

{

if(a[m][j1]!=s)

{

if(a[m][j1]==0)

score[1]++;

elseif(j1<=5)

score[1]--;

break;

}

else

p++;

}

for(j2=n-1,q=0;(j2>n-5)&&(j2>0);j2--)

{

if(a[m][j2]!=s)

if(a[m][j2]==0)

score[1]++;

elseif(j2>=10)

score[1]--;

break;

}

else

q++;

}

vertical=p+q;

if((vertical<=4)&&((n==1)||(n==15)))

score[1]=0;

if((vertical>=4)&&(a[m][j2]==0)&&(a[m][j1]==0))

{

if(s==2)

score[1]+=3;

score[1]+=2;

}

for(i1=m,j1=n,p=0;(i1<16)&&(i1

if(a[i1][j1]!=s)

{

if(a[i1][j1]==0) //

{

score[2]++;

}

elseif(i1<=5)

score[2]--;

break;

}

else

p++;

}

for(i2=m-1,j2=n-1,q=0;(i2>0)&&(i2>m-5)&&(j2>0);i2--,j2--) {

if(a[i2][j2]!=s)

{

if(a[i2][j2]==0)

{

score[2]++;

}

elseif(i2>=10)

score[2]--;

break;

}

else

q++;

}

rincline=p+q;

if((rincline<=4)&&((n==1)||(n==15)||(m==1)||(m==15))) score[2]=0;

if((rincline>=4)&&(a[i2][j2]==0)&&(a[i1][j1]==0))

{

if(s==2)

score[2]+=3;

score[2]+=2;

}

for(i1=m,j1=n,p=0;(i1>0)&&(i1>m-5)&&(j1<16);i1--,j1++) {

if(a[i1][j1]!=s)

{

if(a[i1][j1]==0)

score[3]++;

elseif(j1<=5)

score[3]--;

break;

}

else

p++;

}

for(i2=m+1,j2=n-1,q=0;(i2<16)&&(i20);i2++,j2--) {

if(a[i2][j2]!=s)

{

if(a[i2][j2]==0)

score[3]++;

elseif(j2>=10)

score[3]--;

break;

}

else

q++;

}

lincline=p+q;

if((lincline<=4)&&((n==1)||(n==15)||(m==1)||(m==15)))

score[3]=0;

if((lincline>=4)&&(a[i2][j2]==0)&&(a[i1][j1]==0))

{

if(s==2)

score[3]+=3;

score[3]+=2;

}

if(horizon>4||vertical>4||lincline>4||rincline>4)

x=100;

else

{

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

{

if(score[i]<=0)

score[i]=-20;

}

x=horizon+score[0];

if(vertical+score[1]>x)

x=vertical+score[1];

if(lincline+score[2]>x)

x=lincline+score[2];

if(rincline+score[3]>x)

x=rincline+score[3];

}

return x; //返回最大的分数

}

5.main.cpp文件

#include"chessboard.h"

#include"piece.h"

int a[16][16]; //15*15棋盘,只用至的数组

int main()

{

chessboard board1;

MOUSEMSG m;

int i,j; //棋盘数组坐标

bool p=0; //记录player是否下过

int score_player[16][16],score_computer[16][16]; //判断电脑的落子处

int score_max; //记录打分的最大值

int max_x,max_y; //记录打分最大值的坐标

int x;

while(1)

{

board1.initboard();

player_list *player=new player_list; //建立玩家链表

computer_list *computer=new computer_list; //建立电脑链表

for(i=1;i<16;i++) //初始化棋盘,代表没有棋子,代表player,代表computer

for(j=1;j<16;j++)

a[i][j]=0;

HWND wnd=GetHWnd(); //获取玩家选择

if (MessageBox(wnd, _T("大神,您要让电脑先下吗?"), _T("选项"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)

{

i=8;

j=8;

a[i][j]=2;

computer->insert(i*50,j*50); //点击确定,电脑先下

}

while(1)

{

while(p==0)

{

m=GetMouseMsg(); //获取玩家落子位置

switch(m.uMsg)

{

case WM_LBUTTONDOWN:

{

for(i=50;i<=750;i=i+50)

{

for(j=50;j<=750;j=j+50)

{

if((m.xi-10)&&(m.yj-10)&&(a[i/50][j/50]==0)) //

判断是否能下及下好位置

{

player->insert(i,j);

p=1;

a[i/50][j/50]=1;

break;

}

五子棋游戏设计方案

目录 一、摘要: (1) 二、关键字: (1) 三、程序主流程图 (2) 四、需求分析: (3) 五、关键部分设计算法及实现: (4) 六、文件清单: (9) 七、使用说明: (9) 八、参考书目: (10) 九、附录:(源代码清单) (11) 五子棋程序 一、摘要:

五子棋游戏是一历史悠久,对抗性强,技巧性高的棋类游戏。本文用VC 设计了五子棋游戏。并就以下问题进行了探讨: (1)棋子棋盘在程序中的表示; (2)如何通过鼠标点击落子; (3)如何判断输赢,在棋盘的—,|,/,\,四个方向进行搜索,超过5子以上连成一线则认为赢了。 (4)如何实现梅棋功能。 (5)如何保存并读入棋谱; (6)如何让电脑拥有人类的智慧; (7)编写软件代码应遵守的编写规范,成对编码原则和代码的注释; (8)其它未详尽处,请参看源代码。 二、关键字: 棋盘数组 搜索算法 人工智能 活 半活 双活三

三、程序主要类结构图

CfiveStoneApp

四、需求分析: 五子棋历史源远流长,发展形势喜人,以下在网络上一篇有关五子棋历史发展的报道: 五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“連珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。?五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。? 五子棋起源于古代中国,发展于日本,风靡于欧洲。对于它与围棋的关系有两种说法,一说早于围棋,早在“尧造围棋”之前,民间就已有五子棋游戏;一说源于围棋,是围棋发展的一个分支。在中国的文化里,倍受人们的青睐。古代的五子棋的棋具与围棋相同,纵横各十七道。五子棋大约随围棋一起在我国南北朝时先后传入朝鲜、日本等地。据日本史料文献介绍,中国古代的五子棋是经由高丽(朝鲜),于1688年至1704年的日本元禄时代传到日本的。到日本明治32年(公元1899年),经过公开征名,“连珠”这一名称才被正式确定下来,取意于“日月如合壁,五星如连珠”。从此,连珠活动经过了不断的改良,主要是规则的变化(即对执黑棋一方的限制),例如,1899年规定,禁止黑白双方走“双三”;1903年规定,只禁止黑方走“双三”;1912年规定,黑方被迫走“双三”亦算输;1916年规定,黑方不许走“长连”;1918年规定,黑方不许走“四、三、三”;1931年规定,黑方不许走“双四”,并规定将19×19的围棋盘改为15×15的连珠专用棋盘。本世纪初五子棋传入欧洲并迅速风靡全欧。通过一系列的变化,使五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际比赛棋。? 目前,职业连珠已迅速在国际上发展起来。1988年8月8日,国际连珠联盟(RIF)由日本、俄罗斯、瑞典、亚美尼亚、阿塞拜疆、爱沙尼亚、法国、拉脱维亚、白俄罗斯等9个成员国在瑞典宣告创立,我国于1996年正式加入国际连珠联盟,现在全世界已有47个国家和地区成为国际连珠联盟的正式会员。职业连珠的世界锦标赛从1989年起每两年举办一次,现已举办了六届,第三、五、六届的冠军是爱沙尼亚人,其余三届的冠军都是日本人。我国最好成绩是团体第七,个人张进宇第9名。就水平而言,目前以俄罗斯、日本、瑞典最强,其中日本研究也最深,我国只处于中等水平。日本拥有自己的五子棋职业棋手,并且对连珠技术的研究也相当普遍和全面。日本每年举行连珠名人战。? 五子棋的根在中国,有着广泛的群众基础。但与世界先进的五子棋技术相比,我们的棋艺水平还很低,所以我们要推广五子棋,宣传五子棋,争取在较短的时间内赶上和超过世界五子棋坛的先进水平。1990年,由那威和十几名五子棋爱好者,共同发起并成立了中国第一个现代职业五子棋的民间组织----京都五子棋队,现已发展成为拥有百余名选手的北京京都五子棋队。日本连珠联盟曾多次派代表团访问中国,与中国广大爱好者进行交流和友谊比赛,瑞典连珠联盟也于1995年派代表团访问了中国,京都五子棋队曾两次选派选手代表中国参加世界杯比赛,取得此成绩反映了我国五子棋水平在世界上所处的位置,同时也显示了我国在此项运动中的发展潜力。1997年5月北京成功地举办了第一届“康柏杯”

Java五子棋游戏源代码(人机对战)

//Java编程:五子棋游戏源代码 import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; import java.io.PrintStream; import javax.swing.JComponent; import javax.swing.JPanel; /* *main方法创建了ChessFrame类的一个实例对象(cf), *并启动屏幕显示显示该实例对象。 **/ public class FiveChessAppletDemo { public static void main(String args[]){ ChessFrame cf = new ChessFrame(); cf.show(); } } /* *类ChessFrame主要功能是创建五子棋游戏主窗体和菜单**/ class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"20x15","30x20","40x30"}; private String[] strmode={"人机对弈","人人对弈"}; public static boolean iscomputer=true,checkcomputer=true; private int width,height; private ChessModel cm; private MainPanel mp; //构造五子棋游戏的主窗体 public ChessFrame() { this.setTitle("五子棋游戏"); cm=new ChessModel(1); mp=new MainPanel(cm); Container con=this.getContentPane(); con.add(mp,"Center"); this.setResizable(false); this.addWindowListener(new ChessWindowEvent()); MapSize(20,15); JMenuBar mbar = new JMenuBar(); this.setJMenuBar(mbar); JMenu gameMenu = new JMenu("游戏");

基于JAVA的五子棋游戏系统设计与实现

基于JAVA的五子棋游戏系统设计与实 现

基于JAVA的五子棋游戏系统设计与实现专业电子信息工程 学生董永杰 指导教师曾玉

摘要 当前,随着计算机网络的的发展,以计算机技术和网络技术为核心的现代网络技术已经在现实生活和生产中得到了广泛的使用,已经成为多数人群的休闲方式,也为多数人所喜好。当然,为了满足没有网络同样能娱乐的要求,许多小游戏做成了单机和网络的双功能。 本软件使用JAVA语户端之间的连接,利用多线程技术言实现,经过对图形界面,绘图,布局管理器等去构造出游戏的单机功能,在此基础上,利用SCOKET的知识,建立起服务器与客来处理服务器端与客户端之间的数据传输,通信问题,使得客户端和服务器端之间能够同步的进行处理。 经过对软件的编写,更深入的理解了面向对象的概念,也体会到利用面向对象语言处理一些问题的优势。同时也加深了对多线程,流套接字等高级技术的理解。 关键词:多线程;流套接字;数据传输;同步。

ABSTRACT At present, With the rapid development of computer network. Taking computer technology and the network technology as the core, modern network technology is already used in the real life and the production and already became the leisure mode of the most people. And most people like them. Of course, it’s a pity that there still have some clients lacking of network because of various causes. In order to satisfy the above clients’ requirements. A large number of games ,usually nam ed as “small games” by players, are designed for involving two kinds of different function. The former game is often played by these players whose computers never connect with the network. It’s called for stand-alone version games. Just as its name implies, the later is named as online version games This software implemented with JAVA language, and according to the understanding of SCOKET ,GUI and paint image ichnology. Established in these foundation , the server co ects with the multi- client, and transmission the information between many clients using the multi-thread proceeding technology. it is very convenient for both client and server to do the synchronous processing. Through to the software compilation, deepen understanding and grasp to the technology above understanding and holding.

五子棋c课程设计

目录第一章:课程设计目的和要求 (2) 1.1数据结构课程设计的目的 (2) 1.2数据结构课程设计实现的要求 (2) 第二章:课程设计任务内容 (3) 2.1五子棋对弈系统 (3) 第三章:详细设计说明 (4) 3.1功能设计 (4) 3.2五子棋对弈系统流程图 (4) 3.3软件中实现各项功能的函数与程序代码 (5) 第四章:程序运行环境说明 (10) 4.1程序运行环境说明及出现的问题 (10) 4.2运行结果 (10) 第五章:课程设计心得与体会 (14) 附录 (15) 源程序: (16) 五子棋 第一章课程设计目的和要求 1.1数据结构课程设计的目的 进一步培养结构化程序设计的思想,加深对高级系统语言基本语言要素和控制结构的理解,针对数据结构中的重点和难点内容进

行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。 此课程设计着眼于知识的运用,把平常学的知识运用到课程实践中来,本身就是考察我们知识运用能力。要求熟悉运用一些编程软件,对我们所学的理论知识进一步的深化。 1.2数据结构课程设计实现的要求 使用C++语言编写一个基于控制台的简单程序,使学生掌握简单的程序设计技巧。同时设计一个简单的五子棋对弈系统,可以实现五子棋的基本功能,是一款娱乐用的小型程序。 第二章课程设计任务内容 2.1五子棋对弈系统 设计一个五子棋系统程序,实现对五子棋进行运行。 基本要求:五子棋是有两个人在一盘棋上进行对抗的竞技活动。在对局开始时,先由用户选择哪方开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围交叉点上落子,如此轮流落子,知道某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方程就算获胜。 此时算法结束,当有任何一方退时出,都可在算法中实现。 第三章详细设计说明 3.1功能设计 (1)由两个玩家分别下棋,当某一玩家五子相连,则赢。

基于JAVA的五子棋游戏系统设计与实现

基于JA V A的五子棋游戏系统设计与实现专业电子信息工程 学生董永杰 指导教师曾玉

摘要 目前,随着计算机网络的的发展,以计算机技术和网络技术为核心的现代网络技术已经在现实生活和生产中得到了广泛的使用,已经成为多数人群的休闲方式,也为多数人所喜好。当然,为了满足没有网络同样能娱乐的要求,许多小游戏做成了单机和网络的双功能。 本软件使用JAVA语户端之间的连接,利用多线程技术言实现,通过对图形界面,绘图,布局管理器等去构造出游戏的单机功能,在此基础上,利用SCOKET 的知识,建立起服务器与客来处理服务器端与客户端之间的数据传输,通信问题,使得客户端和服务器端之间能够同步的进行处理。 通过对软件的编写,更深入的理解了面向对象的概念,也体会到利用面向对象语言处理一些问题的优势。同时也加深了对多线程,流套接字等高级技术的理解。 关键词:多线程;流套接字;数据传输;同步。

ABSTRACT ABSTRACT At present, With the rapid development of computer network. Taking computer technology and the network technology as the core, modern network technology is already used in the real life and the production and already became the leisure mode of the most peo ple. And most people like them. Of course, it’s a pity that there still have some clients lacking of network because of various causes. In order to satisfy the above clients’ requirements. A large number of games ,usually named as “small games” by players, are designed for involving two kinds of different function. The former game is often played by these players whose computers never connect with the network. It’s called for stand-alone version games. Just as its name implies, the later is named as online version games This software implemented with JAVA language, and according to the understanding of SCOKET ,GUI and paint image ichnology. Established in these foundation , the server co ects with the multi- client, and transmission the information between many clients using the multi-thread proceeding technology. it is very convenient for both client and server to do the synchronous processing. Through to the software compilation, deepen understanding and grasp to the technology above understanding and holding. Key Words: multiple thread, Socket, transmission-data, synchronism.

五子棋贪心算法

五子棋人机对战算法 采用的是贪心算法 每一步扫描一下棋盘上未有子的地方 我假定落下一个子,我去判断一下这个子,如果是我方的话会几连,如果是对方的话会是几连,如果我方的子多,落子,如果对方的子多我去堵他。 总的来说,要让电脑知道该在哪一点下子,就要根据盘面的形势,为每 一可能落子的点计算其重要程度,也就是当这子落下后会形成什么棋型(如:“冲四”、“活三”等),然后通览 全盘选出最重要的一点,这便是最基本的算法。当然,仅靠当前盘面进行判定是远远不够的,这样下棋很轻易掉进 玩家设下的陷阱,因为它没有考虑以后的变化。所以在此基础上我们加入递归调用,即:在电脑中猜测出今后几步 的各种走法,以便作出最佳选择,这也是我们下棋时常说的“想了几步”。如此一来您的程序便具有一定的水平了。 什么?不信!过来试试吧! 总体思路弄清之后,下面进行具体讨论: 一:数据结构 先来看看数据结构,我们需要哪些变量? 首先得为整个棋盘建立一张表格用以记录棋子信息,我们使用一个15*15的二维数组Table[15][15] (15*15是 五子棋棋盘的大小),数组的每一个元素对应棋盘上的一个交叉点,用…0?表示空位、…1?代表己方的子、…2? 代表对方的子;这张表也是今后分析的基础。 在此之后还要为电脑和玩家双方各建立一张棋型表Computer[15][15][4]和 Player[15][15][4],用来存放棋型 数据,就是刚才所说的重要程度,比如用…20?代表“冲四”的点,用…15?代表“活三”的点,那么在计算重要 性时,就可以根据20>15得出前者比后者重要,下子时电脑便会自动选择“冲四”的点。那为什么棋型表要使用三 维数组呢?因为棋盘上的每一个点都可以与横、竖、左斜、右斜四个方向的棋子构成不同的棋型,所以一个点总共 有4个记录;这样做的另一个好处是可以轻易判定出复合棋型,例如:假如同一点上有2个…15?就是双三、有一个…15?和一个…20?就是四三。 怎么样!3个数组构成了程序的基本数据骨架,今后只要再加入一些辅助变量便可以应付自如了。应该不会太 难吧?OK!有了这么多有用的数据,我们就可以深入到程序的流程中去了。 二:程序流程 我们主要讨论五子棋的核心算法,即:人工智能部分,而其他像图形显示、键盘鼠标控制等,因较为简单,所 以就不作过多介绍了。 我们看到本程序由六个基本功能模块构成,各模块的具体分析如下:

五子棋游戏程序的设计报告

计算机学院网络工程专业《程序设计综合课程设计》报告(2011/2012学年第一学期) 学生姓名: 学生班级:网络工程 学生学号: 指导教师: 2011年12月30日

双人五子

棋 目录 第一章课程设计目的和要求 (1) 1.1课程设计的目的 (1) 1.2课程设计的要求 (1) 第二章课程设计任务内容 (2) 2.1课程设计的主要内容 (2) 2.2系统设计原则 (2) 第三章设计说明 (3) 3.1游戏分析和介绍 (3) 3.1.1游戏分析 (3)

3.1.2游戏介绍 (3) 3.2重点模块说明 (3) 3.2.1棋盘界面Showboard() (3) 3.2.2下棋Play() (4) 3.2.3覆盖棋盘Recoverboard() (7) 3.2.4游戏结束后初始化棋盘Unitboard() (7) 3.2.5保存棋盘CopyB() (8) 3.3函数清单 (8) 3.4接口 (9) 第四章软件使用说明 (10) 4.1测试 (10) 4.2限制条件 (13) 第五章课程设计心得体会 (14) 附录一程序流程图 (15) 附录二程序代码 (16) 附录三参考文献 (26) 第一章课程设计目的和要求 1.1课程设计的目

1,学习综合运用C语言课程和其他相关课程的知识,提高分析解决实际问题的能力,进一步巩固、加深和拓宽所学的知识,进一步加强结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解。 2,全面系统的学习面向对象程序设计的基本概念、基本语法和编程方法,与同学合作设计整套程序,并且独立完成一定工作量的程序设计. 3,掌握程序设计中的常用算法和C语言的程序技巧,培养良好的程序设计风格。 4,运用所学的知识了解五子棋游戏的制作结构,将所学的知识运用于实践中。 1.2课程设计的要求 1,与同学合作设计、编制、调试出一款双人五子棋游戏,并单独完成其中一定量的函数模块。 2,要求该游戏具有趣味性和可操作性,能够正常运行。其中用到C++语言中的各种语句、结构。(如其中需要注意全局变量和局部变量的申明,数组的使用等) 3,双人五子棋要求能够进入欢迎界面,二人对弈,当有五颗同色棋子相连时,判断出输赢等一系列游戏流程。

五子棋游戏总体设计与实现

五子棋游戏总体设 计与实现

4.系统总体设计与实现 4.1 总体设计分析 总体设计是软件开发过程中的另一个重要阶段,在这一阶段中将根据需求分析中提出的逻辑模型,科学合理地进行物理模型的设计。这个阶段的主要目标是将反映用户信息需求的逻辑方案转换成物理方案,并为下一阶段提供必要的技术资料。 4.1.1 总体设计原则 (1)整体性:软件是作为统一整体而存在的。因此,在总体设计中要从整个软件的角度进行考虑。 (2)灵活性:为保持软件长久的生命力,要求该手机游戏软件具有很强的环境适应性。为此,游戏软件应具有较好的开放性和结构的可变性。 (3)可靠性:可靠性是指软件抵御外界干扰的能力及受外界干扰时的恢复能力。 (4)经济性:经济性是指在满足游戏软件需求的前提下,尽可能地减小游戏软件的开销。 4.1.2 软件模块总体设计 软件中各模块之间的关系一般利用层次图来表示。它是一种一系列多层次的用树形结构的矩形框描绘数据的层次结构框图。

一个单独的矩形框作为树形结构的顶层,各个数据的子集由下面的各层矩形框代表,最底层的各个矩形框代表组成这个数据的实际数据元素(不能再分割的元素),它代表完整的数据结构。这模式非常适合于需求分析阶段的需要,层次方框图对数据结构描绘随着结构精细化也越来越详细。重复细化沿着图中每条路径,从对顶层信息的分类开始,直到确定了数据结构的全部细节为止。 图4-1 游戏功能结构 本研究中将游戏软件分为三大模块,如图4-1所示,包括:游戏选项、游戏设置和帮助。按照在调研中搜集的资料对每个模块的功能进行编排制作。依据上述功能的分析,本研究中,将游

戏软件在三大模块的基础上又对每一大模块又分为几个子模块:游戏选项包括六个模块:开始游戏、重新游戏、悔棋、认输、背景音乐和退出游戏。 游戏设置包括三个模块:先后手设置、棋盘底纹颜色设置和棋盘大小设置。 帮助包括两个模块:游戏帮助和关于。 4.2 游戏设计 4.2.1 游戏前的准备 本游戏在开发之前需要做一些前期准备工作,特别是对于精通五子棋游戏的Java 游戏开发者来说。一般情况下,一款运用起来比较熟练地J2ME 开发工具是必不可少的。本游戏使用的是J2ME的简化开发工具Sun Java (TM) Wireless Toolkit 2.5.2 for CLDC,她需先将Java虚拟机安装调试好之后才能使用。WTK 2.5.2 不带有文本编辑功能,因此需要另寻搭配使用。本游戏采用Ultra Edit 进行编辑。本游戏需要几张后缀名为.png格式的卡通图,除了一张用作五子棋游戏的 Logo 外,其余的都将在游戏中使用。4.2.2 游戏界面和事件驱动设计 游戏的界面设计采取传统游戏界面风格,如图4-2所示。游戏设计中采用传统界面游戏风格,首先启动游戏,然后进入游戏开始界面,界面中放置“设置”、“开局”、“帮助”、“关

课程设计报告--c++课程设计五子棋游戏

徐州师范大学物电学院课程设计报告 课程名称:计算机程序设计实训 题目:五子棋 专业班级: 09物41 学生姓名:高乐莲 学生学号: xxxx ___________ 日期: 2011.12.24 指导教师:赵纪平 物电学院教务部印制

说明: 1、报告中的第一、二、三项由学生在课程设计开始前填写,由指导教师指 导并确认签字。 2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩,并 填写成绩评定表。 3、所有学生必须参加课程设计的答辩环节,凡不参加答辩者,其成绩一律 按不及格处理。答辩小组成员应由2人及以上教师组成。答辩后学生根据答辩情况填写答辩记录表。 4、报告正文字数一般应不少于3000字,也可由指导教师根据本门课程设 计的情况另行规定。 5、平时表现成绩低于6分的学生,取消答辩资格,其该课程设计成绩按不 及格处理。 6、课程设计完成后,由指导教师根据完成情况写出总结。 7、此表格式为徐州师范大学物理与电子工程学院提供的基本格式,指导教 师可根据本门课程设计的特点及内容做适当的调整。

指导教师签字: 年月日

目录 摘要...................................................................................................II Abstract................................................................................................ II 1 绪论 (1) 1.1 课题背景 (1) 1.2 课程设计的目的 (1) 2 设计方案简述 (2) 2.1 可行性分析 (2) 2.2 需求分析 (2) 3 详细设计 (3) 3.1窗体设计 (3) 3.2游戏项目开发 (5) 3.2.1棋牌设置 (5) 3.2.2放置棋子功能的开发 (6) 3.3.3游戏获胜决断的开发 (12) 3.2.4游戏的调试与运行 (20) 4 设计结果及分析 (22) 4.1 程序的结果 (22) 4.2结果分析 (23) 5总结 (24) 参考文献 (25)

(完整word版)五子棋教学设计

第1课五子棋入门(1)一、教学目标: 1、掌握五子棋的简易规则; 2、了解五子棋的发展概况; 3、掌握五子棋单一棋形的形态。 二、教学重点:五子棋单一棋形的形态;三、教学难点: 五子棋单一棋形的形态;四、教学课时:1课时; 五、教学准备:棋具,五子棋发展的发展概况;六、教学过程: 1.点名,并安排座位;(10分钟) 2.自我介绍,简介五子棋的简易规则及发展概况;(5分钟) 3.讲解五子棋单一棋形的形态(15-20分钟) 1)导入: 五子棋,非常简单,直线连成五个子就赢了!如下图: 五个子自然是来自于四个,所以要先形成活四!如下图: 如图,所谓活四,即你现在执白无论防在这四个子的哪一头,黑方都可以下一步在另一头连成五个! 如此可见,活四的时候已经无法防守,而活四,显然也是从三个子而来,所以如果要想形成活四,必须先有活三! 上图,这里黑棋在两边任意一边只要再落一子即可形成活四!

上图:这个是跳活三,黑棋在中间落一子即可形成活四! 由此看到,活三如果不理会,下一步即可形成活四胜,所以活三的时候另一方需要阻拦进行防守! 而活三自然也是由二个子形成,即活二! 上图:这3个活二都可以形成活三,下节将详细论述!现在请建立概念: 五子棋:连成五个子之前必形成活四。 活四:能够必定连五的四活三:能够形成活四的三 活二:能够形成活三的二 2)二的分类:活二的形式:根据上节,我们认识到如果要想赢棋,活二是个基本元 素!现在详细介绍一下活二! ①、活二:即可以形成活三的二!有三种形式:连活二 此种活二可以选择形成两种活三中的任意一种!如下图 其中连活二在形成活三时可选择的点,如下图:(字母标注) 跳活二

五子棋AI算法的改进方法

又是本人一份人工智能作业……首先道歉,从Word贴到Livewrter,好多格式没了,也没做代码高亮……大家凑活着看……想做个好的人机对弈的五子棋,可以说需要考虑的问题还是很多的,我们将制作拥有强大AI五子棋的过程分为十四步,让我来步步介绍。 第一步,了解禁手规则 做一个五子棋的程序,自然对五子棋需要有足够的了解,现在默认大家现在和我研究五子棋之前了解是一样多的。以这个为基础,介绍多数人不大熟悉的方面。五子棋的规则实际上有两种:有禁手和无禁手。由于无禁手的规则比较简单,因此被更多人所接受。其实,对于专业下五子棋的人来说,有禁手才是规则。所以,这里先对“有禁手”进行一下简单介绍: 五子棋中“先手必胜”已经得到了论证,类似“花月定式”和“浦月定式”,很多先手必胜下法虽然需要大量的记忆,但高手确能做到必胜。所以五子棋的规则进行了优化,得到了“有禁手”五子棋。五子棋中,黑棋必然先行。因此“有禁手”五子棋竞技中对黑棋有以下“禁手”限制:“三三禁”:黑棋下子位置同时形成两个以上的三;“四四禁”:黑棋下子位置同时形成两个以上的四;“长连禁”:六子以上的黑棋连成一线。黑棋如下出“禁手“则马上输掉棋局。不过如果“连五”与“禁手”同时出现这时“禁手”是无效的。所以对于黑棋只有冲四活三(后面会有解释)是无解局面。反观白棋则多了一种获胜方式,那就是逼迫黑棋必定要下在禁点。 为了迎合所有玩家,五子棋自然需要做出两个版本,或者是可以进行禁手上的控制。 第二步,实现游戏界面 这里,我制作了一个简单的界面,但是,对于人机对弈来说,绝对够用。和很多网上的精美界面相比,我的界面也许略显粗糙,但,开发速度较高,仅用了不到半天时间。下面我们简单看下界面的做法。 界面我采用了WPF,表现层和逻辑层完全分开,前台基本可以通过拖拽完成布局,这里就不做过多介绍。根据界面截图简单介绍

五子棋游戏实验报告

五子棋游戏实验报告 课程名称计算机程序设计(VB) 学号______________________ 姓名______________________ 班级______________________ 提交时间 五子棋软件设计 一、实验目的 1?通过五子棋软件设计或者自拟题目设计,巩固本课程所学的各个章节重点知识,自拟题目的同学需尽早向教师提岀自己的想法及设计方案。 2?通过开发一个较大的系统,增强软件开发能力。 3?通过调试系统,增强逻辑思维能力。 二、实验内容 1.基本要求: (1)输入两个对手名字,然后进入游戏界面。 (2)用鼠标点击的方式在棋盘上摆放棋子,黑白交替。(棋盘15*15 ) (3)可以悔棋。 (4)五子连在一起的时候能判断胜利,并且显示出胜利者的名字。 (5)能够将棋局的结果保存,保存该棋局

结束的状态、对手名字、棋局名字(棋局名字在保存时由用户在相应的界面下添入)(此功能要求用数据库和文件两种技术实现)。

因为棋盘上空点居多,大部分点的信息为0,因此只需保存有棋子的点的信息 用文件技术进行棋局保存,思路相同。 (7)五子棋恢复棋局 思路:首先从数据库文件中找到要恢复棋局的数据(即曾经保存的数据),然后把这些数据赋值给内存中相应的数组或者变量中,按照这些数据重新绘制棋盘和棋子,即完成了对棋局的恢复。 窗体启动事件应该完成的事情: 组合框中应该显示曾经保存的棋局名。因为每次保存棋局时,都是将棋局所有棋子的记录添加在表的最 后,因此表中关于棋局名的记录只能是类似于aaabbbbccccc的形式,而不可能是abbcacc的形式,根据 这个特点编程序取出表中不同的棋局名。 具体算法: 用一个字符串变量strfile初始值为空,从表的顶端向下依次移动记录指针,如果当前记录的棋局名字段和strfile不相等,说明进入另一个棋局的记录中,将该棋局记录的棋局名赋值给strfile,并加入到组合 框中,一直到表中最后一个记录 因为要从数据库中取岀相关数据到a数组中,因此要将a数组所有数据清零。 要建立一个data控件,与数据库连接起来,而后识别棋局(即表中的棋局名字段与在列表框中选择的棋 局名比较),将数据库该棋局中所有信息都赋值给a数组及相关变量。 刚才仅仅是数据的恢复,即将数据库中已经保存过的数据恢复到内存中,下一步应该根据内存中的数据重新绘制棋盘以及棋子。 重新绘制棋盘是独立的一块功能,因此考虑用全局子过程来实现,该子过程定义在模块中。思路如下: 清屏一绘制棋盘一根据a数组中的每一项的两个下标来决定绘制棋子的位置,根据每一项的值是1还是 2来决定在该位置绘制何颜色的棋子。 决定该黑白方走的blackwhite变量当时没有保存,可以采用在数据库中保存的方式来解决,本例中解决方法是通过数黑白棋子个数来决定恢复棋局后该谁走的。 因此设置了一个变量做计数器,每走一步棋计数器的值加一。 用文件技术实现棋局恢复,思路相同。 (8)悔棋 悔一步棋:用几个变量来表示关于一步棋的几个信息,每次下子都将该子的信息赋值给那几个变量,悔 一步棋即将那几个变量所表示的点的a数组信息清零。而后调用paint ()过程重画。 以上是教师带着学生完成的软件功能。 遗留问题:保存棋手姓名和棋局名并在恢复棋局的时候显示。(需要同学们自己完成)思路:在数据表中多建立两个字段,分别表示两个棋手姓名,同其它数据的保存类似。 三、设计日期 十二月 四、完成日期 十二月 五、实验体会 其实,一开始学习vb我就对它不抱有一定的热情,可能是因为要用到计算机以及编程问题,当时一想到有代码,就会无比的苦恼,但是为了让这门课顺利通过,我还是怀着一颗必须要学的心情。起初,我对待这门新课程和其他课

五子棋游戏设计报告

五子棋游戏 项目设计报告 报告人:_ 学号: z

日期:2016年5月25日 摘要 (3) 一、....................................................... 系统功能简述. (4) (一).......................................... 系统功能4 (二).......................................... 开发环境4 (三)............................................... 实用价值 4. 二、................................................ 界面设计 5. (一)............................................... 界面操作 5. (二)...................................... 界面设计方案6 三、.............................................. 收获与体会 13 四、................................................ 参考文献 14

摘要 随着经济的发展,社会竞争的激烈,现在社会进入了竞争的时代。上班族为了完成公司业务,每天超负荷的工作;学生为了不落后他人每天早起晚睡不断地学习,压力巨大。所以为了缓解大家的压力,使大家在工作、学习之余娱乐一下,活跃大脑,提高工作、学习效率,因此益智性游戏越来越受人们的关注,五子棋作为益智类游戏之一,倍受人们的喜爱,所以对于五子棋的开发也有了很多关注。 本文主要讲的是利用VC++6.0 软件开发一个界面简洁、直观、实用性比较高的AI 功能的五子棋游戏,游戏程序实现人机对弈,在对弈过程中当用户和电脑比赛时电脑利用搜索算法计算出落子的最佳位置,是先人机对弈,而且程序能够完成具有重新开始游戏、判断胜负、判断落子等功能。 关键词:人工智能,自动处理,人机博弈,五子棋

五子棋游戏的设计与实现毕业设计论文

毕业论文(设计)题目五子棋游戏的设计与实现

毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作者签名:日期: 指导教师签名:日期: 使用授权说明 本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:日期:

学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名:日期:年月日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名:日期:年月日 导师签名:日期:年月日

五子棋人机对战算法分析

总的来说,要让电脑知道该在哪一点下子,就要根据盘面的形势,为每 一可能落子的点计算其重要程度,也就是当这子落下后会形成什么棋型(如:“冲四”、“活三”等),然后通览 全盘选出最重要的一点,这便是最基本的算法。当然,仅靠当前盘面进行判定是远远不够的,这样下棋很轻易掉进 玩家设下的陷阱,因为它没有考虑以后的变化。所以在此基础上我们加入递归调用,即:在电脑中猜测出今后几步 的各种走法,以便作出最佳选择,这也是我们下棋时常说的“想了几步”。如此一来您的程序便具有一定的水平了。 什么?不信!过来试试吧! 总体思路弄清之后,下面进行具体讨论: 一:数据结构 先来看看数据结构,我们需要哪些变量? 首先得为整个棋盘建立一张表格用以记录棋子信息,我们使用一个15*15的二维数组Table[15][15] (15*15是 五子棋棋盘的大小),数组的每一个元素对应棋盘上的一个交叉点,用…0?表示空位、…1?代表己方的子、…2? 代表对方的子;这张表也是今后分析的基础。 在此之后还要为电脑和玩家双方各建立一张棋型表Computer[15][15][4]和 Player[15][15][4],用来存放棋型 数据,就是刚才所说的重要程度,比如用…20?代表“冲四”的点,用…15?代表“活三”的点,那么在计算重要 性时,就可以根据20>15得出前者比后者重要,下子时电脑便会自动选择“冲四”的点。那为什么棋型表要使用三 维数组呢?因为棋盘上的每一个点都可以与横、竖、左斜、右斜四个方向的棋子构成不同的棋型,所以一个点总共 有4个记录;这样做的另一个好处是可以轻易判定出复合棋型,例如:假如同一点上有2个…15?就是双三、有一个…15?和一个…20?就是四三。 怎么样!3个数组构成了程序的基本数据骨架,今后只要再加入一些辅助变量便可以应付自如了。应该不会太 难吧?OK!有了这么多有用的数据,我们就可以深入到程序的流程中去了。 二:程序流程 我们主要讨论五子棋的核心算法,即:人工智能部分,而其他像图形显示、键盘鼠标控制等,因较为简单,所 以就不作过多介绍了。 我们看到本程序由六个基本功能模块构成,各模块的具体分析如下: (1)初始化:首先,建立盘面数组Table[15][15]、对战双方的棋型表Computer[15][15][4]和Player[15] [15][4]并将它们清零以备使用;然后初始化显示器、键盘、鼠等输入输出设备并在屏幕上画出棋盘。 (2)主循环控制模块:控制下棋顺序,当轮到某方下子时,负责将程序转到相应的模块中去,主要担当一个

课程设计-c语言设计-五子棋游戏 0528

课程设计-c语言设计-五子棋游戏

河南城建学院 测绘与城市空间信息系 测绘程序设计 题目: 五子棋游戏 班级: 0614112 人数: 3人 成员: 学号: 指导老师: 时间:2012年6月

目录 1课程设计报告-------------------2 1.1问题描述----------------------2 1.2 任务分工- - - - - - - - - - - - - - - 2 1.3需求分析---------------------------3 1.4概要设计-----------------------3 1.5详细设计-----------------------4 1.6调试分析---------------------5 2源程序---------------------6 3程序的说明文件-------------------12 4课设总结-----------------------13

1.课程设计报告 1.1问题描述 连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方就算获胜。此时,算法结束。当有任何一方想退出时,都可在算法中实现。 1.2 五子棋的背景 传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为15×15,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。 1.2 任务分工 组长:赵哲武 负责小组程序的输入和创新部分,分配任务,使工作衔接有序,以

相关文档
最新文档