《第三组黑白棋报告.doc》由会员分享,可在线阅读,更多相关《第三组黑白棋报告.doc(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、黑白棋报告 C语言课程设计 课 程 设 计 报 告题目: 关于黑白棋的程序设计报告_ 班级: 10应用(2)班 _ 组长姓名:丘诗明 _组员姓名:张建伟,李荣镇,梁仰晃,莫紫扬 填表时间: 2011 年 12月 13日摘要1关于C语言C语言是国际上广泛流行的计算机高级语言,它适合作为系统描述语言,即可以用来编写系统软件,也可以编写应用软件。在早期的操作系统软件主要是汇编语言编写的,但汇编语言依赖于计算机硬件程序的可读性和可移植性级语言,而C语言兼具一般语言优点还能克服其他语言的缺点1。2关于课程设计学习计算机语言的唯一目的是应运,而应运要通过程序设计来体现的。进行程序设计,需要很强的逻辑思维能
2、力,是一种极富创造性的智力劳动。这样可以认为,语言是一种技能,程序设计是一门科学7。课程设计作为集中实践性教学环节,应着重提高学生的自学能力,独立分析、解决问题的能力和动手进行实验的能力7。为了培养学生自学能力,对于设计或实验中可能碰到的重点、难点,只要通过典型分析和讲解,启发学生的思路和自学的方法,以便达到举一反三的作用。设计中还要教给学生查阅资料、使用工具书的方法,让他们遇到问题时,不是立刻找老师,而是通过独立思考,查阅资料和书籍,自己寻找答案。3关于黑白棋通过做黑白棋游戏让我初步学会了怎样编写程序,怎样使一个程序运行,黑白棋的游戏是要在一个8*8的网格中进行,而数组属于构造体类型,数组是
3、具有相同数据类型的变量序列,序列中的每个变量成为元素,数组元素由一个统一标识的数组名和顺序好“下标”来表示。故需要在游戏中定义一个二维数从而实现游戏的走棋、落棋、判断棋盘的变化等。同时加深了对各种函数的理解,通过这个课程设计,培养我们能够遵循软件开发过程的基本规范,运用结构化程序设计的方法,按照课程设计的题目要求,独自地完成设计、编写、调试和测试应用程序及编写文档的任务。目录摘要2第一章 问题定义41.1课题背景41.2课题现状51.3解决课题的关键问题51.4课程设计工作基础条件7第二章 可行性分析82.1课程设计的要求82.2实现的功能82.3层次划分8第三章 总体设计93.1 主要功能9
4、3.2 模块93.5 模糊思路流程图10第四章 详细设计1141五个模块114.1.1棋盘界面和棋子的设计114.1.2按键设计124.1.3落棋位置的判断134.1.4成绩输出144.1.5输出胜利者信息16第 I 条第五章 编码18第六章 测试26第七章 运行27第八章 总结288.1项目总结288.2 小组成员总结29第一章 问题定义1.1课题背景生产背景:黑白棋是19世纪末英国人发明的。直到上个世纪70年代一个日本人将其发展,借用莎士比亚名剧奥赛罗(othello)为这个游戏重新命名,也就是现在大家玩的黑白棋。为何借用莎士比亚名剧呢?是因为奥赛罗是莎士比亚一个名剧的男主角。他是一个黑人
5、,妻子是白人,因受小人挑拨,怀疑妻子不忠一直情海翻波,最终亲手把妻子杀死。后来真相大白,奥赛罗懊悔不已,自杀而死。黑白棋就是借用这个黑人白人斗争的故事而命名。黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。黑白棋的棋子和围棋类似。但它的下法与围棋的很不相同。它的规则是当所下的子与自己现有的子之间夹有对方的棋子时,可以将所夹的对方棋子全部反转成自己的棋子。最后棋盘上面剩余子最多的一方获胜。所以,在设计程序时要考虑的关键问题就是如何实现计算机自动选择落子的最佳位置。应用价值:由于黑白棋是一种益智游戏,提高人们的智力,从而提高人们精神文化,增加课外活动项目。黑白棋是一
6、种简单使用的小游戏,方便使用。人生如棋,就如一盘永远下不完的棋。 你和谁对弈?生活?生命?事业?爱情?都是都不是。你是在和自己对弈,你最难战胜的对手就只有你自己。你无法克服自己脆弱的灵魂,你需要勇气、信念和毅力,你不具备一颗冠军的大心脏。你总是在关键时刻输给自己的昏招、随手、勺子 为什么说人生如棋?你需要深思熟虑、步步为营。但是你处心积虑的经营,可能在瞬间崩溃。但是你并不会放弃,因为这是棋局的一部分,更像生活的意义。1、都需要平常心心平气和的去看荣辱,平心静气的接受输赢。无论是下棋,或是生活中,我们都需要一颗平常心。不要把结果看得太重,而是要把过程做到极致。好的过程是好的结果的保障,而没有好的
7、过程却拥有好的结果,只能说是偶然。人生和棋局也许会有偶然,但下次偶然什么时间出现呢?2、都是力量的展示量力而为之,勉强不可为。这里不是讲蛮力,是讲内力,也就是一个人的修为。滴水穿石非一日之功,生活想要尽兴如意,就要付出比别人的努力。棋局更是如此,力量要恰到好处才可控制局面,赢得比赛。力量的大小这取决于对人生、棋局的理解。如何做到收发自如,需要千锤百炼的修行3、胜负观爱出者爱返,福往者福至。其实,无论是人生或是棋局,都没有胜负可言。可是多少人能放得下呢?的人都在为一时得失扼腕叹惜,难以释怀。我更欣赏:空手把锄头,步行骑水牛;人从桥上过,桥流水不流的境界。胜负只是假象,其实每一个人能快乐、健康的生
8、活就已经是胜利者。4、永无止境棋局无形、人生有限一盘棋不是全部,人生却只有今生。将你的理想、希望继续下去,虽然你的思想不足以影响别人,但是如果能,那就是最大的成就。每一盘都有那特别的图案,每个人的生命,只有内心世界才是真正的博大深邃,无论是棋局或是人生,你我往往会不知不觉迷失了来时去的路上。5、无法预知永远无法预知结果,永远无法把握未来。一盘棋是没有结果,也不仅仅是表面上的输赢。蕴含在棋局中的某个选择,谁说不是对人生的态度?人生就是在摸着石头过河,谁也无法预则未来是什么样子。因为这样的未知,存在太多的吸引力。你会为此着迷而不放弃,棋局如此,人生亦如此。6、黑白分明黑白分明似世事,精彩纷呈如人生
9、棋盘361点,均有黑白填充;一年365天,充满酸甜苦辣。你在纵横交错的棋盘里厮杀,我在经纬分明的生活中奋争。一切都是自然的相似,一切又都平淡的出奇。我们的人生不应该是杀声一片,应该是婉约的琴弦上悠悠的月光!战罢棋局,一样要冷静、理智的面对人生。1.2课题现状原先黑白棋在国内集中在3个游戏对战平台中游、联众和边锋。黑白棋的发展实际上是伴随着中国网络的发展。三大平台鼎盛时期也是中国黑白棋的鼎盛时期。期间高手辈出,新人不断。现在国内最强的一批高手都是那个时期成长起来的。 由于网络下棋可以通过一些手段作弊,导致人类黑白棋玩家积极性下降。大事件后,不少黑白棋玩家的积极性大大受挫。加之各个平台对于程序没有
10、很好的控制。导致高手流向国外较好的平台下棋。国内三大平台渐渐衰落。 最近,qq游戏推出了黑白棋游戏。基于qq用户的基数庞大,在线下黑白棋的玩家数量达到了前所未有的地步。原先消失的高手们也纷纷出现。中国黑白棋出现了欣欣向荣的景象。 但值得注意的是,qq黑白棋对于外挂和程序也没有较好的控制。平台上的玩家水平较低。不少玩家对于黑白棋尚未真正了解。希望qq游戏可以借鉴前人,完善自我。中国黑白棋也可以有更好的发展。黑白棋作为一种经典的策略性游戏,受到了广大网友,特别是得到了希望锻炼智力的网友的喜爱。1.3解决课题的关键问题研究内容:编程一个黑白棋的小游戏实施方案:黑白棋战术技巧游戏工具(棋具)棋子:黑白
11、棋棋子每颗由黑白两色组成,一面白,一面黑,共64个(包括棋盘中央的4个)。棋子呈圆饼形。棋盘:黑白棋棋盘由64格的正方格组成,游戏进行时棋子要下在格内。棋盘可分为“角”、“边”以及黑白棋“中腹”。现今的棋盘多以8x8较为普遍。1.下棋方法黑白棋的棋盘是一个有8*8方格的棋盘。下棋时将棋下在空格中间,而不是像围棋一样下在交叉点上。开始时在棋盘正中有两白两黑四个棋子交叉放置,黑棋总是先下子把自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜八个方向内有一个自己的棋子,则被夹在中间的全部翻转会成为自己的棋子。并且,只有在可以翻转棋子的地方才可以下子。 棋规:1棋局初始时黑棋和白棋分别有棋
12、子如图1-1所示。2黑方先行,双方交替下棋。3一步合法的棋步包括:在一个空格新落下一个棋子,并且翻转对手一个或多个棋子。4新落下的棋子与棋盘上已有的同色棋子间,对方被夹住的所有棋子都要翻转过来。可以是横着夹,竖着夹,或是斜着夹。夹住的位置上必须全部是对手的棋子,不能有空格。5一步棋可以在数个方向上翻棋,任何被夹住的棋子都必须被翻转过来,棋手无权选择不去翻某个棋子。6除非至少翻转了对手的一个棋子,否则就不能落子。如果一方没有合法棋步,也就是说不管他下到哪里,都不能至少翻转对手的一个棋子,那他这一轮只能弃权,而由他的对手继续落子直到他有合法棋步可下。7如果一方至少有一步合法棋步可下,他就必须落子,
13、不得弃权。8棋局持续下去,直到棋盘填满或者双方都无合法棋步可下。2.判断胜负条件如果玩家在棋盘上没有地方可以下子,则该玩家对手可以连下。双方都没有棋子可以下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜。在棋盘还没有下满时,如果一方的棋子已经被对方吃光,则棋局也结束。将对手棋子吃光的一方获胜。翻转棋类似于棋盘游戏“奥赛罗 (Othello)”,是一种得分会戏剧性变化并且需要长时间思考的策略性游戏。翻转棋的棋盘上有 64 个可以放置黑白棋子的方格(类似于国际象棋和跳棋)。游戏的目标是使棋盘上自己颜色的棋子数超过对手的棋子数。该游戏非常复杂,其名称就暗示着结果的好坏可能会迅速变化。当游戏双方都
14、不能再按规则落子时,游戏就结束了。通常,游戏结束时棋盘上会摆满了棋子或双方都无法在下棋时谁的棋子最多谁就是赢家实现目的方法:首先介绍了选题的要求,之后详细叙述了软件的设计过程。最后论文对设计进行了总结,对设计中可以进一步改善的地方提出了建议。熟悉对C语言程序的编写,对于软件的人开发的结构和流程图的认识。解决的关键问题:上网查资料,遇到对C语言的语法错误及时1.4课程设计工作基础条件主要设备:个人电脑,系统是window xp,我们设计的是一个黑白棋游戏,要在短时间内开发出来并且要满足基本的游戏要求,无论是硬件还是软件都要选择合适,要求如下:开发设备应该完备;操作系统的选择应该适当;开发出的程序
15、可以在尽可能多的平台上运行;要求运行机配置尽可能低档。对此,我们选择的硬件环境和软件环境如下:1、硬件环境处理器:Intel Pentium PII或更高处理器 内存:256MB或更高 网络:局域网开发该系统应尽可能采用高档的硬件。因此,在应用时应采用更好的配置。2、所用的软件:Turbo C for Windows 集成实验与学习环境实训地点:1、实训楼501教室。2、9栋603工作室第二章 可行性分析2.1课程设计的要求1、分析课程设计题目的要求2、写出详细设计说明3、编写程序代码,调试程序使其能正确运行4、设计完成的软件要便于操作和使用5、设计完成后提交课程设计报告2.2实现的功能只有在
16、可以吃到对方棋子的方格内落子。吃子规则:采用夹子的原则,左图用红色标记的是黑方可落子的位置。当黑方落子之后,则夹在黑白之间的白子都将变为黑子。右图是图落子后的棋盘布局,蓝色标记的白方可落子的位置。夹子的方位包含:水平、竖直、斜对角。主要是人人对战,最后通过棋盘上的谁的棋子多来判断谁胜谁负,在左上角显示胜负的信息2.3层次划分我们将本程序设计主要划分三个层次:第一、程序的基本思路框架以及每期程序设计的进度划分;第二、程序的编写,这是一个在整个项目中最重要也是最难的,所以我们详细的讨论以及整组成员的任务。第三、程序的报告以及所有项目的完善,看似简单的项目在结束完善阶段也是重中之重。第三章 总体设计
17、3.1 主要功能1、判断棋手的落棋位置和次数,两方交换走棋。2、清空成绩,判断哪方胜利。3、输出两方成绩。3.2 模块1、棋盘界面2、按键设计3、落棋位置的判断4、成绩输出5、输出胜利者信息3.3模块之间的连接黑白棋功能分落棋位置判断、成绩输出、输出胜利者信息三个模块。它们之间的联系:通过调用QpChange函数来判断棋盘的整体变化,根据判断出棋盘双方落子情况再调用DoScore函数双方成绩,然后调用PrintScore函数输出成绩,最后输出胜利者的信息。3.4 文字思路分析从程序表面上看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的
18、状态,共有二种情况,1代表白棋,2代表黑棋。这样程序的主要工作是接收棋手按键操作,棋手有UP、Down、Left、Right控制光标移动,回车键表示落子。如果无棋可走则显示停步信息。一旦接收到回车键,说明棋手落子,先判断是否是效位置,也就是说已经有棋子的位置不能重叠落子,然后再判断该位置能否吃掉对方的棋子(根据黑白棋的的游戏规则,只能将棋子落子能吃掉对方棋子的位置上),如果条件满足则在该位置落子,落子时执行这样几个步骤,先调用画棋子函数,将棋盘的相应位置上画上棋子,再调用吃棋子函数,将对手的棋子变成自己颜色的棋子,然后根据吃掉对手棋子的个数,给自己加上相应的分数和给对手减去相应的分数,再将数组
19、中的相应元素赋值,标志该位置已经落子,最后将落子的权限交给对手。3.5 模糊思路流程图主程序画键盘按键设计落棋位置的判断成绩输出输出胜利者信息控制棋盘大小,有多少个格子,棋手的次数。根据棋手的按键判断落棋的方位。判断棋手的落棋位置和次数,两放交换走棋。清空成绩,判断哪放胜利。将两人分手分别输出。第四章 详细设计41五个模块4.1.1棋盘界面和棋子的设计(1)DrawQp()画棋盘函数:背景颜色设为蓝色,从坐标(100,100)开始每隔40个单位用白色画一条水平直线,一条垂直线,构成棋盘,用循环语句实现。画线函数line()的参数为线的起点和终点坐标,注意要计算正确。函数setfillstyle
20、()可以设置填充模式和填充颜色流程图:从坐标(100,100)开始画线每隔40个单位用白线画一条水平直线与垂直线用循环语句for来循环画线,构成棋盘画线函数line()的参数为线的起点和终点坐标设计背景蓝色开始函数setfillstyle()设置为填充模式和填充颜色结束4.1.2按键设计playtoplay()人人对弈函数:这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:1)按Esc键程序可以随时结束。2)按上下左右光标键,则改变棋子移动的坐标值。3)按回车键后判断:如落子的位置已经有棋则无效,继续压键。开始结束初始化按键向上键向下键向右键向左键退出键4.1.3落棋位置的判断(1
21、)MoveColor()恢复原来格子的状态:由于棋手在走棋的时候,他的棋子总是首先出现在棋盘的左上角,棋手要通过移动光标键走到要落子的位置,在经过的路程上显示当前棋子,就会覆盖原来的棋盘状态。所以,一旦棋子走过后,就应恢复原来的状态,是空格的依然显示空格,是棋子的就显示原来棋子的颜色,因为棋子移动过程并没有改变数组元素的值,所以可以根据数组元素的值判定原来的状态,如果是1,就恢复白色棋子,值是2则恢复黑色棋子,否则恢复蓝色空格。(2)playtoplay()人人对弈函数:这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:3)按回车键后判断:如落子的位置已经有棋则无效,继续压键。如落
22、子位置是空格,可以将棋子落入格内,调用函数QpChange()判断是否引起棋盘的变化,函数值为1有变化,为0没变化。如果棋盘有变化,说明将包围的对方棋子吃掉,统计当前分数,如果棋盘没有变化,则说明落子的位置无法包围对方的棋子也视为无效棋。可以继续寻找合适的位置,但开始统计其落子次数,一旦尝试次数超过当前棋盘的空格数,则说明他无棋可走,则放弃此步,让对方下棋。如果棋子变化后,格子已占满64格或一方棋子为0,则游戏结束,显示胜利方信息。按任意键程序结束。4)重复上述步骤,直到游戏结束。开始按键方向改变按键坐标按回车键确认当前位置是否有棋子占位是否棋子落下确认光标跳出本坐标,回到初始化位置控制权交换
23、到另一玩家结束 4.1.4成绩输出(1)QpChange()判断棋盘变化:当棋手按回车键落子后,就要分贝往8个方向判断是否包围住对方棋子,如果是,则改变棋盘,也就是棋盘上黑白棋子的个数要发生变化。表示黑白棋的图形用屏幕上的像素坐标,而棋子的状态是数组元素a,所以要根据落子的坐标x和y计算出对应数组元素a的下标i和j,i代表行,j代表列,对于8*8的棋盘,它们的值为0-7,如果jscore2黑棋赢平局白棋赢结束 第 I 条 第五章 编码#include graphics.h /*图形系统头文件*/#define LEFT 0x4b00 /*光标左键值*/#define RIGHT 0x4d00
24、/*光标右键值*/#define DOWN 0x5000 /*光标下键值*/#define UP 0x4800 /*光标上键值*/#define ESC 0x011b /* ESC键值*/#define ENTER 0x1c0d /* 回车键值*/int a88=0,key,score1,score2;/*具体分数以及按键与存放棋子的变量*/char playone3,playtwo3;/*两个人的得分转换成字符串输出*/void playtoplay(void);/*人人对战函数*/void DrawQp(void);/*画棋盘函数*/void SetPlayColor(int x);/*设
25、置棋子第一次的颜色*/void MoveColor(int x,int y);/*恢复原来棋盘状态*/int QpChange(int x,int y,int z);/*判断棋盘的变化*/void DoScore(void);/*处理分数*/void PrintScore(int n);/*输出成绩*/void playWin(void);/*输出胜利者信息*/*主函数*/void main(void) int gd=DETECT,gr; initgraph(&gd,&gr,c:tc); /*初始化图形系统*/ DrawQp();/*画棋盘*/ playtoplay();/*人人对战*/ ge
26、tch(); closegraph();/*关闭图形系统*/void DrawQp()/*画棋盘*/ int i,j; score1=score2=0;/*棋手一开始得分都为*/ setbkcolor(BLUE); for(i=100;i=64-score1-score2) /*如果尝试超过空格数则停步*/ MoveColor(x,y); fillellipse(x,y,15,15); break; else continue;/*如果按键无效*/ DoScore();/*分数的改变*/ break;/*棋盘变化了,则轮对方走棋*/ else/*已经有棋子就继续按键*/ continue; e
27、lse /*四个方向按键的判断*/ if(key=LEFT&x120)/*左方向键*/ MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); x-=40; fillellipse(x,y,15,15); else if(key=RIGHT&x80)/*右方向键*/ MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); x+=40; fillellipse(x,y,15,15); else if(key=UP&y120)/*上方向键*/ MoveColor(x,y); fill
28、ellipse(x,y,15,15); SetPlayColor(t); y-=40; fillellipse(x,y,15,15); else if(key=DOWN&y400)/*下方向键*/ MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); y+=40; fillellipse(x,y,15,15); if(key=ESC)/*结束游戏*/ break; if(score1+score2)=64|score1=0|score2=0)/*格子已经占满或一方棋子为判断胜负*/ playWin();/*输出最后结果*/ break
29、; t=t%2+1; /*一方走后,改变棋子颜色即轮对方走*/ cc=0; /*计数值恢复为*/ /*endwhile*/void SetPlayColor(int t)/*设置棋子颜色*/ if(t%2=1) setfillstyle(SOLID_FILL,15);/*白色*/ else setfillstyle(SOLID_FILL,8);/*灰色*/void MoveColor(int x,int y)/*走了一步后恢复原来格子的状态*/ if(y100)/*如果是从起点出发就恢复蓝色*/ setfillstyle(SOLID_FILL,BLUE); else/*其他情况如果是就恢复白色
30、棋子,2恢复黑色棋子,或恢复蓝色棋盘*/ switch(a(x-120)/40(y-120)/40) case 1: setfillstyle(SOLID_FILL,15);break; /*白色*/ case 2: setfillstyle(SOLID_FILL,8);break; /*黑色*/ default: setfillstyle(SOLID_FILL,BLUE); /*蓝色*/ int QpChange(int x,int y,int t)/*判断棋盘的变化*/ int i,j,k,kk,ii,jj,yes; yes=0; i=(x-120)/40; /*计算数组元素的行下标*/
31、j=(y-120)/40; /*计算数组元素的列下标*/ SetPlayColor(t);/*设置棋子变化的颜色*/ /*开始往个方向判断变化*/ if(j6)/*往右边*/ for(k=j+1;k8;k+) if(aik=aij|aik=0)/*遇到自己的棋子或空格结束*/ break; if(aik!=0&k8) for(kk=j+1;kkk&k1)/*判断左边*/ for(k=j-1;k=0;k-) if(aik=aij|!aik) break; if(aik!=0&k=0) for(kk=j-1;kkk&k=0;kk-) aikk=aij; fillellipse(120+i*40,1
32、20+kk*40,15,15); if(kk!=j-1) yes=1; if(i6)/*判断下边*/ for(k=i+1;k8;k+) if(akj=aij|!akj) break; if(akj!=0&k8) for(kk=i+1;kkk&k1)/*判断上边*/ for(k=i-1;k=0;k-) if(akj=aij|!akj) break; if(akj!=0&k=0) for(kk=i-1;kkk&k=0;kk-) akkj=aij; fillellipse(120+kk*40,120+j*40,15,15); if(kk!=i-1) yes=1; if(i1&j=0&kk=0&kkk
33、&k=0;ii-,jj+) aiijj=aij; fillellipse(120+ii*40,120+jj*40,15,15); if(ii!=i-1) yes=1; if(i1)/*左下*/ for(k=i+1,kk=j-1;k=0;k+,kk-) if(akkk=aij|!akkk) break; if(akkk!=0&k=0) for(ii=i+1,jj=j-1;iik&k1&j1)/*左上*/ for(k=i-1,kk=j-1;k=0&kk=0;k-,kk-) if(akkk=aij|!akkk) break; if(akkk!=0&k=0&kk=0) for(ii=i-1,jj=j-1;iik&k=0;ii-,jj-) aiijj=aij; fillellipse(120+ii*40,120+jj*40,15,15); if(ii!=i-1) yes=1; if(i6&j6)/* 右下*/ for(k=i+1,kk=j+1;kk8&kk8;k+,kk+) if(akkk=aij|!akkk) brea
限制150内