当前位置:文档之家› C++五子棋编写(控制台版_CMD命令框版)【简单五子棋游戏_适合初学者学习_代码有详细注释】

C++五子棋编写(控制台版_CMD命令框版)【简单五子棋游戏_适合初学者学习_代码有详细注释】

C++五子棋编写(控制台版_CMD命令框版)【简单五子棋游戏_适合初学者学习_代码有详细注释】
C++五子棋编写(控制台版_CMD命令框版)【简单五子棋游戏_适合初学者学习_代码有详细注释】

jieC++五子棋Ver2.1程序+代码[带AI、悔棋等]【控制台版】这是用C++编写的一个简单五子棋游戏,带AI(电脑)、悔棋等功能。支持单人游戏(与电脑对战)和双人对战。

使用的C++知识也很简单,只需要懂基本的语法,不需要用到API。这个游戏不是图形界面的。是DOS版或者说控制台版的。

游戏的运行界面如下:

这其实是第三版,添加了悔棋,修复AI[电脑]的几个BUG,以及悔棋的一个小问题。当然了,若是还有什么BUG可以指出,我们的QQ:775904764,有问题也可以找我。

代码如下:

//--------------------------------------------------------------------------//

// 简单五子棋(控制台版)代码[Ver2.1]

// 修复了AI越界的问题,简化评分函数,修复输赢判断函数的BUG。

// AI评分函数规则有部分改变,代码也更加简练。

// 新增悔棋功能,仅与AI对战时可用,新增重新开始功能。

// 修复悔棋的一个小BUG,修复AI随机落子部分的定义错误。

// 作者:落叶化尘 QQ:775904764

//--------------------------------------------------------------------------//

#include "五子棋类.h"

#include

#include

using namespace std;

static const char ch[11][4]={"┌","┬","┐","├","┼","┤","└","┴","┘","○","●"}; //可供选用的字符,输出棋盘或者棋子用

static int Record[15][15]={0}; //记录棋子

static int Score[15][15]={0}; //评分

static int Sum=0,Renum=0;

int main()

{

int Default[15][15]={ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,2, //空棋盘

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,

6,7,7,7,7,7,7,7,7,7,7,7,7,7,8 };

int value[15][15]={0};

FiveChess Start;

do

{

Start.StartGame(value,Default); //开始游戏

}

while (Start.Continue); //若是要退出就修改这个值

return 0;

}

//------------------------------开始游戏------------------------------------------// void FiveChess::StartGame(int value[][15],int Default[][15])

{

Empty(value,Default); //初始化棋盘ad

ExWhile=true;

while(ExWhile)

{

Choice=MainMenu(); //调用主菜单,并把用户选择的值储存在Choice里

switch(Choice)

{

case 1:flag=1;ExWhile=false;break; //把标志设置为1,与AI对战case 2:flag=2;ExWhile=false;break; //把标志设置为2,双人对战

case 3:Select=Introduce();ExWhile=Select;Continue=false;break; //游戏说明函数

case 4:Select=Coder();ExWhile=Select;Continue=false;break; //作者介绍函数

case 5:Exit();ExWhile=false;Continue=false;break; //退出游戏函数

default:cin.fail();cin.clear();cin.sync();cout<<"输出错误,请重新输入!

\n";system("pause>nul 2>nul");ExWhile=true;break; //其它

}

}

if (flag==1) //如果标志等于1,说明为单人游戏

{

Single(value);

}

else if (flag==2) //如果标志等于2,说明为双人游戏

{

Double(value);

}

flag=0;

}

//------------------------清空棋盘或初始化棋盘-----------------------------------// void FiveChess::Empty(int value[][15],int Default[][15]) //清空棋盘

{

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

{

for (int j=0;j<15;j++)

{

value[i][j]=Default[i][j];

}

}

}

void FiveChess::Exit() //退出游戏

{

system("cls");

cout<<"┌—————————————————————————┐\n";

cout<<"│感谢您使用:简单五子棋 Ver2.1 │\n";

cout<<"││\n";

cout<<"│[游戏制作]:落叶化尘│\n";

cout<<"│[联系Q Q ]: 775904764 │\n";

cout<<"│[联系邮箱]:lxhdjwg@https://www.doczj.com/doc/f512447350.html, │\n";

cout<<"│[简单说明]:游戏结束界面,谢谢您的使用!│\n";

cout<<"└—————————————————————————┘\n";

cout<<"感谢您的使用,谢谢!按任意键退出游戏...\n";

system("pause>nul 2>nul");

}

bool FiveChess::Introduce() //游戏介绍

{

system("cls");

cout<<"┌—————————————————————————┐\n";

cout<<"│简单五子棋 Ver2.1[游戏介绍界面] │\n";

cout<<"││\n";

cout<<"│[单人游戏]:玩家和AI(人工智能)对战,AI智商不高。│\n";

cout<<"││\n";

cout<<"│[双人游戏]: 可以两个玩家一起对战,可能不是很方便。│\n";

cout<<"││\n";

cout<<"│[游戏方法]:输入X Y坐标落子,输入双-1悔棋。│\n";

cout<<"││\n";

cout<<"│[特别提示]:若游戏中想突然退出,按Ctrl+C即可中断。│\n";

cout<<"││\n";

cout<<"└—————————————————————————┘\n";

cout<<"是否返回?[Y-返回 N-退出]:";

char choice;

cin>>choice;

if (choice=='N'||choice=='n')

{

cout<<"感谢您的使用,谢谢!按任意键退出游戏...\n";

system("pause>nul 2>nul");

return false;

}

else

{

return true;

}

}

