




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2013.7 中国地质大学C语言课程设计 131.1题目描述【一担挑游戏】【要求】简单计算机模拟棋盘对弈。其中棋盘左上角坐标为(1,1),右下角为(3,3)。游戏规则如下:1.计算机移动时,使用相应函数扫描棋盘矩阵,寻找未占单元,发现空单元后,置为“O”,未发现时,报告平局后退出。2.轮到对弈者时,使用相应函数要求对弈者回答想要把“X”放在哪里。3.谁先三点连成一线了,则报告谁胜出。4.计算机与对弈者每下一步棋都会使相应位置变为“O”和“X”,便于在屏幕上显示矩阵。【提示】棋盘位置用二维数组代表,初始状态每一位置均应为“ ”(空),其分隔线(即棋盘线)可用或来分隔1.2算法设计一担挑小游戏,简单、休闲、益智。全程序大体由四部分组成:“玩家落子模块”、“计算机落子模块”、“判断胜负模块”及“打印棋盘模块”。考量到棋类游戏计算上的复杂性,本程序尽可能简化算法,使计算机简单地按照棋盘顺序落子。总流程图设计构想如下:一担挑小游戏初始化棋盘玩家落子模块计算机落子模块打印棋盘模块判断胜负模块判断最终结果各功能模块流程图设计如下:1. 玩家落子模块否开始输入想要落子的坐标row,column是该位置是否存在或未填?该位置置为“X” 【注】棋盘坐标定义为从1,1到3,3该模块要求玩家输入想要落子的坐标row,column。如果位置row-1,column-1处字符数组元素不存在或已经被占,系统给出错误提示,并要求玩家重新输入;否则该位置置为“X”。2.计算机落子模块是开始按先行后列顺序扫描棋盘否该位置是否未填?该位置置为“O”该模块设计成3*3的循环,按次序检索该单元是否为空。如果单元已被占则跳过;否则置为“O”。3.判断胜负模块开始返回正中心的棋子两条对角线是否连成线是否返回左上角的棋子第一行或第一列是否连成线是否返回右下角的棋子第三行或第三列是否连成线是否返回正中心的棋子第二行或第二列是否连成线是否返回空值用穷举法判断某行、某列、对角线是否连成一线。判断顺序如上。若某一判断为“是”,则将连成线的字符赋值给字符变量winner再交由主函数尾的程序辨析谁获胜;若一直判断为“否”,将空值赋给变量winner,再交由玩家落子模块或计算机落子模块运行。4. 打印棋盘模块开始打印棋盘边框线打印第一行棋盘线及棋子打印棋盘边框线打印第二行棋盘线及棋子打印第三行棋盘线及棋子终止主函数流程(程序设计布局)判断胜负模块开始初始化棋盘计算机落子模块玩家落子模块宣布谁胜谁负或平局结束打印棋盘模块1.3程序设计及代码分析源程序如下:#include stdio.h#include stdlib.hvoid printboard(); /打印棋盘void check(); /检查结果是否分出胜负char board33 = 0,0,0,0,0,0,0,0,0 ; /棋盘初始化 char winner=0; /标记谁是胜者int main() int row=0,column=0; /定义棋盘的行列 int step=0; /定义计算步数的变量 printf(nwelcome to this game,player!n); printboard(); /打印空棋盘 while(winner=0&step!=9) /当未分胜负时,循环双方对弈 /玩家落子 do /当棋子落在无效区时,报错 printf(nplease enter the coordinate where you want to put your X:); scanf(%d,%d, &row,&column); /输入欲落子的坐标 if(row*column9|row*column9|row*column1|boardrow-1column-1!=0); printf(nnplayer moven); boardrow-1column-1=X; /落子有效 printboard(); /即打印棋盘 step+; /每下一步步数加一 check(); /检查是否分出胜负 if(winner!=0|step=9)break; /如果是,结束游戏 /计算机落子 printf(nncomputer moven); for(row=0;row3;row+) /计算机按循环的顺序落子 for(column=0;column9|row*column9|row*column1|boardrow-1column-1!=0); printf(nnplayer moven); boardrow-1column-1=X; printboard(); step+; check(); if(winner!=0|step=9)break; /计算机落子模块 printf(nncomputer moven); for(row=0;row3;row+) for(column=0;column9|row*column3和column3,将上述判断条件改为if(row*column9|row*column3)|row3)这样,只要其中一个条件成立,则返回重新输入坐标。2. 在执行游戏时,开始未设计计算步数的变量step,结果棋盘下满时,不论是否分出胜负,均报告平局draw!【解决方法】设计变量step,在玩家或计算机每下一步后使其加一,将对弈程序的循环条件改为while(winner=0&step!=9),即未分胜负且棋盘未满,再统一判断胜负平。3. 在设计计算机落子模块时,开始时玩家落子后,计算机连下好几步,因为光用两个 for循环只能要求计算机找出空位落子,不能控制计算机落子次数。几经考虑,设计了两种方案:(1) 追加一个标记变量k,使计算机未落子时, k置为0,否则置为1;再在for循环中检查k的值,一旦为1,退出循环。设计如下:k=0;for(row=0;row3;row+) if(k=1)break; for(column=0;column3;column+) if(boardrowcolumn=0) k=1; boardrowcolumn=O; break; (2) 调用stdlib.h头文件中的goto函数。计算机一旦落子,则执行,程序直接跳到循环末尾。设计如下:for(row=0;row3;row+) for(column=0;column代码分析判断胜负函数5. 在考虑计算机的落子模式时,我曾尝试过更加复杂的算法,使其不单纯按顺序扫描棋盘落子,力图使其优先追加判断胜负的能力,能赢时下赢着,快输时下守着,但算法实在太复杂,考虑的情况太多,连用八个if语句的嵌套,程序变得十分臃肿难看,而且还不够且运行总是异常,考虑到时间因素,很遗憾未能深入考虑,优化设计,就此搁浅。 结语:此次游戏软件的设计,不但让我熟悉了软件制作的流程,熟悉了用C进行程序开发的基本方法,还让我了解了软件制作的来之不易,更加坚定了“支持正版,打击剽窃”的信念。一款好的软件必定集结了各种优秀的要素:良好的制作环境、熟练的软件设计师、精炼到位的算法、清晰明了的模块化程序设计、千百次的编译调试等等。开始制作游戏时,我一门心思考虑算法,碰到种种障碍,后来通过海量地查阅资料,才深感知识浅薄、无可奈何。有些问题只要调用一个函数就能解决,我却洋洋洒洒罗列了各种情况分类讨论。差距是显然的。知识匮乏加经验欠缺,这是我在这几天所深深领会的东西。我尽己所能完成了题目的要求。在整个课程设计中,我认为最重要的就是耐心和细心。细心,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中信息技术粤教版选修3教学设计-2.1.1 因特网的接入方式
- 新能源汽车工程专业实践基地建设的战略思路
- 个案工作考试题目及答案
- 强化信息技术与智能制造技术的融合应用
- 服装考评员考试题及答案
- 电气类专业课程体系改革中的信息化建设与应用
- 园艺基础试题及答案电大
- 桥梁装备生产线项目经济效益和社会效益分析报告
- 生命教育内容与方法的家校社协同创新探索
- 液流电池制造项目经济效益和社会效益分析报告
- 机动车检测工资格证考试题(附答案)
- 护士沟通技巧与人文关怀护理课件
- 2025年上半年海南三亚市知识产权保护中心选聘事业单位6人重点基础提升(共500题)附带答案详解
- 2025年辽宁现代服务职业技术学院单招综合素质考试题库附答案
- 电力电缆模拟题及答案
- 2025年药物制剂工(中级)考试题库(附答案)
- 仿古建筑施工常见问题及应对策略
- 辽宁省沈阳市2024-2025学年八年级上学期期末考试英语试题(含答案无听力原文及音频)
- 小班晨间活动体能大循环
- 绿化小型工程合同范例
- 涂层材料与叶轮匹配性研究-洞察分析
评论
0/150
提交评论