三子棋小游戏课程设计计算机学院计算机科学与技术专业《程序设计综合课程设计》报告(2011/2012学年第一学期) 学生姓名: 学生班级:学生学号:指导教师:2012年01月04日三子棋小游戏目录第一章程序设计的目的和要求 1 1.1课程设计的目的 ......1 1.2课程设计的要求 1第二章课程设计任务内容 32.1课程设计题目 32.2课程设计介绍 3第三章详细设计说明 ..43.1 流程逻辑............................................................ .43.2 限制条件 (5)3.3 运行结果 (5)3.4 实验过程 (8)第四章实验总结及特色 114.1调试结果及截图 11第五章课程设计心得及体会 13附录? 参考文献 15附录? 程序代码 16第一章课程设计目的和要求目的通过此次课程设计,进一步加深对C++语言和运用的了解,将理论知识运用于开发的实践,并在实践中逐步掌握软件工具的使用。
巩固已经学习过的C++理论知识;进一步学习程序设计、程序调试的能力。
进一步学习面向对象编程的知识和程序调试的能力; 增强Visual C++编程环境的应用能力掌握并且熟练应用《C++程序设计》中所学知识,并学会运用。
掌握函数功能的划分方法,并运用此方法解决问题。
学会程序测试方案的制定,并且实现程序的测试。
通过此次实践,积累经验,提高分析和解决问题的能力。
第二节要求课程设计需要从整体来考虑,在大的方向下来考虑小的模块,在继续分工。
作到最小化,可执行化。
对于课程设计需要自己筹划一下自己如何去下手,让自己的方案能够用C++来执行。
对于运行结果的处理,再运行程序时可能会遇到一些其他问题,对于运行结果的处理主要是在达不到自己的期望是,就要对其进行分析。
错误的改正,在对于编程中错误的改正也是一重要的步骤,学会错误的改正才能更好的提高自己。
4)通过c++课程设计,对c++语言的应用及实现有更加深入的认识和理解第二章课程设计任务内容2.1课程设计题目井字棋小游戏2.2 课程设计介绍“井字棋”的棋盘很简单,是一个3×3 的格子,类似于“五子棋” “五子棋”的规则是一方首先五子连成一线就胜利;“井字棋”是一方首先三子连成一线就胜利。
在3*3棋盘上玩游戏,实现人机对弈,x表示计算机,0表示人。
一方取胜条件:一方的3个棋子连成一线,即或成一横线、或成竖线、或对角线。
和棋条件:棋盘填满了,但无人能赢。
第三章详细设计说明第二节限制条件该程序必须在Visual C++6.0环境中运行。
模式选择时,不管输入何种值,只要不是要求的输入都是无效的。
程序可能有时运行较慢,玩家需要等待,但是时间是非常短的。
第三节运行结果1)开始的界面由“游戏规则”和“是否先手”两部分构成,如下图,就是实现后的界面2 当选择是否先手后,就进入了游戏开始的初始界面,也是由输入输出函完成的,每次走棋前都会显示棋盘对应的编号,有利于方便玩家下棋,下方会显示每次的走棋步骤,具体实现的效果图为:3)棋盘走棋是按玩家输入的数字进行的,用“X”或“O”显示在棋盘上。
输入部分之后的效果图为:4)当一局完成时,会有“再来一盘,”的提示,若是,则会跳回到模式界面,重新选择是否先手,并开始程序。
效果图如下:5)玩家走棋时,玩家根据提示输入要走棋的位置,输入数字进行走棋,若输入错误则会提示输入错误,效果图如下:第四步实验过程1. 玩家根据游戏规则和相关提示,选择是否先手,回车键表示完成。
2. 根据提示输入相应的数字,然后在相应的位置显示出棋子“X”,同时显示出来电脑走的棋子“O”的位置。
3. 根据电脑的走棋,玩家选择自己的走棋位置。
选错位置会输出提醒,并允许重新选择。
4. 重复2-3步,直到有一方获得胜利,或者棋盘布满所有棋子,但仍未分出胜负的,显示平局。
5. 至此,一局已经结束。
后面会问“再来一盘”,根据玩家要求进行:选“y”或者“Y”,则会重新进行一局,重复上述步骤。
选“n”或者“N”则会按任意键退出。
第四章实验总结及特色1)程序具有较好的性能。
主要表现在以下几个方面:a. 是否先手选择时,不管输入何种值,只要不是要求的输入都是无效的,效果图为:玩家走棋时,任何非要求值,均报错,要求重新输入。
位置重复时也会报错,效果图为:C(一局结束时,提醒是否进行下一局时,任何非要求输入也会报错,并要求重新输入。
效果图为:第五章课程设计心得与体会程序清单#include #includeusing namespace std;typedef char chess[10]; //字符数组typedef int temparr[10]; //整型数组chess arr; //定义字符数组变量temparr brr; //定义整型数组变量int number,suc,n3,c3,n2,c2,n1,c1; void inarrdata chess a //初始化棋盘编号a[1] '1';a[2] '2';a[3] '3';a[4] '4';a[5] '5';a[6] '6';a[7] '7';a[8] '8';a[9] '9';void display chess a //输出棋盘状态cout endl;cout endl;cout " " a[1] " " '|' " " a[2] " " '|' " " a[3]endl;cout " -----------" endl;cout " " a[4] " " '|' " " a[5] " " '|' " " a[6]endl;cout " -----------" endl;cout " " a[7] " " '|' " " a[8] " " '|' " " a[9]endl;cout endl;cout endl;int arrfull //判断还有没有下棋的位置int i;int arrf 0;for i 1;i 9;i++if i arr[i]-48 //如果字符arr[i]-48等于iarrf 1; //那么arrf 1,也就是可以走棋return arrf;void cn int line //判断状态switch linecase 0:c3 c3+1;break;case 1:n2 n2+1;break;case 2:c2 c2+1;break;case 3:n1 n1+1;break;case 4:c1 c1+1;break;case 5:n3 n3+1;break;int linenum char a,char b,char c //判断状态int ln 6;if a 'X' && b 'X' && c 'X'ln 0;if a 'O' && b 'O' && c! 'O' || a 'O' && b! 'O' && c 'O' || a! 'O' && b 'O' && c 'O'ln 1;if a 'X' && b 'X' && c! 'X' || a 'X' && b! 'X' && c 'X' || a! 'X' && b 'X' && c 'X'ln 2;if a 'O' && b! 'O' && c! 'O' || a! 'O' && b 'O' && c! 'O' || a! 'O' && b! 'O' && c 'O'ln 3;if a 'X' && b! 'X' && c! 'x' || a! 'X' && b 'X' && c! 'X' || a! 'X' && b! 'X' && c 'X'ln 4;if a 'O' && b 'O' && c 'O'ln 5;return ln;int brr int *br //判断最大权值int temp,i,mb;temp -888;for i 1;i 9;i++if temp br[i]temp br[i];mb i;return mb;void manstep //人走棋处理模块int j;display arr ;if arrfull //如果棋盘上还有下棋的位置,人走一步棋cout "您要走哪一步,请输入数字(1--9):";cin j;while j 1 || j 9 || j! arr[j]-48cout "对不起,您输入的数字不对,请重新输入(1--9):";cin j;arr[j] 'O';n3 0;c3 0;n2 0;c2 0;n1 0;c1 0;number linenum arr[1],arr[2],arr[3] ;cn number ; number linenum arr[4],arr[5],arr[6] ;cn number ; number linenum arr[7],arr[8],arr[9] ;cn number ; number linenum arr[1],arr[4],arr[7] ;cn number ; number linenum arr[2],arr[5],arr[8] ;cn number ; number linenum arr[3],arr[6],arr[9] ;cn number ; number linenum arr[1],arr[5],arr[9] ;cn number ; number linenum arr[3],arr[5],arr[7] ;cn number ;if n3! 0 //您赢了display arr ;cout endl;cout "恭喜您赢了!!!" endl;suc 0;void computerstep //计算机走棋处理模块int i;if arrfull //如果棋盘上还有可下棋的位置,则计算机走棋for i 1;i 9;i++ //对每一步可走的棋进行计算if i arr[i]-48c3 0;n2 0;c2 0;n1 0;c1 0;arr[i] 'X';number linenumarr[1],arr[2],arr[3] ;cn number ;number linenumarr[4],arr[5],arr[6] ;cn number ;number linenumarr[7],arr[8],arr[9] ;cn number ;number linenum arr[1],arr[4],arr[7] ;cn number ; number linenum arr[2],arr[5],arr[8] ;cn number ; number linenum arr[3],arr[6],arr[9] ;cn number ; number linenum arr[1],arr[5],arr[9] ;cn number ; number linenum arr[3],arr[5],arr[7] ;cn number ;brr[i] 128*c3-63*n2+31*c2-15*n1+7*c1 ; //计算此步权值arr[i] i+48;elsebrr[i] -999;arr[brr brr ] 'X'; //确定计算机走哪一步,权值最大的一步c3 0;n2 0;c2 0;n1 0;c1 0;number linenum arr[1],arr[2],arr[3] ;cn number ; number linenum arr[4],arr[5],arr[6] ;cn number ;number linenum arr[7],arr[8],arr[9] ;cn number ;number linenum arr[1],arr[4],arr[7] ;cn number ;number linenum arr[2],arr[5],arr[8] ;cn number ;number linenum arr[3],arr[6],arr[9] ;cn number ;number linenum arr[1],arr[5],arr[9] ;cn number ;number linenum arr[3],arr[5],arr[7] ;cn number ;if c3! 0 //计算机已赢display arr ;cout endl;cout "计算机赢了!!!" endl;suc 0;elsesuc 0;int maincout "游戏规则:" endl "棋盘格式如图,人和计算机在棋盘上交替走棋" endl;cout "约定计算机使用符号X,人使用符号O" endl;cout "谁先使一横行或一竖行或对角线上有三个自己的符号,就胜利了~" endl;string s "y";string ch;while s "y"||s "Y"inarrdata arr ; //棋盘坐标编号display arr ; //显示初始棋盘suc 1;cout "请选择您是否先走? y/n ";cin ch;while ch! "y"&&ch! "Y"&&ch! "n"&&ch! "N" cout "错误!请输入y或n:";cin ch;if ch "y" || ch "Y" //输入Y,表示人先走棋while sucmanstep ;computerstep ;else //计算机先走棋while succomputerstep ;if sucmanstep ;if n3 0&&c3 0cout endl "和棋!" endl endl;cout endl "再来一盘 y/n ?";cin s;while s! "y"&&s! "Y"&&s! "n"&&s! "N" cout "错误!请输入y或n:";cin s;return 0;271输入y/n 开始电脑先手进行游戏玩家先手进行游戏游戏结束Yn。