bool FiveChess::Coder() //作者介绍

{

system("cls");

cout<<"┌—————————————————————————┐\n";

cout<<"│简单五子棋 Ver2.1[作者介绍界面] │\n";

cout<<"││\n";

cout<<"│[游戏制作]:落叶化尘│\n";

cout<<"│[联系Q Q ]: 775904764 │\n";

cout<<"│[联系邮箱]:lxhdjwg@https://www.doczj.com/doc/f512447350.html, │\n";

cout<<"│[简单介绍]:游戏制作简陋,还请见谅^_^!│\n"; cout<<"│[附加说明]:作者正在努力学习C++中,嘿嘿~ │\n";

cout<<"└—————————————————————————┘\n";

cout<<"是否返回?[Y-返回 N-退出]:";

char choice;

cin>>choice;

if (choice=='N'||choice=='n')

{

cout<<"感谢您的使用,谢谢!按任意键退出游戏...\n";

system("pause>nul 2>nul");

return false;

}

else

{

return true;

}

}

//-------------------------------选择主菜单-----------------------------//

int FiveChess::MainMenu()

{

system("cls"); //清屏

system("title 五子棋游戏 By--落叶化尘 QQ:775904764"); //修改窗口标题system("color 3f"); //定义窗口颜色

system ("mode con cols=56 lines=20"); //设置窗口大小

cout<<"┌—————————————————————————┐\n";

cout<<"│简单五子棋 Ver2.1 │\n";

cout<<"│[1]、单人游戏│\n";

cout<<"││\n";

cout<<"│[2]、双人游戏│\n";

cout<<"││\n";

cout<<"│[3]、游戏介绍│\n";

cout<<"││\n";

cout<<"│[4]、关于作者│\n";

cout<<"││\n";

cout<<"│[5]、退出│\n";

cout<<"└—————————————————————————┘\n";

cout<<"请选择:";

int select;

cin>>select;

return select; //返回用户选择的值

}

//--------------------------------胜利界面--------------------------------// void FiveChess::Victory(int Num)

{

system ("mode con cols=56 lines=20"); //设置窗口大小

system("cls");

if (Num==1)

{

system("color 1f");

cout<<"┌—————————————————————————┐\n";

cout<<"│恭喜玩家1[黑棋]获得胜利!│\n";

cout<<"││\n";

cout<<"│[胜利玩家]:玩家1 │\n";

cout<<"│[所属棋子]: 黑色│\n";

cout<<"│[祝福话语]:不错哦^_^!恭喜您获得了胜利!│\n";

cout<<"││\n";

cout<<"└—————————————————————————┘\n"; }

else if (Num==2)

{

system("color 2f");

cout<<"┌—————————————————————————┐\n";

cout<<"│恭喜玩家2[白棋]获得胜利!│\n";

cout<<"││\n";

cout<<"│[胜利玩家]:玩家2 │\n";

cout<<"│[所属棋子]: 白色│\n";

cout<<"│[祝福话语]:恭喜您获得了胜利,再接再厉哈^_^!│\n";

cout<<"││\n";

cout<<"└—————————————————————————┘\n"; }

else if(Num==3)

{

system("color 3f");

cout<<"┌—————————————————————————┐\n";

cout<<"│恭喜您,获得了胜利│\n";

cout<<"││\n";

cout<<"│[胜利玩家]:自己│\n";

cout<<"│[所属棋子]: 黑色│\n";

cout<<"│[祝福话语]:不错哦,打败了AI,恭喜!│\n";

cout<<"││\n";

cout<<"└—————————————————————————┘\n"; }

else if(Num==4)

{

system("color 5f");

cout<<"┌—————————————————————————┐\n";

cout<<"│非常遗憾,您输了! │\n";

cout<<"││\n";

cout<<"│[胜利玩家]:AI(电脑)│\n";

cout<<"│[所属棋子]: 白色│\n";

cout<<"│[祝福话语]:加油吧,下次一定要把AI打败哦! │\n";

cout<<"││\n";

cout<<"└—————————————————————————┘\n"; }

else

{

system("color 5f");

cout<<"┌—————————————————————————┐\n";

cout<<"│势均力敌——平局│\n";

cout<<"││\n";

cout<<"│[胜利玩家]:无[平局] │\n";

cout<<"│[所属棋子]: 黑色或白色│\n";

cout<<"│[祝福话语]:棋盘居然被走满了,不错不错~!│\n";

cout<<"││\n";

cout<<"└—————————————————————————┘\n";

}

cout<<"是否返回主界面?[Y-返回 N-退出]:";

char choice;

cin>>choice;

if (choice=='N'||choice=='n')

{

cout<<"感谢您的使用,谢谢!按任意键退出游戏...\n";

system("pause>nul 2>nul");

Continue=false;

}

else

{

Continue=true;

}

}

