黑白棋C语言课程设计

上传人:飞*** 文档编号:38057698 上传时间:2018-04-26 格式:PDF 页数:15 大小:75.34KB
返回 下载 相关 举报
黑白棋C语言课程设计_第1页
第1页 / 共15页
黑白棋C语言课程设计_第2页
第2页 / 共15页
黑白棋C语言课程设计_第3页
第3页 / 共15页
黑白棋C语言课程设计_第4页
第4页 / 共15页
黑白棋C语言课程设计_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《黑白棋C语言课程设计》由会员分享,可在线阅读,更多相关《黑白棋C语言课程设计(15页珍藏版)》请在金锄头文库上搜索。

1、1 摘要黑白棋 (REVERSI 、OTHELLO) ,也叫苹果棋,翻转棋,是一个经典的策略性游戏。它使用 8*8 的棋盘 , 由两人执黑子和白子轮流下棋,最后子多方为胜方。轮到一方下棋时,必须把棋下在与对方棋子相邻的空位上,要求所下的棋子和原有的已方棋子夹住对方的至少一个棋子 ( 横竖斜夹均可 ) ,然后把被夹住的子变成己方的颜色(也叫吃子 ) 。下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一个格子移到另一个格子。黑白棋规则简单, 但是变化复杂, 是典型的易学难精 (A MINUTE TO LEARN, A LIFETIME TO MASTER), 它看似简单 , 实际奥妙无穷。一般说来

2、,下棋过程中,你必须尽量削减对手的行动力,同时增加自己的行动力,这种策略我们称之为行动力原则(或行动力战术 ) 。当一方达到或接近这个目标时,我们就称该棋手控制了棋局。另外,这个战术的目的是迫使对方下坏棋,如果对方虽然可选位置很少,但每一步却总有好棋,那战术目的就没有达成。记住,你必须让对方完全无好棋可下。黑白棋规则规定只能在对方棋子相邻的空位下棋,这就可以推出另一个原则。对方棋子边上的空位越多,你下棋的选择也就越多,换句话说,你的行动力就越强;相反,如果你棋子边上的空位越少,对方可下的位置也就越少。我们把相邻位置上有空位的子称为外子,反之称为内子,连在一起的外子称为前线或墙。下棋时要尽量减少

3、自己的外子。关键字: 黑白棋, C语言,数组,函数2 黑白棋游戏一、课程设计目的1. 巩固和加深学生对C 语言课程的基本知识的理解和掌握2. 掌握 C 语言编程和程序调试的基本技能3. 利用 C 语言进行基本的软件设计4. 提高运用 C 语言解决实际问题的能力5. 掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。二、实验器材及实验环境硬件环境:装有 Windows 2000或以上系统的微机系统软件环境: Turbo C 2.0软件三、黑白棋的总体设想1. 设计思路从已知的黑白棋游戏中可知,应该用二维数组表示程序的数据,数组两个下标可以表示棋盘上的位置, 数组元素的值代表棋

4、格中的状态,共有三种情况, 分别是空格、 黑棋和白棋,这样给数组元素的取值设定为0、1、2。其中 0 代表空格, 1 代表白色棋子, 2 代表黑色棋子。这样程序的主要工作是接收棋手按键操作,一旦接收到回车键,说明棋手摆子,先判定是不是有效位置,也就是能不能包围住对方棋子,如果能,便对棋子所在的位置往上下、左右、左上、左下、右上、右下8 个方向寻找被包围住的所有棋子(必须是连续的,中间不能有空格),将这些被包围住的对方棋子都变成自己的棋子,然后对当前棋盘中的黑白棋个数进行统计并输出结果。如果没有这样的位置可以落子,则停步,让对方走棋,重复上述步骤,直到游戏结束。如果想提前终止游戏可以按Esc键

5、。2. 结构设计棋盘状态用数组 a88初值为 0 表示空格。函数的实体比较简单,因为要输出图形,所以应初始化图形系统,图形工作方式正确确定后,画出棋盘,调用playtoplay()人人对弈函数开始游戏。一旦游戏结束后,关闭图形系统,程序结束。本次设计主要要设计函数有:1.main() 主函数按照语法规则,首先定义使用到的常数、全局变量、函数原型说明。棋盘状态用数组3 a88,初值为 0,表示空格。函数的实体比较简单,因为要输出图形,所以应初始化图形系统,图形工作方式正确确定后, 画出棋盘,调用 playtoplay()人人对弈函数开始游戏,一旦游戏结束后,关闭图形系统,程序结束。2.DrawQ

6、p()画棋盘函数背景颜色设为蓝色 , 从坐标 (100,100) 开始每隔 40 个单位用白色画一条水平直线, 一条垂直线 , 构成棋盘 , 用循环语句实现 . 画线函数line()的参数为线的起点和终点坐标, 注意要计算正确 . 函数 setfillstyle()可以设置填充模式和填充颜色,fillellipse(int x,int y,xradius,int yradius) 以 x 和 y 为圆心,xradius和 yradius为水平和垂直轴画一填充椭圆, 当 xradius和 yradius相等时 , 则画出的是圆 , 用它表示棋子。3.SetPlayColor()设置棋子的颜色因为

7、是两个棋手 , 同时棋盘也在不断变化, 所以要判断棋手和棋盘变化设置了这个函数 函数的参数为整型变量t, 根据 t 的值来设计填充棋子的当前颜色, 值为 1 代表白棋 , 值为 2 代表黑棋。4.MoveColor() 恢复原来格子的状态由于棋手在走棋的时候,他的棋子总是首先出现在棋盘的左上角棋手要通过移动光标键走到要落子的位置, 在经过的路程上显示当前棋子,就会覆盖原来的棋盘状态。 所以,一旦棋子走过后,就应恢复原来的状态,是空格的依然显示空格,是棋子的就显示原来棋子的颜色,因为棋子移动过程并没有改变数组元素的值,所以可以根据数组元素的值判定原来的状态,如果值是1,就恢复白色棋子,值是2 则

