程序设计综合课程设计五子棋c++课程设计.doc
五子棋第一章 课程设计目的和要求1.1 C+语言课程设计的目的 进一步培养结构化程序设计的思想,加深对高级系统语言基本语言要素和控制结构的理解,针对C+语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。此课程设计着眼于知识的运用,把平常学的知识运用到课程实践中来,本身就是考察我们知识运用能力。要求熟悉运用一些编程软件,对我们所学的理论知识进一步的深化。1.2 C+语言课程设计实现的要求使用C+语言编写一个基于控制台的简单程序,使学生掌握简单的程序设计技巧。同时设计一个简单的五子棋对弈系统,可以实现五子棋的基本功能,是一款娱乐用的小型程序。第二章 课程设计任务内容五子棋对弈系统 设计一个五子棋系统程序,实现对五子棋进行运行。基本要求:五子棋是有两个人在一盘棋上进行对抗的竞技活动。在对局开始时,先由用户选择哪方开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围交叉点上落子,如此轮流落子,知道某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方程就算获胜。此时算法结束,当有任何一方退时出,都可在算法中实现。 第三章 详细设计说明3.1 功能设计(1)由两个玩家分别下棋,当某一玩家五子相连,则赢。 (2)界面要求:初始状态显示棋盘,并显示两个玩家的操作键及初始玩家名称;游戏进行状态动态显示棋盘,不同玩家的棋子用不同符号显示,屏幕上显示当前玩家号,结束时显示赢家名称。开始3.2五子棋对弈系统流程图 白放下子判断该位置是否有棋找另一位 是白方下子 否判断是否重现开局跳出白棋获胜判断白方是否胜出 是否黑方下子 否 判断该位置是否有棋棋 否游戏结束找另一位 是否 黑方下子 跳出黑棋获胜判断黑方是否胜出 是判断该位是否图 3-1程序总体图白(黑)方下子 是白(黑)子在水平方向是否大于4 白(黑)方获胜否白(黑)子在垂直方向是否大于4是进入选择是否重新开局框白(黑)方获胜 否 是白(黑)子在正对角线方向是否大于4白(黑)方获胜 否 是白(黑)子在反对角线方向是否大于4白(黑)方获胜否黑(白)方下子图3-2算法流程图3.3 软件中实现各项功能的函数与程序代码主要函数、结构体和链表Int a; /纪录坐标位置Int b; /纪录坐标位置Int player, /用于在【a】【b】处落子Int nameNN1; /存放棋盘数据 分别用1、2、0表示不同颜色子和空Int win(), /判断胜负void reste() /重置棋盘void chessboard()/下棋并绘棋盘类的使用:class Qipanpublic:int a;int b;int player; /用于在【a】【b】处落子int nameNN;/存放棋盘数据int win();/判断胜负void reset();/重置棋盘void chessboard();/下棋并描绘棋盘本次程序设计主要设计了五个模块1.绘制棋盘模块 当游戏初始化时,和每当落子消息触发时,都需要对棋盘进行重绘。这里用特殊符号“”“”“+”分别来描绘白子、黑子和棋盘空格。这个函数主要完成了以下工作: 装载棋盘二位数组并进行绘制。 根据棋盘数据绘制棋子。 绘制最后落子指示规矩。绘制棋牌;定义变量I,jI=0;i+i<N J=0;j+判断:a=i&&=ji>N退出循环j>N退出循环判断:nameij=0NoYes输出“ ”NoYes “ + ” 判断:nameij=0输出NoYes输出“ ”输出“ ”完成扫描1行;输出换行符棋盘绘制结束 图3-32键盘操作控制模块 此模块主要用于处理与用户的交互过程。即完成落子判断过程。 此模块主要完成以下工作: 从键盘读入控制信息(上下左右移动和落子)。 判断是否在棋盘内按落子键,和移动是否超出棋盘范围。 判断落子点是否已有棋子。键盘操作控制Input=/输入键为空格Input=D=dInput=AaInput=S=s =sInpu=Ww从键盘输入控制键;int intput=getch()判断:nameab=0如果b<N-1如果b<0如果a<N-1如果a>0NoYesa- -控制左移a- -;控制上移a+;控制下移此处有子,要求重新输入可以落子 若player=1 则赋值为2 反之亦然d+控制右移 图3-43判断胜负模块 这是游戏中一个极其重要的算法,用来判断当前棋盘的形势是哪一方获胜。五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,如图:图 3-5判断胜负方向 这个算法是本系统里的win成员函数。需要它接受一个棋子颜色的参数,然后返回一个布尔值,这个值指示是否胜利。这里用一个数组int cout8来控制2种颜色4个方向的棋子情况。Cout1中i为单位表示白子个数,其中count1=j,表示横方向白子连续个数为j,cout3=j表示竖方向上,cout5=j,表示从左到右斜方向,cout7=j表示从右到左斜方向。双数表示黑子,同白子原理一样。1).横向判断流程图“” 定义变量:lint i,j,k/控制循环变量 int count8=0, 循环控制列:J=0,j+ J>=N J, J<N 循环控制列:I=0,j+ IiIIi I>=N输出结果;win=output(count,win) I<N 循环控制 5:K=0,k+ k>=5 K<5Name11+k =1 Name1 i+k =2 Count0+ Count1+图3-62).竖向判断流程图“|” 循环控制 5:K=0;k+K>5 k>=5 Name1+kj=1 Namei+k1=2 Count2+ Count3+图3-73).从左到右斜方向“” 循环控制 5:K=0;k+ K>5 k>=5Name1+kj-k=1 Namei+kj-k=2 Count4+ Count5+图3-84) .从右到左斜方向“/” 循环控制 5:K=0;k+ K>5 k>=5Name1+kj-k=1 Namei+kj-k=2 Count6+ Count7+图3-9图3-94.重置棋盘模块 在每局游戏开始的时候都需要调用这个函数reset()将棋盘清空,也就是棋盘的初始化工作。在这个函数中,主要发生了这么几件事情: 将nameNN中每一个落子位都置为无子状态(0)。 将光标的初始位置,置于棋盘正中即a=N/2,b=N/2。 默认的先手顺序是黑子先手,置player=1。5.游戏结束模块 这一模块主要用于释放内存,用输出流语句输出结束信息,并控制循环退出程序。3.4 限制条件在windows xp . WIN7 下的Visual C+ 6.0下运行第四章 软件使用说明4.1 软件使用说明及出现的问题该程序可以实现对学生信息的录入和显示,安装Visual C+ 6.0中文版后,在工具栏“文件”中单击“新建”选项,单击“Win32 Console Application”,输入工程名“郭”,单击“A simple Application”。在“文件”中单击“新建”,选择“C+ Source file”输入文件名称“瑜”。开始输入程序,程序输入完成,单击“Compile”,待程序无误后,Build execute。4.2 运行结果软件使用结果1.进入游戏主界面图4-12.点击1开始游戏图4-23.继续点击1或2游戏过程中图4-34.判断胜负图4-45.在主界面中点击2游戏说明图4-56.在主界面中点击0退出游戏图4-6第五章 课程设计心得与体会课程设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C+语言又是最常见,功能最强大的一种高级语言,因此做好C+语言课程设计是十分必要的。通过几周的课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做这么长的程序设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。我做的是五子棋设计,虽然是很简单的一个小的程序,但对我来说却是一个很大的困难。更加是第一次做课程设计,所以做了一个下午却丝毫没有进展,最主要是不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多功能上的欠缺和漏洞,可我还是很高兴的。无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C+语言的一次实践作业,自己进步的证明。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!附录1:参考文献1、谭浩强 著.C+程序设计教程.清华大学出版社2、陈维兴 林小茶 编著.C+面向对象程序设计.中国铁道出版社3、田淑清, C语言程序设计,北京:高等教育出版社,2006年1月4、David J.Kruglinski,Scot Wingo,George Shepherd,Visual C+6.0技术内幕(第五版),希望图书室译,北京:北京希望电子出版社,2001 年1月附录2:程序清单/+fivechess_qxf.h开始+#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<iostream>using namespace std;#define N 21int output(int count8,int win);/输入胜负void explain();/游戏说明class Qipanpublic:int a;int b;int player; /用于在【a】【b】处落子int nameNN;/存放棋盘数据int win();/判断胜负void reset();/重置棋盘void chessboard();/下棋并描绘棋盘;/+fivechess_qxf.h结束+/=main.cpp开始#include<stdio.h>#include<stdlib.h>#include<conio.h>#include"fivechess_qxf.h"#include<iostream>using namespace std;void main()Qipan qipan;int t,j,i;qipan.a=N/2;system("cls");qipan.b=N/2;for(i=0;i<=N;i+)for(j=0;j<=N;j+)qipan.nameij=0;docout<<"1.开始游戏"<<endl;cout<<"2.游戏说明"<<endl;cout<<"0.结束游戏"<<endl;scanf("%d",&t);switch(t)case 1:cout<<"*"<<endl;cout<<"1.先手白棋"<<endl;cout<<"2.先手黑棋"<<endl;cout<<"*"<<endl;scanf("%d",&qipan.player);dosystem("cls");qipan.chessboard();while(qipan.win();qipan.reset();break;case 2:explain();break;case 0:cout<<"谢谢使用!"fflush(stdin);j=getch();break;system("cls");while(t);/=main.cpp结束=/=reset.cpp开始=#include<"fivechess_qxf.h">/重置棋盘void Qipan:reset()int i.j;for(i=0;i<N;i+)for(j=0;j<N;J+)nameij=0;a=N/2;b=N/2;player=1;/=reser.cpp结束=/=explain.cpp开始=#include<"fivechess_qxf.h">#include<iostream>#include<stdlib.h>#include<conio.h>using namespace std;/游戏说明void explain()int j;cout<<"*游戏说明*"<<endl;cout<<"1.按w向上移动光标"<<endl;cout<<"2.按s向下移动光标"<<endl;cout<<"3.按a向左移动光标"<<endl;cout<<"4.按d向右移动光标"<<endl;cout<<"5.按空格放子"<<endl;cout<<"*"<<endl;cout<<"按任意键回到主菜单"<<endl;fflush(stdin);j=getch();/=explain.cpp结束=/=chessboard.cpp开始=#include<"fivechess_qxf.h">/刷新棋盘 落子下棋void Qipan:chessboard()int i,j;for(i=0;i<N;i+)for(j=0;j<N;j+if(a=i&&b=j)cout<<""else if(nameij=0)cout<<""else if(nameij=1)cout<<""elsecout<<"";cout<<endl;fflush(stdin);int input=getch();switch(input)case'w':if(a>0)a-;break;case's':if(a<N-1)a+;break;case'a':if(b>0)b-;break;case'd':if(b<N-1)b+;break;case'':if(nameab=0)player=palyer=1?2:1;nameab=player;elsecout<<"此处有子!"<<endl;cout<<"按任意键继续"endl;fflush(stdin);j=getch();break;/=chessboard.cpp结束=/=win.cpp开始=#include<"fivechess_qxf.h">/判断胜负int Qipan:win()int i.j,count8=0,k,win;/判断从左到右是否5个for(j=0;j<N;j+)for(i=0;i<N;i+)for(k=0;k<5;k+)if(nameij+k=1)count0+;if(nameij+k=2)count1+;win=output(count,win);/判读列是否5个for(j=0;j<N;j+)for(i=0;i<N;i+)for(k=0;k<5;k+)if(namei+kj=1)count2+;if(namei+kj=2)count3+;win=coutput(count,win);/判断左到右斜方向是否有5个for(j=0;j<N;j+)for(i=0;i<N;i+)for(k=0;k<5;k+)if(namei+kj+k=1)count4+;if(namei+kj+k=2)count5+;win=output(count,win);/判断右到左斜方向是否有5个for(j=1;j<N;j+)for(i=0;i<N;i+)for(k=0;k=5;k+)if(namei+kj-k=1)count6+;if(namei+kj-k=2)count7+;win=output(count,win)return win;/输出胜负int output(int count8,int win)int i,j;if(count0=5 | count2=5 | count4=5 | count6=5)win=0;cout<<"白子赢了"<<endl;cout<<"按任意键回到主菜单"<<endl;fflush(stdin);j=getch();if(count1=5 | count3=5 | coun5=5 |count7=5)cout<<"黑子赢了"<<endl;win=0;cout<<"按任意键回到主菜单"<<endl;fflush(stdin);j=getch();for(i=0;i<8;i+)counti=0;return win;/=win.cpp结束=