//----------------------------悔棋-------------------------------//

void FiveChess::Retract(int &x1,int &y1,int &x2,int &y2,int value[][15]) {

if (Sum>=1)

{

Sum--;

}

if ((x1==-1)&&(y1==-1)&&(x2==-1)&&(y2==-1))

{

cout<<"当前无法悔棋,棋盘上没有棋子!";

system("pause>nul");

}

else if (Renum>=6)

{

cout<<"悔棋超过6次,为了公平,您不能再次悔棋!";

system("pause>nul");

}

else

{

Renum++;

if (x1==0&&y1==0){value[x1][y1]=0;Record[x1][y1]=0;}

else if (x1==0&&y1==14){value[x1][y1]=2;Record[x1][y1]=0;}

else if (x1==14&&y1==0){value[x1][y1]=6;Record[x1][y1]=0;}

else if (x1==14&&y1==14){value[x1][y1]=8;Record[x1][y1]=0;}

else if (x1==14&&(y1>0&&y1<14)){value[x1][y1]=7;Record[x1][y1]=0;}

else if (y1==14&&(x1>0&&x1<14)){value[x1][y1]=5;Record[x1][y1]=0;}

else if (x1==0&&(y1>0&&y1<14)){value[x1][y1]=1;Record[x1][y1]=0;}

else if (y1==0&&(x1>0&&x1<14)){value[x1][y1]=3;Record[x1][y1]=0;}

else {value[x1][y1]=4;Record[x1][y1]=0;}

if (x2==0&&y2==0){value[x2][y2]=0;Record[x2][y2]=0;}

else if (x2==0&&y2==14){value[x2][y2]=2;Record[x2][y2]=0;}

else if (x2==14&&y2==0){value[x2][y2]=6;Record[x2][y2]=0;}

else if (x2==14&&y2==14){value[x2][y2]=8;Record[x2][y2]=0;}

else if (x2==14&&(y2>0&&y2<14)){value[x2][y2]=7;Record[x2][y2]=0;}

else if (y2==14&&(x2>0&&x2<14)){value[x1][y2]=5;Record[x2][y2]=0;}

else if (x2==0&&(y2>0&&y2<14)){value[x2][y2]=1;Record[x2][y2]=0;}

else if (y2==0&&(x2>0&&x2<14)){value[x2][y2]=3;Record[x2][y2]=0;}

else {value[x2][y2]=4;Record[x2][y2]=0;}

cout<<"每盘最多允许悔棋6次,且最多只能回到上一步!";

system("pause>nul");

}

}

//-----------------------------判断用户输入的坐标合法性-------------------------// int FiveChess::Position(int *x,int *y,int value[][15])

{

if (cin.fail()||*x<0||*x>=15||*y<0||*y>=15)

{

cin.clear();

cin.sync();

return 1; //返回1表示不在范围内或者输入的不是数字

}

else if (value[*x][*y]==9||value[*x][*y]==10)

{

return 2; //存在棋子

}

else

{

return 0; //返回 0 表示坐标正常

}

}

//---------------------------判断该哪个玩家先走----------------------------//

int FiveChess::NextPlayer(int value[][15])