8、恢复黑色棋子,否则恢复蓝色空格。5.playtoplay()人人对战函数这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:(1)按 Esc 键程序可以随时结束。(2)按上下左右光标键,则改变棋子移动的坐标值。(3)按回车键后判断:1)如落子的位置已经有棋则无效,继续压键。2)如落子位置是空格,可以将棋子落入格内,调用函数 QpChange()判断是否引起棋盘的变化,函数值为1 有变化,为 0 没变化。如果棋盘有变化,说明将包围的对方棋子吃掉,统计当前分数,如果棋盘没有变化,则说明落子的位置无法包围对方的棋子也视为无效棋。可以继续寻找合适的位置,但开始统计其落子次数,一旦尝试次数超过

9、当前棋盘的空格数,则说明他无棋可走,则放弃此步,让对方下棋。3)如果棋子变化后,格子已占满64 格或一方棋子为0,则游戏结束,显示胜利方信息。按任意键程序结束。(4)重复上述步骤,直到游戏结束。6.QpChange()判断棋盘变化当棋手按回车键落子后,就要分别往8 个方向判断是否包围住对方棋子,如果是,则改变棋盘,也就是棋盘上黑白棋子的个数要发生变化。表示黑白棋的图形用屏幕上的像素4 坐标,而棋子的状态是数组元素a,所以要根据落子的坐标x 和 y 计算出对应数组元素a的下标 i和 j ,i 代表行, j 代表列,对于 8*8 的棋盘,它们的值为0-7,如果 j1)/*往左边 */ for(k=

10、j-1;k=0;k-) if(aik=aij|!aik) break; if(aikkkkkk-) aikk=aij; fillellipse(120+i*40,120+kk*40,15,15); if(i1)/*往上*/ for(k=i-1;k=0;k-) if(akj=aij|!akj) break; if(akjkkkkk-) akkj=aij; fillellipse(120+kk*40,120+j*40,15,15); 9 if(i1ii-,jj+) aiijj=aij; fillellipse(120+ii*40,120+jj*40,15,15); if(i1)/*左下*/ for

11、(k=i+1,kk=j-1;k=0;k+,kk-) if(akkk=aij|!akkk) break; if(akkkii1k=0k-,kk-) if(akkk=aij|!akkk) break; if(akkkiikii-,jj-) aiijj=aij; fillellipse(120+ii*40,120+jj*40,15,15); 10 if(iscorewhite0) outtextxy(100,50,“black win!“); else if(scoreblack0scorewhite1) outtextxy(100,50,“black win!“); else if(scorebl

12、ack1120)/*四个方向按键盘的判断 */ playcolortwo(xx,yy);/*判断原来位置因为画什么, 这里只画蓝色是不完整的 */ fillellipse(xx,yy,15,15); playcolor(t); xx-=40; fillellipse(xx,yy,15,15); else if(key=RIGHT fillellipse(xx,yy,15,15); playcolor(t); xx+=40; fillellipse(xx,yy,15,15); else if(key=UP fillellipse(xx,yy,15,15); playcolor(t); yy-=4

13、0; fillellipse(xx,yy,15,15); 14 else if(key=DOWN fillellipse(xx,yy,15,15); playcolor(t); yy+=40; fillellipse(xx,yy,15,15); if(key=ESC) break; sum=0; for(i=0;i8;i+)/*判断是否棋子填满 */ for(j=0;j8;j+) if(aij!=0) sum+; if(sum=64) playwin();/*判断胜负 */ break; t+; if(t=11)/*如果 t 到了 11 就变成 1*/ t=1; void main() int

14、 gr,gd=DETECT; /int graphdriver=DETECT,graphmode; /initgraph( initgraph( qipan();/*画棋盘 */ playtoplay();/*人人对战 */ 15 getch(); closegraph(); 五、总结这个黑白棋游戏原程序是基于Turbo C 强大的图形处理函数下完成的,其最大特点是采用了在主函数中调用子函数思想,每一种功能都是用子函数的办法来进行处理,简洁,清晰,方便,不容易出现错误。在输入错误时本来想用一种警告的铃声来提醒用户,由于所学的知识不多,自己的编程经验不足,按现有的知识水平有些东西暂时还无法解决,

15、还有待于在以后的学习中不断提高和改进!六、心得体会C 语言作为国际上广泛流行的通用程序设计语言,在计算机的研究和应用中已展现出强大的生命力。 C 语言兼顾了诸多高级语言的特点,是一种典型的结构化程序设计语言,它处理能力强,使用灵活方便,应用面广,具有良好的可移植性。虽然我们C语言已有半年了,但一直都重概念、轻实践,这次设计对我们来说是千载难逢的机会。高中的教育模式化倾向太强,整齐划一的教育模式使学校变成“工厂”,学生成为统一式模子加工出来的“标准件”。但大学的程序设计实践课促进我们的个性充分、健康地发展,最大限度地激发我们的学习热情和创造热情。我可以说若你一一欣赏我们的设计,你一定会眼花缭乱,因为它们各种各样、各有千秋。并且,它无形中促进我们自主学习,使我们对C语言有了更深刻地了解,对程序设计有了更高的操作水平。参考文献1 张基温, C语言程序设计案例教程,清华大学出版社,2004 2 郭翠英, C语言课程设计案例精编,中国水利水电出版社,2004

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号