单机五子棋游戏实现.docx
- 文档编号:1245591
- 上传时间:2022-10-19
- 格式:DOCX
- 页数:14
- 大小:70.29KB
单机五子棋游戏实现.docx
《单机五子棋游戏实现.docx》由会员分享,可在线阅读,更多相关《单机五子棋游戏实现.docx(14页珍藏版)》请在冰豆网上搜索。
单机五子棋游戏实现
《数据结构与算法设计》
1、设计题目简易五子棋程序设计
2、课程设计要求:
1)每个学生要教师指导下独立完成。
完成后按要求格式打印课程设计报告。
第6周开始,第16周前上交。
本课程设计分数10分;
2)通过本课程设计深刻认识数据结构在程序设计中的重要作用,以及提高根据要求实现解决问题的算法设计能力。
3)合理定义数据结构,进行高效算法设计并计算算法的时间复杂度。
采用面向对象的程序设计(OOP)方法进行程序设计,对数据和操作进行合理封装,实现二人下棋的五子棋程序功能。
参考程序界面如下:
3、数据结构
1)五子棋棋盘对应一个整形二维数组(线性表),棋盘网格对应数组元素,可设置数据元素值来记载棋子。
如无棋子时对应数据元素值为0,红棋子对应数据元素值为1,黑棋子对应数据元素值为10;
2)为了实现悔棋操作需要记载下棋时落子的先后序列,可采用栈来实现,栈的数据元素为一结构体,结构体有2个整形数据成员,用来记载棋子位置对应数组元素的下标。
落子进行进栈操作,悔棋进行出栈操作
4、关键算法分析
关键算法是对线性表(二维数组)的操作,即定义一个对线性表操作的函数来实现判断输赢。
五子棋棋盘落子的位置与二维数组元素的对应,数组元素初始化为0,红方棋子落子对应数组元素置1,黑方棋子落子对应数组元素置10.
当落子时程序进行判断五子连珠的情况,判断要在8个方向进行,8个方向分成4组,每组包含两个完全相反的方向。
当向右方向试探时,对应棋子位置的数组元素的行下标不增加(加0),列增下标加1,这样对应一个2元组(0,1);向下方向试探时,对应棋子位置的数组元素的的行下标加1,列下标加0,对应的二元组为(1,0),。
。
依次类推。
行
列
右
0
1
右下
1
1
下
1
0
左下
1
-1
左
0
-1
左上
-1
-1
上
-1
0
右上
-1
1
为了方便算法设计,将8个方向拆开成两个对应相反方向的二维数组,存储4个方向及对应相反方向值。
一个数组为:
cc[4][2]={0,1,
1,1,
1,0,
1,-1};
另一个数组为:
dd[4][2]={0,-1,
-1,-1,
-1,0,
-1,1};
当落子时,同时向4个方向及其相反方向在连续的位置上搜索同色棋子的对应的数组元素值,并求和,两个相反方向求和的结果相加,如果是>=6并且<=10,判断红棋胜出,如果相加结果为>=60,判断黑方胜出。
参考算法:
intCWin:
:
win(intx,inty)
{
constintcc[4][2]={0,1,
1,1,
1,0,
1,-1};
constintdd[4][2]={0,-1,
-1,-1,
-1,0,
-1,1};
ints,s1,s2,x1,y1;
for(inti=0;i<4;i++)
{
s=chess[x][y];
s1=chess[x][y];
s2=chess[x][y];
x1=x;
y1=y;
x1+=cc[i][0];
y1+=cc[i][1];
while(chess[x1][y1]==s)
{
if(((x1>=0)&&(x1<15))&&((y1>=0)&&(y1<15)))
{
s1+=chess[x1][y1];
x1+=cc[i][0];
y1+=cc[i][1];
}
else
break;
}
x1=x;
y1=y;
x1+=dd[i][0];
y1+=dd[i][1];
while(chess[x1][y1]==s)
{
if(((x1>=0)&&(x1<15))&&((y1>=0)&&(y1<15)))
{
s2+=chess[x1][y1];
x1+=dd[i][0];
y1+=dd[i][1];
}
else
break;
}
if((s1+s2)>=6&&(s1+s2)<=10)return1;
if((s1+s2)>=60)return2;
}
return0;
}
5、程序结构(UML类图)(供参考)
6、使用VisualC++6.0实现参考步骤:
1)StartVisualC++6.0IDE
2)CreateaSingleDocumentInterfaceProject(MFCAppWizard(exe));
SelectCFormViewasBaseClassoftheClassViewintheproject;
3)InterfaceDesignasabove;
4)AddvariablesfortheEdit-BoxandRadio-ButtoncontrolstoClassView;
5)Addastructwhichincludes2integermembers
6)Addastructasastackinwhichincludes2members,oneisainteger,anotherisaarraywhichtypeisdefinedatStep5);
7)Addaclasstotheproject,inwhichhasa15x15matrixandsomefunctionsoperatingonthematrix;
8)Addmouseclickeventprocessingfunctionsforthe2buttonsputontheCFromViewandwritecode;
9)ModifytheconstructoroftheClassView;
10)AddafunctiontotheClassViewtodrawchessnuts
11)Debugandruntheproject;
7、Referencecode:
//Win.h
structElement
{
intx;
inty;
};
structData
{
inttop;
Elementelement[225];
voidinitData()
{
top=0;
for(inti=0;i<225;i++)
{
element[i].x=0;
element[i].y=0;
}
}
Elementpush(Elemente)
{
element[top]=e;
top++;
returne;
}
Elementpop()
{
Elemente1={0,0};
if(top>0)
{
top--;
e1=element[top];
}
returne1;
}
};
classCWin
{
public:
voidinit();
intwin(intx,inty);
intchess[15][15];
CWin();
virtual~CWin();
};
//Win.cpp
CWin:
:
CWin()
{
this->init();
}
CWin:
:
~CWin()
{
}
intCWin:
:
win(intx,inty)
{
constintcc[4][2]={0,1,
1,1,
1,0,
1,-1};
constintdd[4][2]={0,-1,
-1,-1,
-1,0,
-1,1};
ints,s1,s2,x1,y1;
for(inti=0;i<4;i++)
{
s=chess[x][y];
s1=chess[x][y];
s2=chess[x][y];
x1=x;
y1=y;
x1+=cc[i][0];
y1+=cc[i][1];
while(chess[x1][y1]==s)
{
if(((x1>=0)&&(x1<15))&&((y1>=0)&&(y1<15)))
{
s1+=chess[x1][y1];
x1+=cc[i][0];
y1+=cc[i][1];
}
else
break;
}
x1=x;
y1=y;
x1+=dd[i][0];
y1+=dd[i][1];
while(chess[x1][y1]==s)
{
if(((x1>=0)&&(x1<15))&&((y1>=0)&&(y1<15)))
{
s2+=chess[x1][y1];
x1+=dd[i][0];
y1+=dd[i][1];
}
else
break;
}
if((s1+s2)>=6&&(s1+s2)<=10)return1;
if((s1+s2)>=60)return2;
}
return0;
}
voidCWin:
:
init()
{
for(inti1=0;i1<15;i1++)
for(intj1=0;j1<15;j1++)
chess[i1][j1]=0;
}
///FiveView.h
classCFiveView:
publicCFormView
{
…
…
public:
voiddraw(CDC*p,intx,inty);
Elemente;
Datadata;
CWinwin;
…
…
};
//FiveView.cpp
CFiveView:
:
CFiveView():
CFormView(CFiveView:
:
IDD)
{
…
m_r=0;
…
data.initData();
}voidCFiveView:
:
OnDraw(CDC*pDC)
{for(inti=30;i<=450;i+=30)
{
pDC->MoveTo(30,i);
pDC->LineTo(450,i);
pDC->MoveTo(i,30);
pDC->LineTo(i,450);
}
doublex;
doubley;
for(intn1=0;n1<15;n1++)
for(intm1=0;m1<15;m1++)
{
if((win.chess[m1][n1]==1)||win.chess[m1][n1]==10)
{
draw(pDC,n1,m1);
}
}
}
voidCFiveView:
:
O
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单机 五子棋 游戏 实现