




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
黑白棋游戏的开发与设计一、需求分析1功能需求黑白棋游戏通常是黑白两个面,一方执白,一方执黑。每次在棋盘上走一个棋子,无论横竖线或斜线均可,只要两个同样颜色的将另一个颜色的夹在中间了,就可以将这个颜色翻过来,例如两个白子包住一排黑子就可以把这些黑子变成白子,通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。2非功能需求(1)界面友好,图形界面,游戏开始前有游戏的简单使用说明,方便玩家使用;(2)具有较好的容错能力,玩家在游戏过程中,除了规定的按键外,其他按键均忽略,不予处理;(3)发布游戏时,将图形驱动加载到程序中,使系统具有良好的可扩展性和平台适应性,可在任何PC机上运行。二、系统设计1设计思路从已知的黑白棋游戏中可知,应该用二维数组表示程序的数据,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格中的状态,共有三种情况,分别是空格、黑棋和白棋,这样给数组元素的取值设定为0、1、2。其中0代表空格,1代表白色棋子,2代表黑色棋子。这样程序的主要工作是接收棋手按键操作,一旦接收到回车键,说明棋手摆子,先判定是不是有效位置,也就是能不能包围住对方棋子,如果能,便对棋子所在的位置往上下、左右、左上、左下、右上、右下8个方向寻找被包围住的所有棋子(必须是连续的,中间不能有空格),将这些被包围住的对方棋子都变成自己的棋子,然后对当前棋盘中的黑白棋个数进行统计并输出结果。如果没有这样的位置可以落子,则停步,让对方走棋,重复上述步骤,直到游戏结束。如果想提前终止游戏可以按Esc键。2结构设计 棋盘状态用数组a88初值为0表示空格。函数的实体比较简单,因为要输出图形,所以应初始化图形系统,图形工作方式正确确定后,画出棋盘,调用playtoplay()人人对弈函数开始游戏。一旦游戏结束后,关闭图形系统,程序结束。(1)main()主函数:按照语法规则,首先定义使用到的常数、全局变量、函数原型说明。棋盘状态用数组a88,初值为0,表示空格。函数的实体比较简单,因为要输出图形,所以应初始化图形系统,图形工作方式正确确定后,画出棋盘,调用playtoplay()人人对弈函数开始游戏,一旦游戏结束后,关闭图形系统,程序结束。(2)DrawQp()画棋盘函数:背景颜色设为蓝色,从坐标(100,100)开始每隔40个单位用白色画一条水平直线,一条垂直线,构成棋盘,用循环语句实现。画线函数line()的参数为线的起点和终点坐标,注意要计算正确。函数setfillstyle()可以设置填充模式和填充颜色,fillellipse(int x,int y,int xradius,int yradius)以x和y为圆心,xradius和yradius为水平和垂直轴画一填充椭圆,当xradius和yradius相等时,则画出的是圆,用它表示棋子。(3)SetPlayColor()设置棋子的颜色:因为是两个棋手,同时棋盘也在不断变化,所以要判断棋手和棋盘变化设置了这个函数,函数的参数为整型变量t,根据t的值来设计填充棋子的当前颜色,值为1代表白棋,值为2代表黑棋。(4)MoveColor()恢复原来格子的状态:由于棋手在走棋的时候,他的棋子总是首先出现在棋盘的左上角,棋手要通过移动光标键走到要落子的位置,在经过的路程上显示当前棋子,就会覆盖原来的棋盘状态。所以,一旦棋子走过后,就应恢复原来的状态,是空格的依然显示空格,是棋子的就显示原来棋子的颜色,因为棋子移动过程并没有改变数组元素的值,所以可以根据数组元素的值判定原来的状态,如果是1,就恢复白色棋子,值是2则恢复黑色棋子,否则恢复蓝色空格。(5)playtoplay()人人对弈函数:这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:1)按Esc键程序可以随时结束。2)按上下左右光标键,则改变棋子移动的坐标值。3)按回车键后判断:如落子的位置已经有棋则无效,继续压键。如落子位置是空格,可以将棋子落入格内,调用函数QpChange()判断是否引起棋盘的变化,函数值为1有变化,为0没变化。如果棋盘有变化,说明将包围的对方棋子吃掉,统计当前分数,如果棋盘没有变化,则说明落子的位置无法包围对方的棋子也视为无效棋。可以继续寻找合适的位置,但开始统计其落子次数,一旦尝试次数超过当前棋盘的空格数,则说明他无棋可走,则放弃此步,让对方下棋。如果棋子变化后,格子已占满64格或一方棋子为0,则游戏结束,显示胜利方信息。按任意键程序结束。4)重复上述步骤,直到游戏结束。(6)QpChange()判断棋盘变化:当棋手按回车键落子后,就要分贝往8个方向判断是否包围住对方棋子,如果是,则改变棋盘,也就是棋盘上黑白棋子的个数要发生变化。表示黑白棋的图形用屏幕上的像素坐标,而棋子的状态是数组元素a,所以要根据落子的坐标x和y计算出对应数组元素a的下标i和j,i代表行,j代表列,对于8*8的棋盘,它们的值为0-7,如果j6,往右边判断,从当前位置开始,用循环语句判断右边是否有一个或连续多个对方的棋子,遇到自己的棋子或空格则结束循环,如果循环结束不是遇到空白,且列坐标小于8,则说明这些位置的棋子是被自己包围的对方棋子,将它们吃掉也就是改变自己的棋子,如果有棋子发生了变化,给棋盘变化标识值赋值为1,同样的方法向左、上、下等8个方向进行判断,并作相应的变化。如果所有方向都判断过,并且没有引起棋盘的变化,则棋盘变化标识值yes为0返回yes结束本函数。(7)DoScore()处理分数:根据当前数组元素的值判断分数,也就是各方棋子的个数,如果数组元素值为1,白棋棋子数加,如果数组元素值为2,则黑棋棋子数累加。(8)PrintScore()输出成绩:利用设置实体填充模式填充矩形条清除掉前次的成绩,再利用sprintf()函数将整数转换为字符串的形式,再利用outtextxy()函数将成绩输出。(9)playWin()输出胜利者结果:根据分数值score1和score2的大小得出下棋的结果,输出赢者信息。黑白棋C语言课程设计三、系统实现1playtoplay()函数流程图 如图1所示。图1 playtoplay()函数流程图2主函数流程图如图2所示。 图2 主函数流程图黑白棋程序的整体流程是主函数main()通过调用图形系统初始化函数initgraph()、棋盘绘制函数DrawQp()、对战函数Playtoplay()以及关闭图形系统函数closegraph()来实现游戏程序。函数DrawQp()绘制棋盘并进行游戏状态初始化。对战函数playtoplay()使用两个嵌套的while循环来模拟走棋的过程,外层循环用来变换棋手,内层循环用来模拟棋手的具体走棋过程,关键是调用函数QpChange()来判断棋盘的变化。按Esc键直接退出游戏。除此之外,实现黑白棋游戏的其他函数包括SetPlayColor()、MoveColor()、DoScore() 、PrintScore()等。函数SetPlayColor()用来设置棋子的初始颜色为黑色和白色。函数MoveColor()完成恢复棋盘原始状态的功能:棋手每走完一步棋后,该函数恢复棋盘格子的原始状态,即如果是从起点出发就将格子恢复为红色,其他情况如果是1,则恢复白色棋子,是2则恢复黑色棋子。函数DoScore()用来处理棋手所得的分数。函数PrintScore()完成在不同的位置输出棋手的成绩。函数PlayWin()输出最后胜利者的结果信息。黑白棋游戏的棋盘由8*8个格子组成,每个格子的大小为40*40的屏幕像速。棋盘左上角的坐标为(100,100),右下角的坐标为(420,420),棋盘左上角格子的中心坐标为x=120,y=120.游戏中棋子为半径15像速的圆,分别填充为黑色和白色。程序采用8*8二维数组Map来存放对局双方对弈情况即双方在棋盘上的对弈棋子。数组元素Map00在棋盘左上角第一个位置相对应,数组元素Map01与棋盘第一行第二个位置相对应,以此类推。因此,数组元素Map70对应着棋盘左下角的落子位置,元素Map77对应着棋盘右下角位置棋子。程序约定:数组元素值为1代表黑方,2代表白方,否则说明棋盘上该位置对弈双方尚未落子。棋手下棋时,棋子每次都在棋盘左上方的初始位置(120,80)出现,以供游戏者移动。程序中用变量x、y分别代表当前棋子的横、纵坐标(x、y)。用下棋手数t来标识对弈棋手,t不能被2整除则代表黑方,能被2整除则代表白方棋手。因此根据下棋手数t记录黑、白双方对弈棋局Map的代码为:If(t%2=1) /*黑方棋手,则将棋盘数组中对应元素置1*/Map(x-120)/40(y-120)/40=1;Else /*白方棋手,则将棋盘数组中对应元素置2*/Map(x-120)/40(y-120)/40=2;游戏中判断对弈双方是否可以在当前位置(x,y)落子是实现的关键。落子的判断条件为:当前位置(x ,y)不是初始位置(120,80)。同时在该位置黑、白双方尚未落子,并且可以翻转对方棋子时,方可在当前位置落子。程序首先进行判断:Y!=80&Map(x-120)/40(y-120)/40!=1&Map(x-120)/40(y-120)/40!=2即当前棋子位置不是初始位置,并且双方均未落子。在满足上述条件的前提下,通过调用函数QpChange()来判断当前下棋位置是否乐意翻转对方棋子,并最终确定此置是否可以落子。函数QpChange()入口参数包括落子当前的位置坐标(x,y),以及下棋手数t。函数根据当前棋局的情况,即记录在数组Map中的游戏双方对弈的内容,以棋手下棋的当前位置为中心对棋盘的八个方向进行判断,决定是否可以使对方棋子翻转,同时修改被翻转棋子的颜色,最后将棋盘修改标记yes返回。这里以向右的判断为例,来说明函数QpChange()的具体实现:初始时棋盘修改标记yes为0,即为棋子翻转。通过行列坐标交换计算当前棋子在棋盘数组Map中的,当棋子位于棋盘8列中的前6列时才向右进行判断;遇到己方棋子或空格时停止,并将位于两位置间的对方棋子变为己方颜色的棋子。若存在被改变颜色的棋子,则置位棋盘修改标记yes为1。若无棋子颜色翻转,则不做修改,其他7个方向的情况类似。程序通过检测方向键来移动旗子,移动一步后重复落子条件的判断,满足落子条件则落子,然后换对手下棋,若累计尝试落子次数超过棋盘上剩余空格的数量时,当前棋手失去一次落子机会,换对手下棋。游戏者分数score的更新通过函数DoScore()实现。该函数通过统计保存对弈情况数组Map的元素值实现对棋手得分的更新。四、系统测试该部分主要编写测试计划,记录测试的过程和结果,并对测试结果进行分析总结,优化系统。1功能测试测试功能测试结果用例1测试开始游戏打开游戏主界面用例2测试下棋,在正确位置下棋正确显示出下子后的棋盘状态用例3测试下棋,在错误位置下棋提示玩家下棋位置错误,重新下棋用例4测试退出退出黑白棋游戏用例5测试游戏结果提
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年电大《学前儿童发展心理学》期末试题及答案
- 第4课《人的生命周期》教学设计-2024-2025学年生命安全教育三年级武汉版
- 爬行类繁育工质量管控考核试卷及答案
- 修笔工工艺考核试卷及答案
- 第23课 制作简单的三维动画教学设计-2025-2026学年小学信息技术(信息科技)五年级冀教版
- 水生植物老年保健食品创新创业项目商业计划书
- 林业生态旅游购物服务创新创业项目商业计划书
- 森林树屋创新创业项目商业计划书
- Lesson 89 For sale教学设计-2025-2026学年初中英语第一册 下半册新概念英语
- 灌排工程工岗位操作规程考核试卷及答案
- 会场布置及座次安排
- (正式版)HGT 6313-2024 化工园区智慧化评价导则
- 碳足迹核算与生命周期评价方法
- 2024年中国人寿:养老险上海分公司招聘笔试参考题库含答案解析
- 自我同一性理论与经验研究
- 二十四节气与养生
- 企业安全培训课件-网络与信息安全
- 供应商罚款联络函
- 上海交通大学中文主页
- 骨关节外科问诊知识讲座
- 振荡指标MACD(波段操作精解)
评论
0/150
提交评论