C语言课设下棋范本
- 格式:doc
- 大小:103.50 KB
- 文档页数:21
*******************实践教学***********************大学计算机与通信学院2016年春季学期C程序设计课程设计题目:五子棋游戏专业班级:16级物联网1班姓名:******__学号:1616520147指导教师:******成绩:摘要五子棋是一种两人对弈或者人机对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上实现人机对弈五子棋功能。
人机对弈五子棋程序由开始界面,棋盘,判断胜负和计分等子程序构成;程序中应用了数组、全局变量、按键处理和图形编程等元素和语句。
程序通过棋盘和棋子图像生成、玩家移子与电脑判断分数高低而落子和判断胜负等功能的实现,在计算机上用VC++6.0实现了人机五子棋对弈。
关键词:C语言;VC++6.0目录摘要 (I)第1章序言 (1)1.1设计背景 (1)1.2设计目的 (1)第2章需求分析 (2)第3章程序总体设计 (3)3.1程序总体框架图 (3)3.2程序流程图 (4)第4章程序详细设计 (5)4.1各类头文件及自定义函数 (5)4.2棋盘数组 (5)4.3开始界面函数 (5)4.4棋盘界面函数 (5)4.5胜负判断函数 (6)4.6得分判断函数 (6)4.7主函数 (6)第5章系统测试 (7)5.1开始界面测试 (7)5.2棋盘界面测试 (8)5.3玩家输赢界面测试 (11)设计总结 (13)参考文献 (14)致谢 (155)附录(源代码) (166)第1章序言1.1 设计背景五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。
有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。
在上古的神话传说中有“女娲造人,伏羲做棋”一说,《增山海经》中记载:“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。
”李善注引三国魏邯郸淳《艺经》中曰:“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。
简单五子棋C语言课设C语言课程设计姓名:学号:专业:软件工程班级: 3 班指导教师:编写日期:2015/6/25一、需求分析1、程序的输入与输出:只需通过键盘“上”,“下”,“左”,“右”移动光标在棋盘上的位置,“p”键下子,“q”键悔棋进行人人对战。
2、程序的系统功能:(1)五子棋;(2)、根据需要提供对图书所需的查询方式。
二、系统总体设计1问题:(1)建立棋盘:如何跟简便的建立棋盘;(2)玩家操作如何移动光标;(3)如何在各个方向上检查是否有五个棋子连接;2.解决方法:(1)用许多“+”符号连接起来构成简便棋盘,下棋时只需将棋子覆盖到“+”完成下子;(2)棋子的移动与落子有键盘上按键控制,本程序选取按键为W、S、A、D和P键,分别代表上移、下移、左移、右移光标和落子。
在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。
落子后,程序会为落子处的数组元素赋一个特定值,用于判定胜负。
(3)胜负判断模块是程序的关键,该模块的设计直接关系到程序的运行速率和运行结果的正确与否。
本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息,否则继续落子。
三、详细设计1.建立棋盘void drawqipan() //绘制棋盘及数据初始化{int i,j;system("cls"); //清除屏幕for(i=0;i<20;i++){for(j=0;j<20;j++){Q[i][j]=0;printf("十");}printf("\n");}weizhi.x=0;weizhi.y=0; //程序数据初始化gotoxy(0,0);}2.玩家操作void jilu() //记录落子情况{Q[weizhi.x][weizhi.y]=player+1;if(player){player=0; //玩家变换return;}player=1;}int cluozi(int x,int y) //由电脑落子时调用{weizhi.x=x;weizhi.y=y;gotoxy(weizhi.x,weizhi.y);if(Q[weizhi.x][weizhi.y]==0) //判断当前位置是否已经落子 {jilu();printf("○");gotoxy(weizhi.x,weizhi.y);}}void luozi() //玩家落子{if(Q[weizhi.x][weizhi.y]==0) //判断当前位置是否已经落子 {if(player){jilu();printf("●");}else{jilu();printf("○");}gotoxy(weizhi.x,weizhi.y);}}3、systemsystem("CLS")可以实现清屏操作。
c 课程设计围棋游戏一、教学目标本课程旨在通过围棋游戏的学习,让学生掌握围棋的基本规则和技巧,培养学生的逻辑思维和策略能力。
具体目标如下:知识目标:学生能够理解并掌握围棋的基本规则,包括棋子的摆放、吃子、提子、眼位等;了解围棋的历史和发展。
技能目标:学生能够独立进行围棋对弈,运用基本的防守和进攻策略;能够分析棋局,找出关键的争点并进行判断。
情感态度价值观目标:学生通过围棋游戏的学习,能够培养耐心、细心和专注的品质;学会尊重对手,遵守比赛规则,培养团队合作精神。
二、教学内容本课程的教学内容主要包括围棋的基本规则、棋子的摆放和移动、吃子、提子、眼位等基本概念,以及简单的防守和进攻策略。
具体安排如下:第1课时:围棋的基本规则介绍第2课时:棋子的摆放和移动第3课时:吃子和提子第4课时:眼位和活棋与死棋第5课时:基本的防守策略第6课时:基本的进攻策略三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法进行教学。
讲授法:教师通过讲解围棋的基本规则和概念,让学生理解和掌握围棋的基本知识。
讨论法:学生分组进行围棋对弈,教师引导学生进行棋局分析和策略讨论,提高学生的思考和交流能力。
案例分析法:教师提供一些经典的围棋对局案例,学生进行分析和解题,培养学生的分析和判断能力。
实验法:学生进行实际的围棋对弈,通过实践来提高自己的围棋技巧和策略运用能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:教材:选择一本适合学生水平的围棋教材,用于引导学生学习和练习围棋。
参考书:提供一些围棋的参考书籍,供学生进一步学习和拓展知识。
多媒体资料:准备一些围棋教学视频和动画,帮助学生更直观地理解和掌握围棋技巧。
实验设备:准备足够的围棋棋盘和棋子,供学生进行实际的围棋对弈实验。
五、教学评估为了全面反映学生的学习成果,本课程将采用以下评估方式:平时表现:通过观察学生在课堂上的参与程度、提问回答、小组讨论等表现,评估学生的学习态度和积极性。
c语言五子棋课程设计报告一、前言五子棋作为一种智力游戏,在我国有着悠久的历史和广泛的群众基础。
本次设计的目的是使用C语言实现五子棋游戏,通过此次课程设计,学生将掌握C语言的编程思想和开发方法,同时了解五子棋游戏的规则和策略。
二、五子棋游戏规则五子棋游戏是在15*15的棋盘上进行,由黑白双方轮流落子,先将五个同色棋子连成一条线的一方获胜。
落子的位置必须为空,不能与已有的棋子重叠。
黑方先手,白方后手。
下图为五子棋棋盘示意图。
三、五子棋游戏实现本次课程设计采用C语言实现五子棋游戏,主要包括棋盘的绘制、落子的判断和胜负的判断等功能。
1.棋盘的绘制棋盘的绘制采用双重循环实现,将15*15的棋盘分成225个小格,其中包括14个横线和14个竖线,以及4个角上的点。
通过循环输出字符实现棋盘的绘制。
2.落子的判断落子的判断主要包括鼠标的点击和棋子的绘制两个部分。
当鼠标点击棋盘上的一个位置时,程序会根据当前轮到哪方落子来绘制相应颜色的棋子,并将该位置的状态改为已有棋子。
同时,程序会检查当前落子是否符合规则,即该位置是否为空,如果不为空则重新等待鼠标点击。
3.胜负的判断胜负的判断主要包括横向、纵向、斜向和反斜向四个方向。
通过判断当前落子位置在这四个方向上的连续棋子数是否达到五个来确定胜负。
如果达到五个,则程序会弹出相应的提示框,显示胜利方。
四、总结通过本次课程设计,学生掌握了C语言的编程思想和开发方法,同时了解了五子棋游戏的规则和策略。
本次设计主要包括棋盘的绘制、落子的判断和胜负的判断等功能。
希望本次课程设计能够增强学生的编程能力和对五子棋游戏的理解。
c语言课程设计黑白棋一、教学目标本课程的目标是让学生掌握C语言编程的基本技能,通过实现一个黑白棋游戏项目,培养学生的编程思维和实际操作能力。
具体目标如下:1.知识目标:学生能熟练使用C语言进行编程,理解基本的编程概念,如变量、数据类型、运算符、控制结构等。
2.技能目标:学生能运用C语言实现简单的逻辑控制和函数调用,具备一定的算法分析能力,能独立完成黑白棋游戏的设计与实现。
3.情感态度价值观目标:培养学生对编程的兴趣和热情,提高学生的问题解决能力,培养学生的团队合作意识和创新精神。
二、教学内容教学内容以C语言的基本概念和编程技巧为主线,结合黑白棋游戏的设计与实现,具体安排如下:1.C语言基本概念:介绍C语言的语法规则、数据类型、运算符、控制结构等基本知识。
2.函数和数组:讲解函数的定义和调用、数组的使用和操作,以及函数指针的概念。
3.黑白棋游戏设计:引导学生分析游戏需求,设计游戏界面和逻辑,实现游戏的基本功能。
4.算法分析和优化:引导学生运用算法分析游戏中的问题,如棋子的移动规则、胜负判断等,并进行优化。
5.团队合作与创新:培养学生进行团队合作,共同完成游戏项目,鼓励学生发挥创新精神,为游戏添加更多功能和玩法。
三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,具体安排如下:1.讲授法:讲解C语言的基本概念和编程技巧,为学生提供系统的知识体系。
2.讨论法:学生进行团队讨论,分析游戏需求,设计游戏方案,培养学生的团队合作能力。
3.案例分析法:通过分析典型的黑白棋游戏案例,引导学生掌握游戏设计的要点和技巧。
4.实验法:学生动手编写代码,实现游戏功能,培养学生的实际操作能力和编程思维。
四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备等,具体安排如下:1.教材:选用《C程序设计原理与应用》作为主讲教材,为学生提供系统的知识学习。
2.参考书:推荐《C语言程序设计》等辅助教材,供学生拓展阅读和自学。
c语言课程设计中国象棋一、教学目标本课程的教学目标是使学生掌握C语言的基本语法和编程技巧,通过中国象棋项目的实践,培养学生运用C语言解决实际问题的能力。
具体目标如下:1.知识目标:–掌握C语言的基本数据类型、运算符、控制结构。
–理解函数的定义和调用。
–学习常用的数据结构和算法,如数组、链表、排序等。
2.技能目标:–能够运用C语言编写简单的程序。
–学会使用调试工具,如GDB,进行程序调试。
–能够独立或合作完成中国象棋项目的开发。
3.情感态度价值观目标:–培养学生的团队合作意识和沟通能力。
–培养学生解决问题、克服困难的决心和勇气。
–培养学生对编程和中国象棋的兴趣和热情。
二、教学内容教学内容将围绕C语言的基本语法、数据结构、算法和中国象棋项目展开。
具体安排如下:1.C语言基本语法:–数据类型、变量和运算符。
–控制结构:条件语句、循环语句。
–函数的定义和调用。
2.数据结构与算法:–数组、链表的基本操作。
–排序算法:冒泡排序、选择排序、插入排序等。
–查找算法:顺序查找、二分查找等。
3.中国象棋项目实践:–中国象棋规则的介绍。
–项目需求分析和设计。
–项目实施和调试。
三、教学方法本课程将采用讲授法、案例分析法、实验法等多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:用于讲解C语言的基本语法、数据结构和算法。
2.案例分析法:通过分析典型的中国象棋项目案例,引导学生运用C语言解决实际问题。
3.实验法:让学生亲自动手编写代码、调试程序,提高实际操作能力。
四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备。
1.教材:《C程序设计语言》(K&R)、《C Primer Plus》等。
2.参考书:《数据结构与算法分析:C语言描述》、《算法导论》等。
3.多媒体资料:教学PPT、视频教程、在线编程练习平台等。
4.实验设备:计算机、网络设备、调试工具(如GDB)等。
五、教学评估本课程的教学评估将采用多元化评价方式,全面、客观地评价学生的学习成果。
c语言课程设计棋盘一、教学目标本节课的学习目标包括以下三个方面:1.知识目标:学生需要掌握C语言的基本语法和编程技巧,了解棋盘游戏的原理和设计方法。
2.技能目标:学生能够运用C语言编写简单的棋盘游戏,提高编程能力和问题解决能力。
3.情感态度价值观目标:培养学生对计算机科学的兴趣,增强创新意识和团队合作精神。
二、教学内容本节课的教学内容主要包括以下几个部分:1.C语言基本语法和编程技巧:数据类型、变量、运算符、控制结构等。
2.棋盘游戏的原理和设计方法:棋盘的表示方法、游戏规则的制定、玩家交互等。
3.棋盘游戏的编程实现:编写游戏主函数、调用游戏功能函数、处理玩家输入等。
三、教学方法为了实现本节课的教学目标,我们将采用以下几种教学方法:1.讲授法:讲解C语言基本语法和编程技巧,引导学生掌握棋盘游戏的原理。
2.案例分析法:分析经典棋盘游戏案例,让学生了解游戏设计的方法和技巧。
3.实验法:让学生动手编写棋盘游戏,培养实际编程能力和问题解决能力。
4.小组讨论法:分组进行游戏设计,鼓励学生互相交流、合作,提高团队合作精神。
四、教学资源为了支持本节课的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《C语言程序设计》等相关教材,为学生提供理论知识的学习材料。
2.参考书:《C语言编程实例教程》等参考书,为学生提供更多的学习资源。
3.多媒体资料:制作课件和教学视频,为学生提供直观的学习体验。
4.实验设备:计算机、编程环境等,为学生提供实践操作的平台。
五、教学评估本节课的评估方式包括以下几个方面:1.平时表现:通过课堂参与、提问、讨论等方式评估学生的学习态度和积极性。
2.作业:布置相关的编程作业,评估学生的理解和应用能力。
3.考试:进行期中和期末考试,全面评估学生的知识掌握和编程能力。
评估方式应客观、公正,能够全面反映学生的学习成果。
同时,注重鼓励学生的创新和团队合作精神。
六、教学安排本节课的教学安排如下:1.教学进度:按照教材的章节和教学大纲进行教学,确保完成教学任务。
c课程设计五子棋游戏一、教学目标本课程的目标是让学生掌握五子棋游戏的基本规则和技巧,能够独立进行游戏,并理解游戏的算法和逻辑。
知识目标包括了解五子棋的历史和背景,掌握游戏的规则和技巧,理解游戏的算法和逻辑。
技能目标包括能够独立进行游戏,能够分析游戏局势,能够制定游戏策略。
情感态度价值观目标包括培养学生的团队合作精神,培养学生的竞技精神,让学生理解胜负的重要性。
二、教学内容本课程的教学内容主要包括五子棋的基本规则和技巧,游戏的算法和逻辑,以及游戏中的团队合作和竞技精神。
具体包括五子棋的历史和背景,游戏的规则和技巧,如何分析游戏局势和制定游戏策略,以及如何在游戏中展现团队合作和竞技精神。
三、教学方法本课程将采用讲授法、讨论法、案例分析法和实验法等多种教学方法。
通过讲授法,让学生掌握五子棋的基本规则和技巧;通过讨论法,让学生深入理解游戏的算法和逻辑;通过案例分析法,让学生学会分析游戏局势和制定游戏策略;通过实验法,让学生在实际游戏中体验团队合作和竞技精神。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。
教材和参考书将提供五子棋的基本规则和技巧,游戏的算法和逻辑,以及游戏中的团队合作和竞技精神的相关知识。
多媒体资料将提供五子棋游戏的示例和案例,帮助学生更好地理解游戏的相关知识。
实验设备将用于让学生在实际游戏中体验团队合作和竞技精神。
五、教学评估本课程的评估方式包括平时表现、作业和考试。
平时表现主要评估学生的出勤、课堂参与度和团队合作表现。
作业包括练习题和游戏设计项目,评估学生对五子棋规则和技巧的掌握程度,以及游戏的算法和逻辑的应用能力。
考试包括期中和期末考试,评估学生对课程知识的全面理解和应用能力。
评估方式应客观、公正,能够全面反映学生的学习成果。
六、教学安排本课程的教学安排将在每周的一节课进行,共计10节课。
教学进度将按照教学大纲进行,确保在有限的时间内完成教学任务。
教学时间将安排在下午或晚上,考虑学生的作息时间。
c语言课程设计五子棋一、教学目标本课程的教学目标是使学生掌握C语言编程基础,能够运用C语言设计并实现一个简单的五子棋游戏。
通过本课程的学习,学生将能够理解C语言的基本语法、数据类型、运算符、控制结构等基础知识,并能够运用这些知识解决实际问题。
同时,通过设计五子棋游戏的过程,培养学生的编程思维、逻辑思维和团队合作能力。
具体的学习目标包括:1.知识目标:–掌握C语言的基本语法和编程规范。
–理解数据类型、变量、运算符和控制结构的概念及使用方法。
–学会使用函数进行模块化编程。
–了解五子棋游戏的规则和算法。
2.技能目标:–能够使用C语言编写简单的程序,解决实际问题。
–能够运用循环、条件语句等控制结构编写复杂的程序。
–能够使用函数进行模块化编程,提高代码的可读性和可维护性。
–能够设计并实现一个简单的五子棋游戏,掌握游戏算法和逻辑。
3.情感态度价值观目标:–培养学生的编程兴趣,激发学习编程的积极性。
–培养学生的团队合作意识,学会与他人共同解决问题。
–培养学生的创新思维,勇于尝试和解决问题。
二、教学内容本课程的教学内容主要包括C语言的基本语法、数据类型、运算符、控制结构等基础知识,以及五子棋游戏的规则和算法。
具体的教学大纲如下:1.C语言基本语法和编程规范。
2.数据类型、变量和运算符的概念及使用方法。
3.控制结构(循环、条件语句)的使用和编程实践。
4.函数的定义和调用,模块化编程的优点和实践。
5.五子棋游戏的规则和算法分析。
6.五子棋游戏的界面设计和实现。
7.五子棋游戏的逻辑设计和实现。
三、教学方法本课程的教学方法包括讲授法、案例分析法、实验法和讨论法。
1.讲授法:通过讲解C语言的基本语法、数据类型、运算符、控制结构等基础知识,使学生掌握基本的编程概念和技巧。
2.案例分析法:通过分析典型的五子棋游戏案例,使学生理解五子棋游戏的规则和算法。
3.实验法:让学生通过编写代码和调试程序,实践C语言的基本语法和编程技巧,培养学生的动手能力。
辽宁工业大学C语言程序设计课程设计(论文)题目:黑白棋游戏院(系):软件学院专业班级:计算机信息管理000班学号: 000000000学生姓名: 000000指导教师:教师职称:起止时间:2009.12.14至2009.12.26课程设计(报告)任务及评语目录第1章课程设计的目的与要求 (1)1.1 课程设计目的 (1)1.2 课程设计的实验环境 (1)1.3 课程设计的预备知识 (1)1.4 课程设计要求 (1)第2章课程设计内容 (2)2.1程序功能介绍 (2)2.2程序整体设计说明 (2)2.2.1设计思路 (2)2.2.2数据结构设计及用法说明 (2)2.2.3程序结构(流程图) (3)2.2.4各模块的功能及程序说明 (3)2.2.5程序结果 (6)2.3程序源代码及注释 (8)第3章课程设计总结 (17)参考资料. (18)第1章课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行Windows 2000/XP操作系统的微机系统。
C语言程序设计及相应的开发环境。
1.3 课程设计的预备知识熟悉C语言及C语言开发工具。
1.4 课程设计要求1分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章课程设计内容2.1程序功能介绍黑白棋游戏是一个深受人们喜爱的游戏,有人机对弈和人人对以两种情况,人与人对弈一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己棋子的数目多于对方。
按键盘上的方向键可以上下左右移动棋子,按回车键可以摆放棋子。
2.2程序整体设计说明2.2.1设计思路(1)每个棋手下棋时,摆子的位置必须是以自己的棋子能包围住对方一个或多个棋子,被包围住的对方棋子将成为自己的棋子。
包围的方向可以是上下左右以及斜线8个方向,只要能连成一线即可。
(2)当轮到某一个棋手下子,但是他没有可以包围对方棋子的位置时,他必须停步,让对方走棋,直到他可以走为止。
(3)当棋盘上一方的棋子为0或者下满64格,游戏结束,棋子少者输2.2.2数据结构设计及用法说明在黑白棋的程序设计中主要应用了模块,利用主调函数和被调函数实现程序的运行。
例如:在住函数中调用了函数DrawQp();以实现绘制棋盘的功能。
在这个程序中多处运用这种调用关系,以实现程序的运行。
我首先使用了最简单的顺序结构程序设计。
这是最基本的数据结构设计。
按照我的设计思路按书写顺序依次执行主函数,接下来是各个被调函数,在对这些函数进行简单的连接。
但程序都不会是简单的顺序结构,而是顺序、选择、循环三种结构的组合。
所以在本程序的设计中,我大量的使用了选择结构和循环结构程序设计,进行选择结构程序设计需要考虑两个方面的问题:一是在C语言中如何表示条件,二是在C语言中用什么语句来实现选择结构。
我使用了if语句实现选择结构,if语句一般用来实现单分支和双分支选择结构,有三种形式。
例如在playtoplay模块中就大量的运用了if语句。
而循环语句是一种算法多次执行,直到运行结束。
在运用循环结构时,难在掌握好循环体,比如在Qpchange模块中就运用了大量的for循环嵌套,并配合break、continue 使用进行循环。
使程序更简洁,易读性加强。
2.2.3程序结构(流程图)可参考流程图2.2.3-1图2.2.3-1流程图2.2.4各模块的功能及程序说明(1)main()主函数首先初始化图形模式,然后通过调用函数先画出棋盘,再开始游戏,一旦游戏结束则关闭图形模式,程序结束。
(2)DrawQp()画棋盘函数先设置背景色,然后通过循环利用水平和垂直直线画出棋盘,再利用填充圆画出初始棋子。
(3)SetPlayColor()设置棋子的颜色目的是为判断棋手和棋盘的变化,根据函数参数的值来设计填充棋子的当前颜色,值为1代表白棋,值为2代表黑棋。
(4)MoveColor()恢复原来棋子的状态棋手要通过移动光标键走到落子的位置,在经过的路程上显示当前棋子,则会覆盖原来的棋盘状态,所以一旦棋子走过后,就应恢复原来的状态。
(5)playbplay()人人对战函数这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:1)按Esc键程序可以随时结束。
2)按上下左右光标键,则改变棋子移动的坐标值。
3)按回车键后判断:如落子的位置已经有棋则无效,继续压键。
〔1〕如落子位置是空格,可以将棋子落入格内,调用函数QpChange()判断是否引起棋盘的变化,函数值为1有变化,为0没变化。
如果棋盘有变化,说明将包围的对方棋子吃掉,统计当前分数,如果棋盘没有变化,则说明落子的位置无法包围对方的棋子也视为无效棋,可以继续寻找合适的位置,但开始统计其落子次数,一旦尝试次数超过当前棋盘的空格数,则说明他无棋可走,则放弃此步,让对方下棋。
〔2〕如果棋子变化后,格子已占满64格或一方棋子为0,则游戏结束,显示胜利方信息。
按任意键程序结束。
〔3〕重复上述步骤,直到游戏结束。
(6)QpChange()判断棋盘变化当棋手按回车键落子后,就要分别往8个方向判断是否包围住对方棋子,如果是,则改变棋盘,也就是棋盘上黑白棋子的个数要发生变化。
表示黑白棋的图形用屏幕上的像素坐标,而棋子的状态是数组元素a,所以要根据落子的坐标x和y计算出对应数组元素a的下标i和j。
i代表行,j代表列,对于8×8的棋盘,它们的值为0-7,如果j<6,往右边判断,从当前位置开始,用循环语句判断右边是否有一个或连续多个对方的棋子,遇到自己的棋子或空格则结束循环,如果循环结束不是遇到空白,且列坐标小于8,则说明这些位置的棋子是被自己包围的对方棋子,将它们吃掉.也就是改变为自己的棋子,如果有棋子发生了变化,给棋盘变化标志值yes赋值为1,同样的方法向左、上、下等8个方向进行判断,并作相应的变化。
如果所有方向都判断过,并且没有引起棋盘的变化,则棋盘变化标志值yes为0,返回yes,结束本函数。
(7)DoScore ()处理分数根据当前数组元素的值判断分数,也就是各方棋子的个数,如果数组元素值为1,白棋棋子数累加;如果数组元素值为2,则黑棋棋子数累加。
(8)PrintScore()输出成绩利用设置实体填充模式填充矩形条消除掉前次的成绩,再利用索赔sprintf()函数将整数转换为字符串的形式,再利用outtextxy0函数将成绩输出。
(9)playWin()输出胜利者结果根据分数值score1和score2的大小得出下棋的结果,输出赢者信息。
2.2.5程序结果运行结果可参照结果运行图 2.2.5-1,图 2.2.5-2,图 2.2.5-3,图 2.2.5-4,图2.2.5-5:图2.2.5-1结果运行1图2.2.5-2结果运行2图2.2.5-3结果运行3图2.2.5-4结果运行4图2.2.5-5结果运行52.3程序源代码及注释#include "graphics.h" /*图形系统头文件*/#define LEFT 0x4b00 /*光标左键值*/#define RIGHT 0x4d00 /*光标右键值*/#define DOWN 0x5000 /*光标下键值*/#define UP 0x4800 /*光标上键值*/#define ESC 0x011b /* ESC键值*/#define ENTER 0x1c0d /* 回车键值*/int a[8][8]={0},key,score1,score2;/*具体分数以及按键与存放棋子的变量*/ char playone[3],playtwo[3];/*两个人的得分转换成字符串输出*/void playtoplay(void);/*人人对战函数*/void DrawQp(void);/*画棋盘函数*/void SetPlayColor(int x);/*设置棋子第一次的颜色*/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();/*人人对战*/getch();closegraph();/*关闭图形系统*/}void DrawQp()/*画棋盘*/{int i,j;score1=score2=0;/*棋手一开始得分都为0*/setbkcolor(BLUE);for(i=100;i<=420;i+=40){line(100,i,420,i);/*画水平线*/line(i,100,i,420); /*画垂直线*/}setcolor(0);/*取消圆周围的一圈东西*/setfillstyle(SOLID_FILL,15);/*白色实体填充模式*/fillellipse(500,200,15,15); /*在显示得分的位置画棋*/ setfillstyle(SOLID_FILL,8); /*黑色实体填充模式*/fillellipse(500,300,15,15);a[3][3]=a[4][4]=1;/*初始两个黑棋*/a[3][4]=a[4][3]=2;/*初始两个白棋*/setfillstyle(SOLID_FILL,WHITE);fillellipse(120+3*40,120+3*40,15,15);fillellipse(120+4*40,120+4*40,15,15);setfillstyle(SOLID_FILL,8);fillellipse(120+3*40,120+4*40,15,15);fillellipse(120+4*40,120+3*40,15,15);score1=score2=2; /*有棋后改变分数*/DoScore();/*输出开始分数*/}void playtoplay()/*人人对战*/{int x,y,t=1,i,j,cc=0;while(1)/*换棋手走棋*/{x=120,y=80;/*每次棋子一开始出来的坐标,x为行坐标,y为列坐标*/ while(1) /*具体一个棋手走棋的过程*/{PrintScore(1);/*输出棋手1的成绩*/PrintScore(2);/*输出棋手2的成绩*/SetPlayColor(t);/*t变量是用来判断棋手所执棋子的颜色*/fillellipse(x,y,15,15);key=bioskey(0);/*接收按键*/if(key==ESC)/*跳出游戏*/break;elseif(key==ENTER)/*如果按键确定就可以跳出循环*/if(y!=80&&a[(x-120)/40][(y-120)/40]!=1&&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置没有棋子*/{if(t%2==1)/*如果是棋手1移动*/a[(x-120)/40][(y-120)/40]=1;else/*否则棋手2移动*/a[(x-120)/40][(y-120)/40]=2;if(!QpChange(x,y,t))/*落子后判断棋盘的变化*/{a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/cc++;/*开始统计尝试次数*/if(cc>=64-score1-score2) /*如果尝试超则停步*/ {MoveColor(x,y);fillellipse(x,y,15,15);break}elsecontinue;/*如果按键无效*/}DoScore();/*分数的改变*/break;/*棋盘变化了,则轮对方走棋*/else/*已经有棋子就继续按键*/continue;}else /*四个方向按键的判断*/if(key==LEFT&&x>120)/*左方向键*/MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);elseif(key==RIGHT&&x<400&&y>80)/*右方向键*/{ MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);} elseif(key==UP&&y>120)/*上方向键*/{ MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15);} elseif(key==DOWN&&y<400)/*下方向键*/{ 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)/*格子已经占满或一方棋子为0判断胜负*/{playWin();/*输出最后结果*/break;}t=t%2+1; /*一方走后,改变棋子颜色即轮对方走*/cc=0; /*计数值恢复为0*/} /*endwhile*/}if(i>1&&j<6)/*右上*/{for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]&&k>=0&&kk<8){for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;}}if(i<6&&j>1)/*左下*/{for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k<8&&kk>=0){for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i+1)yes=1;}}if(i>1&&j>1)/*左上*/{for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k>=0&&kk>=0){for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;}}if(i<6&&j<6)/* 右下*/{for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&kk<8&&k<8){for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i+1)yes=1;}}return yes;/*返回是否改变过棋子颜色的标记*/}void DoScore()/*处理分数*/{int i,j;score1=score2=0;/*重新开始计分数*/if(a[i][j]==1)/*分别统计两个人的分数*/score1++;elseif(a[i][j]==2)score2++;}void PrintScore(int playnum)/*输出成绩*/{if(playnum==1)/*清除以前的成绩*/{setfillstyle(SOLID_FILL,BLUE);bar(550,100,640,400);}setcolor(RED);settextstyle(0,0,4);/*设置文本输出样式*/if(playnum==1)/*判断输出哪个棋手的分,在不同的位置输出*/ {sprintf(playone,"%d",score1);outtextxy(550,200,playone);}else{sprintf(playtwo,"%d",score2);outtextxy(550,300,playtwo);}setcolor(0);}void playWin()/*输出最后的胜利者结果*/ {settextstyle(0,0,4);setcolor(12);if(score2>score1)/*开始判断最后的结果*/ outtextxy(100,50,"black win!");elseif(score2<score1)outtextxy(100,50,"white win!");elseouttextxy(60,50,"you all win!");}第3章课程设计总结这次实训是老师给了范例程序,经过自己的改写,实现要求。