{

int i,j;

int player1=0,player2=0;

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

{

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

{

if (value[i][j]==10)

{

player1++; //统计棋盘上面黑子的个数

}

else if (value[i][j]==9)

{

player2++; //统计棋盘上白子的个数

}

}

}

if (player1>player2||player1

{

return 2; //该玩家2走了(白子)

}

else

{

return 1; //该玩家1走了(黑子)

}

}

//---------------------------判断棋子落在这点,是否胜利或者平局-----------------------------------------//

int FiveChess::Win(int *x,int *y,int ChessNum,int value[][15])

{

int i,j,k; //返回-1:平局返回0:没有谁胜利返回1:传递过来ChessNum号的那一方胜利

int number=0;

Sumchess=0;

for (i=-1;i<=1;i++)

{

for (j=-1;j<=1;j++) //循环8次,分别计算这个点的8个方向是否构成5连

{

if (i!=0 || j!=0) //i或者j等于0,不就代表的是ChessNum的值嘛

{

for (k=1;k<5;k++) //循环4次

{ //这是不越界判断//存在棋子数目+1

if(*x+k*i>=0 &&*x+k*i<=14 && *y+k*j>=0 &&*y+k*j<=14 &&

value[*x+k*i][*y+k*j]==ChessNum){number++;} //如果这个点有棋子

else {break;} //没有棋子就跳出

}

for (k=-1;k>-5;k--) //与上面相对的方向的判断

{

if(*x+k*i>=0 &&*x+k*i<=14 && *y+k*j>=0 &&*y+k*j<=14 && value[*x+k*i][*y+k*j]==ChessNum){number++;}

else {break;} //没有棋子就跳出

}

if(number>=4) //如果>=4就说明5连了,返回ChessNum表示传递过来的这个玩家得下子点能构成5个,胜利了

{

return 1;

}

else

{

number=0; //清空统计

}

}

}

}

for (i=0;i<15;i++) //棋盘是否满了

{

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

{

if (value[i][j]==9||value[i][j]==10)

{

Sumchess++; //统计黑子和白子的总个数

}

}

}

if (Sumchess>=225)

{

return -1; //棋盘满了

}

else

{

return 0; //没胜利也没和棋

}

}

//---------------------------------绘制棋盘、落子函数-----------------------------------------//

void FiveChess::PrintBord(int *x,int *y,int value[][15],int player)

{

system("cls");

int i,j;

if (player==1)

{

value[*x][*y]=9; //黑棋

}

else if (player==2)

{

value[*x][*y]=10; //白棋

}

cout<<" 0 1 2 3 4 5 6 7 8 9 10 1 2 3 4\n"; //输出参考坐标

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

{

if(i!=0)

{

cout<<" "<

}

else

{

cout<<" 0";

}

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

{

cout<

}

cout<<"\n";

}

}

//------------------------------------双人对战-----------------------------// void FiveChess::Double(int value[][15])

{

cout<<"您选择了双人对战模式,请按任意键继续!";

system("pause>nul 2>nul");

system("cls");

system ("mode con cols=43 lines=20");

system("color 3f");

system("title 五子棋-双人对战模式");

PrintBord(&x,&y,value,-1); //先绘制个空棋盘

ExWhile=true; //退出循环用的

memset(Record,0,sizeof(Record)); //先把记录落子的数组清0

while(ExWhile)

{

int play=NextPlayer(value); //先得到该哪个玩家走棋了

cout<<"请(玩家"<

cin>>x>>y;

Check=Position(&x,&y,value); //检测坐标合法性

if (Check==0) //坐标没问题

{

PrintBord(&x,&y,value,play); //再绘制落子棋盘

Record[x][y]=play; //记录这个点,1表示黑子,2表示白子

cout<<"玩家["<

Check1=Win(&x,&y,play,Record); //检测是否有一方胜利或者和棋

if (Check1==-1) //和棋

{

cout<<"游戏棋盘满啦,还没分出胜负,都很厉害哈!\n";

cout<<"本次游戏结束,按任意键继续...";

system("pause>nul 2>nul");

Victory(5); //跳转胜利界面

ExWhile=false;

}

else if(Check1==1) //当前玩家paly胜利

{

cout<<"恭喜[玩家"<

cout<<"本次游戏结束,按任意键继续...";

system("pause>nul 2>nul");

Victory(play); //跳转胜利界面

ExWhile=false;

}

else //没谁胜利

{

ExWhile=true; //不退出循环

}

}

else if(Check==1)

{

cout<<"输入范围错误,请重新输入!\n";

ExWhile=true;

}

else

{

cout<<"您输入的坐标已经存在棋子,请重新输入!\n";

ExWhile=true;

}

}

}

//-------------------------------与AI对战------------------------------//

void FiveChess::Single(int value[][15])

{

cout<<"您选择了与AI对战的模式,请按任意键继续!";

system("pause>nul 2>nul");

system("cls");

system ("mode con cols=43 lines=20");

system("color 3f");

system("title 五子棋-与AI的对战模式");

PrintBord(&x,&y,value,-1); //先绘制个空棋盘

ExWhile=true; //退出循环用的

Sum=0,Renum=0;

memset(Record,0,sizeof(Record)); //先把记录落子的数组清0

int x1=-1,y1=-1,x2=-1,y2=-1;

while(ExWhile)

{

ExWhile1=true;

cout<<"请[玩家]输入坐标[双(-1)为悔棋]:";

cin>>x>>y;

Check=Position(&x,&y,value);

if ((x==-1)&&(y==-1)) //悔棋

{

Retract(x1,y1,x2,y2,value);

PrintBord(&x,&y,value,-1); //绘制落子棋盘

ExWhile=true;

}

else if (Check==0) //坐标没问题

{

value[x][y]=9;

Record[x][y]=1; //记录这个点,1表示黑子,2表示白子

x1=x;y1=y; //记录当前坐标悔棋用

Sum++;

if (Win(&x,&y,1,Record)==0)

{

Robot(&x,&y,&Sum,value); //调用AI函数

PrintBord(&x,&y,value,2); //绘制落子棋盘

x2=x;y2=y; //记录当前坐标悔棋用

cout<<"玩家棋子数:"<

//cout<<"玩家坐标:"<

if (Win(&x,&y,2,Record)==1)

{

cout<<"非常遗憾,您输了,AI获得了胜利!\n";

cout<<"本次游戏结束,按任意键继续...";

system("pause>nul 2>nul");

Victory(4); //跳转胜利界面

ExWhile=false;

}

else if(Win(&x,&y,2,Record)==-1)

{

cout<<"游戏棋盘满啦,还没分出胜负,都很厉害哈!\n";

cout<<"本次游戏结束,按任意键继续...";

system("pause>nul 2>nul");

Victory(5); //跳转平局界面

ExWhile=false;

}

else {ExWhile=true;}

}

else if(Win(&x,&y,1,Record)==1)

{

PrintBord(&x,&y,value,-1); //绘制棋盘

cout<<"恭喜[玩家]获得胜利!\n";

cout<<"本次游戏结束,按任意键继续...";

system("pause>nul 2>nul");

Victory(3); //跳转胜利界面

ExWhile=false;

}

else if(Win(&x,&y,1,Record)==-1)

{

PrintBord(&x,&y,value,-1); //绘制棋盘

cout<<"游戏棋盘满啦,还没分出胜负,都很厉害哈!\n";

cout<<"本次游戏结束,按任意键继续...";

system("pause>nul 2>nul");

Victory(5); //跳转平局界面

ExWhile=false;

}

}

else if(Check==1)

{

cout<<"输入范围错误,请重新输入!\n";

}

else

{

cout<<"您输入的坐标已经存在棋子,请重新输入!\n";

}

}

}

//-----------------------------电脑落子函数-------------------------------// void FiveChess::Robot(int *x,int *y,int *Sum,int value[][15])

{

ExWhile1=true;

if (*Sum==1)

{

while(ExWhile1)

{

ChessOne(*x,*y,value);

if (Position(x,y,value)==0){ExWhile1=false;}

}

Record[*x][*y]=2; //记录这个点

}

else //从第2步开始,使用评分系统

{

Findscore(*x,*y);

}

}

//-----------------------------查找评分最高的坐标-------------------------// void FiveChess::Findscore(int &x,int &y)

{

srand( (unsigned)time( NULL ) );

int i,j,x1,x2,y1,y2,lx;

int Max=0;

ChessScore(); //调用评分函数

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

{

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

{

if(Score[i][j]>Max)

{

Max=Score[i][j]; //获取所有点中,评分最高的

x1=i;

y1=j;

}

}

}

x2=x1;y2=y1;

for (i=0;i<15;i++) //可能的话,有评分相同的多个点

{

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

{

if(Score[i][j]==Max&&i!=x2&&j!=y2) //在这么多个相同分数的点中,随机找一个

{

lx=rand()%10;

if (lx<5)

{

x2=i,y2=j;

break;

}

}

}

}

if (x2!=x1 || y2!=y1) //棋盘上有2个最高分

{

lx=rand()%10; //随机一个^_^

if (lx>6)

{

x=x1,y=y1;

}

else

{

x=x2,y=y2;

}

}

else //棋盘上只有一个最高分

{

x=x1,y=y1;

}

Max=0; //清空最大值

Record[x][y]=2; //记录这个点

}

//------------------------------玩家走第1步时的落子-------------------------------// inline void FiveChess::ChessOne(int &x,int &y,int value[][15])

{

int i,j;

srand( (unsigned)time( NULL ) ); //随机数随着时间的改变而改变

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

{

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

{

if (value[i][j]==9) //如果找到了玩家的棋子,在它的8个方的任意一点落子

{

int lx=rand()%7;

if(lx==0)

{

x=i+1;y=j+1;

if (Position(&x,&y,value)==0){break;}

}

else if(lx==1)

{

x=i+1;y=j-1;

if (Position(&x,&y,value)==0){break;}

}

else if(lx==2)

{

x=i-1;y=j-1;

if (Position(&x,&y,value)==0){break;}

}

else if(lx==3)

{

x=i-1;y=j+1;

if (Position(&x,&y,value)==0){break;}

}

else if(lx==4)

{

x=i-1;y=j; //上

if (Position(&x,&y,value)==0){break;}

}

else if(lx==5)

{

x=i;y=j-1; //左

if (Position(&x,&y,value)==0){break;}

}

else if(lx==6)

{

x=i;y=j+1; //右

if (Position(&x,&y,value)==0){break;}

}

else

{

x=i+1;y=j; //下

if (Position(&x,&y,value)==0){break;}

}

}

}

}

}

//-----------------------------------AI评分函数---------------------------------------//

void FiveChess::ChessScore()

{

int x,y,i,j,k; //循环变量

int number1=0,number2=0; //number用来统计玩家或电脑棋子连成个数

int empty=0; //empty用来统计空点个数

memset(Score,0,sizeof(Score)); //把评分数组先清零

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

{

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

{

if(Record[x][y]==0) //如果这个点为空

{

for(i=-1;i<=1;i++)

{

for(j=-1;j<=1;j++) //判断8个方向

{

if(i!=0 || j!=0) //若是都为0的话,那不就是原坐标嘛

{

//-------------------------------------对玩家落点评分---------------------------------------//

for(k=1;i<=4;k++) //循环4次

{ //这点没越界//且这点存在黑子(玩家)

if(x+k*i>=0 && x+k*i<=14 && y+k*j>=0 && y+k*j<=14 && Record[x+k*i][y+k*j]==1 ){number1++;}

else if(Record[x+k*i][y+k*j]==0){empty++;break;} //这点是个空点,+1后退出

else {break;} //否则是墙或者对方的棋子了

}

for(k=-1;k>=-4;k--) //向它的相反方向判断

{ //这点没越界 //且这点存在黑子(玩家)

if(x+k*i>=0 && x+k*i<=14 && y+k*j>=0 && y+k*j<=14 && Record[x+k*i][y+k*j]==1 ){number1++;}

else if(Record[x+k*i][y+k*j]==0){empty++;break;} //同上条

else {break;}

}

if(number2==1) {Score[x][y]+=1;} //2个棋子

else if(number1==2) //3个棋子

{

五子棋游戏设计方案

目录 一、摘要: (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月北京成功地举办了第一届“康柏杯”

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

计算机学院网络工程专业《程序设计综合课程设计》报告(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,双人五子棋要求能够进入欢迎界面,二人对弈,当有五颗同色棋子相连时,判断出输赢等一系列游戏流程。

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语言程序五子棋 作品功能:五子棋人机对战,人人对战。 目录:1 五子棋介绍。 2五子棋棋型介绍。 3人人对战的实现。 4电脑下子的实现。 5棋型价值的计算。 6胜利及棋型的判断。 7补充说明 1五子棋介绍。 五子棋是一种两人对弈的纯策略型棋类游戏。只要任意一方在棋盘上且同一个回合上连为五子为胜。还有禁手规则,在本程序中不作讨论。 2五子棋棋型介绍。 本程序中的棋型均为本人自定义。本程序总共设计35种棋型。●表示玩家的棋子,◎表示电脑的棋子。以下称电脑方为己方,玩家方为对方。从一空点向某一方向判断该方向的棋型。某一方向指1-8方向从右顺时针开始数。

(1)空棋型。从一空点向一方向看连续2个为空的棋型。空棋型共1种。 如图,从左端的空点向右看会发现有连续2个空点。 (2)活棋型。2端无挡的棋型为活棋型。活棋型共8种:己方4种,对方4种。 左图为己活 3 。从左端的空点向右看会发现己方有连续的3个子,且右端无挡。故该点的1方向为己活3。 左图为对活2 (3)冲棋型。1端无挡的棋型为冲棋型。冲棋型共9种:己方4种,对方4种,边界1种。 左图为边界冲棋型。空点的右端为边界。 或左图为己冲2。从左端的空点向右看会发现己方有连续的2个子,且右端有挡(此处有挡表示有对方的子或为边界)。故该点的1方向为己冲2。 左图为对冲4。 (4)空活棋型。从一空点向一方向看有1个空点,继

续看有己方或对方的活棋型。空活棋型共8种: 己方4种,对方4种。 左图为己空活2。从左端的空点向右看有1个空点,继续看会发现己方有连续的2个 子,且右端无挡。故该点的1方向为己空活2。 左图为对空活1。 (5)空冲棋型。从一空点向一方向看有1个空点,继续看有己方或对方或边界冲棋型。空冲棋型共9 种:己方4种,对方4种,边界1种。 左图为边界空冲棋型。空点的右端为空点再右看为边界。 或左图为己空冲2。 从左端的空点向右看有1个空点,继续看会发现己方 有连续的2个子,且右端有挡。故该点的1方向为己 空冲2。 3人人对战的实现。 双方玩家轮流下子,直到一方形成五连即判为胜方。下子时输入棋盘上显示的对应坐标。如果某方需要悔棋,则输入 15 15 即可。悔棋只能悔一步。在人机对战中亦可悔棋。

基于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.

软件工程课程设计五子棋游戏

计算机工程系课程设计报告 课程名称:软件工程 课程设计题目:五子棋游戏 班级 2013级计科(4)班 姓名许婷娜 学号 20130905428 2015年12月27日

目录 1. 引言 (1) 1.1系统的开发背景(可行性分析) (1) 1.2 系统简介 (2) 1.2.1系统介绍 (2) 1.2.2开发本系统所做的工作 (2) 2. 需求分析 (3) 2.1 需求的描述与分析 (3) 2.2 需求定义 (3) 2.2.1 功能需求 (3) 2.2.2 性能需求 (4) 3. 系统设计 (4) 3.1总体设计 (4) 3.1.1设计思想 (4) 3.1.2五子棋游戏的功能的结构图 (5) 3.2程序设计分析 (5) 4. 五子棋游戏的详细设计 (6) 4.1五子棋游戏的主窗口界面 (6) 4.2五子棋游戏的核心模块的详细设计 (10) 4.2.1五子棋游戏程序核心代码 (10) 4.2.2五子棋游戏程序主面板与鼠标事件 (13) 4.2.3五子棋游戏程序流程图 (17) 4.3五子棋游戏的游戏功能模块的详细设计 (18) 4.3.1五子棋游戏的开局功能模块 (18) 4.3.2五子棋游戏的棋盘功能模块 (18) 4.3.3五子棋游戏的模式功能模块 (19) 4.3.4五子棋游戏的退出功能模块 (19) 4.4五子棋游戏的外观功能模块的详细设计 (19) 4.5五子棋游戏的版本功能模块的详细设计 (20)

5. 五子棋游戏的测试 (20) 5.1系统测试的类型 (20) 5.2测试举例 (21) 5.2.1测试用户的对弈结果 (21) 5.2.2测试用户切换棋盘类型功能 (22) 5.2.3测试用户切换模式类型功能 (23) 5.2.4测试用户切换外观类型功能 (24) 5.2.5测试版本功能 (26) 小结 (27) 致谢 (28) 参考文献 (29)

五子棋教案

教学目标: 激起学生学习五子棋的兴趣,教育学生沉着冷静,有良好的棋风。 教学准备:五子棋 教学过程: 一、认识五子棋 1.出示棋盘和棋子,教师演示,让学生认识什么是五子棋。 了解:五子棋是一种两人对弈的纯策略型棋类游戏,是起源于古代的传统种之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高,而且富含,有助于修身养性。 2.明确我们社团的活动内容:五子棋。 二、学下五子棋 1、请会下五子棋的学生说说下棋的规则及下棋的经验。 2.教师总结下棋规则: ①摆成连线的五个子后,则算赢; ②如果手中的子全摆完,则移动棋盘上的子,每次棋只走一步; ③棋盘上的子不列五个就算输。 三、找棋友,分成组 可让学生自行找棋友,拼成三人一组或两人一组,三人一组的,其中一人可当裁判。 四、学生下五子棋 1.小组内可举行比赛,采用三局两胜制,决出优胜者。 2.请小棋手介绍取胜经验 3.结合活动情况评出本次小棋手

教学目标: 在老师帮助下认识五子棋的棋具,学会正确执子下子。 教学准备:五子棋棋具、图片 教学过程: 一、结合实物、图片认识五子棋的棋具 1.棋具包括棋盘和棋子。 2. 了解棋具历史:相传中华民族的祖先轩辕黄帝无意之中画下了十七条横线十条竖线,这无意中的发明造就出了五子棋。早在公元595年古人就用瓷来烧制了。 千百年来,人们用各种材质来制造围棋的棋子,如:玻璃、瓷器、玉、玛瑙、铜等等。 古代五子棋棋盘与围棋棋盘是通用的。五子棋棋子亦称“棋石”分黑、白两色,形状为扁圆形,有一面凸起或两面凸起等形状,厚度不超过厘米,直径为~厘米;一副棋子总数为225枚,其中黑子113枚,白子112枚。按质地的不同,可分为玻璃、陶瓷、塑料、智石、磁铁、蛤贝、烧料、水晶、玛瑙、玉石等棋子。 国内质量比较好的是云子,而日本常用的棋子是贝壳制作的。 3. 认识棋盘和棋子 棋盘:认识棋盘横竖线,交叉点。横向从左到右用a到o共十五个英语字母标出,竖向从下到上用1到15共十五个阿拉伯数字标出。棋盘上的横线和竖线共交叉形成了225个交叉点,棋子就落在棋盘的这些交叉点上。 棋盘上有5个比较特殊的交叉点,用小黑点标识出来,叫做星;中间的星叫天元,表示棋盘的正中心; 四周的4个星叫小星,表示棋盘的四个角落;星在棋盘上起一定的标示位置作用。 棋子:由黑白两种颜色组成。一人拿黑棋,另一个人拿白棋,黑棋先走,白棋后走。共有225个棋子,与交叉点的个数相同;其中黑棋113个,白棋112个,不过平时下棋棋子少些也是可以的。正确的拿棋子的方法是食指的指甲与中指的指肚儿夹住棋子。棋子落在棋盘的交叉点上,落下后不能移动,也不能吃子。 4.学生练习执子、下子,相互纠正。 二、学生分组下五子棋。 五子棋教育活动(三)

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

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

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)

五子棋游戏设计报告

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

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

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

Python-大作业之五子棋游戏(附代码)

Python 大作业——五子棋游戏 姓名:学号: 姓名:学号: 一游戏介绍: 我们设计的是五子棋游戏,支持两人一个鼠标对下,黑方用左键单击,白方用右键单击,谁先下均可,落子无悔,下过的棋子对方点击后不会变色,程序可自行判断输赢并在五子连珠时弹出结果对话框,游戏双方需遵守不在空地点击和一次下一子的规则。 二游戏代码设计: 代码均为原创,没有借鉴和抄袭,首先是用户GUI界面设计,点击start进入游戏界面,点击quit则退出程序,为了方便判断和记录,我们按从左到右,从上到下的顺序给15x15=225颗棋子编号225,左键绑定函数callback1,点击后可算出它位于哪颗棋子上再画出来黑子,并把对应编号计入record这个列表,之后进入判断函数。右键绑定函数callback2,点击后画出白子,对应编号计入recor这个列表,之后进入判断函数,其中总列表rec的作用是使棋子不被下第二遍。 三作业感想 这个游戏虽然很小但是可以供室友们晚上娱乐之用,我们倾注了很多心血,之前采用模块化编程失败了很多次,有事件响应问题,参数传递问题,到第七个程序才成功,感谢张同珍老师指点了很多,

我们学会了使用类,受益匪浅,对Python产生了浓厚的兴趣。四过程截图 五、实验代码 from Tkinter import * from tkMessageBox import * class Game: def __init__(self): self.A=[] self.B=[] self.record=set()

self.recor=set() self.rec=self.record|self.recor self.root=Tk() self.root.geometry("180x250") self.root.title("Wu Zi Qi Game") self.r=Canvas(self.root,width=180,height=210,bg="purple") pic=PhotoImage(file="beijing.gif") self.r.create_image(90,100,image=pic) self.r.place(x=0,y=15) Label(self.root,text="***Wu Zi Qi Game***",fg="red").place(x=20,y=0) Button(self.root,text="start",command=self.start).place(x=30,y=230) Button(self.root,text="quit ",command=self.root.destroy).place(x=100,y=230) self.r.mainloop() def start(self): self.root.destroy() self.top=Tk() self.top.title("Game Start") self.c=Canvas(self.top,width=480,height=480,bg="white") self.c.pack() self.c.create_rectangle(25,25,455,455,fill="gray") for i in range(30,451,30): for j in range(30,451,30): self.c.create_oval(i-2,j-2,i+2,j+2,fill="blue") for i in range(1,16): self.c.create_line(30,30*i,450,30*i) self.c.create_line(30*i,30,30*i,450) self.c.create_oval(234,234,246,246,fill="black") self.c.create_oval(115,115,125,125,fill="black") self.c.create_oval(355,115,365,125,fill="black") self.c.create_oval(115,355,125,365,fill="black") self.c.create_oval(355,355,365,365,fill="black") self.c.bind("",self.callback1) self.c.bind("",self.callback2) self.c.mainloop() def callback1(self,event): u,v=event.x,event.y s=u/15 if s%2==1: self.x=(s+1)/2 else: self.x=s/2

五子棋游戏实验报告

五子棋游戏实验报告 课程名称计算机程序设计(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我就对它不抱有一定的热情,可能是因为要用到计算机以及编程问题,当时一想到有代码,就会无比的苦恼,但是为了让这门课顺利通过,我还是怀着一颗必须要学的心情。起初,我对待这门新课程和其他课

五子棋基本知识基础简介

五子棋基本知识基础简介 五子棋基础初识五子棋,是1997年我在读大学时,那时分第一次晓得还有五子棋,说实话,那时分只能用一句话形容:晓得有五子棋这游戏,什么规则都不晓得,就晓得五个连在一同就是赢。 其实宿舍的朋友也就两个人玩,那时分应该叫第一印象。 到了大学毕业,我工作之后,一次和朋友打PS,偶或谈到喜欢,才晓得哥们也是喜欢五子棋,真有只恨相识太晚的觉得,于是欣然下了一盘,可是他却说我的三三输了,问起然,才知还有禁手这一规则,遗憾的是他那时也只是晓得三三禁手,至于复杂的他也不知,就这样,在工作的10年下了四盘棋,由于哥们曾经因公调离。 真的认识五子棋,应该说还是要感激大学的那位朋友,很久没有相见,偶或在QQ里再次邂逅,应酬之后,我们还是有共同的喜好—五子棋,遗憾的是我每盘必输,输的我颜面扫地,这才狠下心决议认真学习一下,至少要赢他几盘。 于是激动地跑到书店,毫不犹疑地买下彭建国教师的《五子棋入门》和《强化锻炼手册》,一没事就看,说句实话,没有真正的了解过,只图赢他几盘,于是便融会贯通花月必胜,可不幸的是,我的朋友很快升任上海的公司副总,下棋的时机简直如海市蜃楼普通,加上结婚孩子的出世,我彻底与五子棋决断。 不晓得是股票炒得不如意,还是由于打牌玩的真实无聊,赢了挨骂,输了本人郁闷,于是,又激动地到安徽棋牌中心下了几盘五子棋,

说句真实话,输的惨不忍睹!!十一盘一盘没赢!庆幸的是我这个人一向争强好胜,从不服输。 于是商定他,一个月之后再下。 这时分时间定格在2011年2月,我应用上班的空暇时间,能够说迫不及待地在网络搜索各类必胜,可喜的是,我找到了花月和蒲月的必胜定式,一个直指,一个斜指,能够对付两个不同开局。 一切似乎阐明:有志者事竟成!在之后的一个月里,我先手成功的概率在60%以上。 网上的哥们也很奇异,说怎样进步那么大?我喜滋滋地说自学!可是在4月的一天,我碰到了一个对手,一个徐州的名叫“总输的人,他怪怪的跳开防卫和“日形防卫,让我觉得就像无形的网罩住一样,无从发力。 于是偷偷地问他,才知还有八卦和妖刀这利器。 永不认输的性格必定我将继续学习,于是想象找一个五子棋群或者论坛这类的,以便找人寻觅答案,庆幸的是我认识了华夏群,认识了五子茶馆,认识了那么多酷爱五子棋的人。 渐渐地认识了五子棋还有那么多学问,还有那么多复杂的禁手规则,那么多文雅的星月称号。 急功近利永远是学习的大敌。 为了追求胜率,我只顾记忆必胜定式,一点也不理解,一旦他人不按定式下,本人就一筹莫展,觉得有力使不出,更困惑的是明明晓

相关主题
文本预览
相关文档 最新文档