c语言程序黑白棋设计流程
- 格式:doc
- 大小:60.00 KB
- 文档页数:14
黑白棋课程设计攀枝花学院课程设计题目:黑白棋游戏院(系):数学与计算机学院年级专业: 2014级软件工程姓名:田坤林学号: 201410804095 指导教师:陈斌二〇一五年一月十日攀枝花学院教务处制攀枝花学院本科学生课程设计任务书课程设计(论文)指导教师成绩评定表摘要黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello)、苹果棋或翻转棋。
黑白棋在西方和日本很流行。
游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。
棋子:黑白棋棋子每颗由黑白两色组成,一面白,一面黑,共64个(包括棋盘中央的4个)。
棋子呈圆饼形。
棋盘:黑白棋棋盘由64格的正方格组成,游戏进行时棋子要下在格内。
棋盘可分为“角”、“边”以及黑白棋“中腹”。
现今的棋盘多以8x8较为普遍。
棋钟:正式的比赛中可以使用棋钟对选手的时间进行限制。
非正式的对局中一般不使用棋钟。
黑白棋的棋盘是一个有8*8方格的棋盘。
下棋时将棋下在空格中间,而不是像围棋一样下在交叉点上。
开始时在棋盘正中有两白两黑四个棋子交叉放置,黑棋总是先下子。
下子的方法把自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜八个方向内有一个自己的棋子,则被夹在中间的全部翻转会成为自己的棋子。
并且,只有在可以翻转棋子的地方才可以下子。
如果玩家在棋盘上没有地方可以下子,则该玩家对手可以连下。
双方都没有棋子可以下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜。
在棋盘还没有下满时,如果一方的棋子已经被对方吃光,则棋局也结束。
将对手棋子吃光的一方获胜。
每个“翻转棋”游戏开始时,棋盘上已经交叉放好了四颗棋子。
其中两颗是黑棋,另两颗是白棋。
黑棋总是先走。
当您的棋子在某一直线方向包围了对手的棋子时,就可以翻转这些棋子的颜色,使它们成为您方的颜色。
例如,如果您执黑棋,并且看到在一排白棋的某一端是一颗黑棋,那么当您将一颗黑棋放在这一排的另一端时,所有的白棋都将翻转并变为黑棋!所有的直线方向均有效:水平、垂直和斜线方向。
基于C语言的黑白棋游戏设计黑白棋,也被称为翻转棋,在全球范围内广受欢迎。
它的玩法简单而富有挑战性,因此在计算机科学领域中,基于C语言的黑白棋游戏设计成为了一个常见的项目。
本文将详细介绍如何使用C语言设计一个功能完善的黑白棋游戏。
一、游戏规则黑白棋的规则很简单,游戏双方通过轮流下棋,在棋盘上放置自己颜色的棋子。
当一个棋子被夹在两个对方的棋子之间时,这个棋子就会被翻转成对方的颜色。
游戏继续进行,直到棋盘被填满或者双方都无法再下棋为止。
最后,棋盘上棋子数量较多的一方获胜。
二、程序设计1. 游戏界面设计在设计游戏界面时,我们可以使用C语言提供的字符画功能。
通过绘制合适大小的方格和棋子标识符,可以在控制台上模拟出一个棋盘。
同时,使用特殊字符来绘制提示信息和菜单栏,可以增强游戏的可玩性和视觉效果。
2. 数据结构设计为了表示棋盘和棋子的状态,我们需要设计相应的数据结构。
一个简单而有效的方法是使用二维数组来表示棋盘。
每个数组元素的值可以用来表示该位置的状态,比如1表示黑棋、2表示白棋、0表示空位。
这样,可以通过对数组的操作来实现棋子的落子和翻转。
3. 游戏逻辑设计黑白棋的游戏逻辑涉及到棋子落子、翻转以及胜负的判断。
在程序设计中,我们需要编写相应的函数来处理这些逻辑。
比如,可以编写一个函数来检查某一位置是否可以落子,以及另一个函数来实现棋子翻转的操作。
4. 用户交互设计为了使游戏更加友好和可操作性强,我们可以设计一些用户交互功能。
比如,在每次轮到玩家下棋时,程序可以提示玩家输入坐标来落子。
同时,我们可以设计一些额外的功能,比如悔棋、重新开始等,以提升游戏的易用性。
三、程序实现下面是一个简单的基于C语言的黑白棋游戏设计的示例代码:```c#include<stdio.h>#define SIZE 8void initializeBoard(int board[SIZE][SIZE]) {// 初始化棋盘}void printBoard(int board[SIZE][SIZE]) {// 绘制棋盘}int isLegalMove(int board[SIZE][SIZE], int row, int col) {// 检查是否可以落子}void makeMove(int board[SIZE][SIZE], int row, int col, int player) { // 落子}void flipPieces(int board[SIZE][SIZE], int row, int col, int player) { // 翻转棋子}int hasValidMove(int board[SIZE][SIZE], int player) {// 检查是否有可行的落子点}int countPieces(int board[SIZE][SIZE], int player) {// 统计棋盘上的棋子数量}int main() {int board[SIZE][SIZE];int currentPlayer = 1; // 1代表黑子,2代表白子initializeBoard(board);while (hasValidMove(board, currentPlayer)) {printBoard(board);int row, col;printf("Player %d's turn, please enter row and column: ", currentPlayer);scanf("%d %d", &row, &col);if (isLegalMove(board, row, col)) {makeMove(board, row, col, currentPlayer);flipPieces(board, row, col, currentPlayer);currentPlayer = (currentPlayer == 1) ? 2 : 1;} else {printf("Invalid move!\n");}}int blackCount = countPieces(board, 1);int whiteCount = countPieces(board, 2);printf("Game over! ");if (blackCount > whiteCount) {printf("Player 1 wins!\n");} else if (blackCount < whiteCount) {printf("Player 2 wins!\n");} else {printf("It's a draw!\n");}return 0;}```四、总结通过使用C语言,我们可以轻松地设计和实现一个黑白棋游戏程序。
黑白棋c 课程设计一、教学目标本课程旨在通过黑白棋(C)的教学,让学生掌握黑白棋的基本规则和策略,提高学生的逻辑思维能力和决策能力。
具体的教学目标如下:知识目标:学生能够理解黑白棋的起源、基本规则和常用策略。
技能目标:学生能够独立完成黑白棋的设置和游戏,掌握基本的对弈技巧和策略。
情感态度价值观目标:学生能够培养团队合作精神,学会尊重对手,增强自信心和抗挫能力。
二、教学内容本课程的教学内容主要包括黑白棋的基本规则、棋子的走法、游戏的设置和策略等。
具体的教学内容如下:1.黑白棋的起源和发展:介绍黑白棋的历史背景和发展过程。
2.黑白棋的基本规则:讲解棋盘的布局、棋子的颜色和初始位置,以及如何进行合法的走法。
3.棋子的走法:教授不同棋子的走法,包括王、后、象、马、车等。
4.游戏的设置:讲解如何设置棋盘和初始布局,以及如何进行合法的走法。
5.常用策略:介绍基本的黑白棋策略,如包围、阻断、防守等。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
1.讲授法:通过讲解黑白棋的基本规则、棋子的走法和常用策略,使学生掌握相关知识。
2.讨论法:学生进行小组讨论,分享彼此的黑白棋经验和策略,提高学生的思考和沟通能力。
3.案例分析法:分析经典的黑白棋对局,让学生学会分析局势和制定策略。
4.实验法:让学生亲自动手进行黑白棋游戏,培养学生的实际操作能力和决策能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:选用权威、实用的黑白棋教材,为学生提供系统的学习材料。
2.参考书:提供相关的黑白棋参考书籍,供学生课后拓展阅读。
3.多媒体资料:制作精美的PPT和教学视频,帮助学生更好地理解和掌握黑白棋知识。
4.实验设备:提供足够的黑白棋棋盘和棋子,让学生进行实际操作和练习。
五、教学评估本课程的评估方式将包括平时表现、作业和考试等,以全面、客观地评价学生的学习成果。
c语言课程设计黑白棋一、教学目标本课程的目标是让学生掌握C语言编程的基本技能,通过实现一个黑白棋游戏项目,培养学生的编程思维和实际操作能力。
具体目标如下:1.知识目标:学生能熟练使用C语言进行编程,理解基本的编程概念,如变量、数据类型、运算符、控制结构等。
2.技能目标:学生能运用C语言实现简单的逻辑控制和函数调用,具备一定的算法分析能力,能独立完成黑白棋游戏的设计与实现。
3.情感态度价值观目标:培养学生对编程的兴趣和热情,提高学生的问题解决能力,培养学生的团队合作意识和创新精神。
二、教学内容教学内容以C语言的基本概念和编程技巧为主线,结合黑白棋游戏的设计与实现,具体安排如下:1.C语言基本概念:介绍C语言的语法规则、数据类型、运算符、控制结构等基本知识。
2.函数和数组:讲解函数的定义和调用、数组的使用和操作,以及函数指针的概念。
3.黑白棋游戏设计:引导学生分析游戏需求,设计游戏界面和逻辑,实现游戏的基本功能。
4.算法分析和优化:引导学生运用算法分析游戏中的问题,如棋子的移动规则、胜负判断等,并进行优化。
5.团队合作与创新:培养学生进行团队合作,共同完成游戏项目,鼓励学生发挥创新精神,为游戏添加更多功能和玩法。
三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,具体安排如下:1.讲授法:讲解C语言的基本概念和编程技巧,为学生提供系统的知识体系。
2.讨论法:学生进行团队讨论,分析游戏需求,设计游戏方案,培养学生的团队合作能力。
3.案例分析法:通过分析典型的黑白棋游戏案例,引导学生掌握游戏设计的要点和技巧。
4.实验法:学生动手编写代码,实现游戏功能,培养学生的实际操作能力和编程思维。
四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备等,具体安排如下:1.教材:选用《C程序设计原理与应用》作为主讲教材,为学生提供系统的知识学习。
2.参考书:推荐《C语言程序设计》等辅助教材,供学生拓展阅读和自学。
目录一、设计目的 (2)二、设计要求 (2)三、所需仪器设备 (2)四、课题分析 (2)五、具体设计过程 (3)5.1、设计思路 (3)5.2、程序设计流程图 (3)5.3、函数实现说明 (6)5.4、图形库函数介绍 (7)5.5、程序源代码及注释 (9)5.6、调试结果 (19)六、设计心得体会 (20)七、参考文献 (21)《黑白棋游戏》C语言课程设计一、设计目的本课程设计是计算机软件技术基础重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:(1)巩固和加深学生对C语言课程的基本知识的理解和掌握;(2)掌握C语言编程和程序调试的基本技能;(3)利用C语言进行基本的软件设计,掌握软件设计一般方法,了解软件设计的思路;(4)掌握书写程序设计报告的能力;(5)提高运用C语言解决实际问题的能力;这个程序也是对编程基本功的一个训练,对于初学C语言的人,讲分支、循环、数组函数综合应用,而不仅限于编制独立的小程序,能够大大提高变成水平。
二、设计要求(1)收集资料,全面分析课题,分解问题,形成中体编程思路;(2)深入分析各个小问题,编写个部分程序模块;(3)对于设计中用到的关键函数,要联系实际问题进行具体介绍;(4)上机调试,确保程序能正确运行;(5)设计完成后提交课程设计报告;三、所需仪器设备(1)硬件要求能运行Windows 2000/XP操作系统的微机系统。
(2)C语言程序设计及相应的开发环境。
(本设计用的是Turbo C for Windows 集成实验与学习环境 V6.0)四、课题分析编写一个《黑白棋游戏》的C程序,包括以下功能:初始状态:在一个8*8的棋盘中央交叉排放黑白棋子各两枚,白棋先走。
(1)每个棋手下棋时,摆子的位置必须是以自己的棋子能包围住对方一个或多个棋子,被包围住的对方棋子将成为自己的棋子。
包围的方向可以是上下左右以及斜线8个方向,只要能连成一线即可。
C语⾔-⿊⽩棋(⼈机对战)1 #include <stdio.h>2 #include <stdlib.h>3/*4具体思路如下:51.定义⼀个⼆维数组chessboard[8][8],⽤于保存⿊⽩双⽅棋⼦的位置。
如果数组元素为0,表⽰该单元格未落⼦;如果是-1,表⽰该单元格是⿊⼦;如果是1,则表⽰该单元格是⽩⼦。
62.当⼀⽅下棋时,先检查是否有位置可下,如果有则⼰⽅下棋,如果没有就让对⼿下棋。
73.若玩家下,需要等待玩家输⼊棋⼦坐标,然后执⾏翻转对⼿棋⼦操作。
84.若计算机下,程序需对棋盘所有可以落⼦的位置进⾏判断,找出最佳的落⼦位置,然后执⾏翻转对⼿棋⼦操作。
95.重复步骤2~4,直到棋盘已满或双⽅都不能下⼦时结束。
10*/1112void Output(char chessboard[][8]); //显⽰棋盘中的下⼦情况13int Check(char chessboard[][8],int moves[][8],char player);//检查⼀⽅是否有位置下⼦14void PlayStep(char chessboard[][8],int row,int col,char player);//在指定位置下棋15void AutoPlayStep(char chessboard[][8],int moves[][8],char player);//计算机思考下⼦16int GetMaxScore(char chessboard[][8],char player);//获取分数17int BestPlay(char chessboard[][8],int moves[][8],char player);//最优下⼦位置181920int main(){21char chessboard[8][8];//保存棋盘中各单元格下⼦的状态22int isDown[8][8] = {0};//保存棋盘中的各个位置是否可以下⼦,可以下的位置为1,其余为023int row,col,x,y;24int iCount = 0;//以下⼦的数量25int player = 0;//下棋⽅26int SkipPlay = 0;//重置下⼦的次数为0,若为2,则表⽰双⽅都不能下⼦27int Score[2];//保存计算机和玩家的得分2829char select,ch;3031 printf("⿊⽩棋\n\n");32 printf("玩家执⿊⼦先⾏,计算机执⽩,按Enter开始\n");333435 scanf("%c",&select);3637do{3839if(player==0){40 player = 1;41 }else{42 player = 0;43 }4445for(row=0;row<8;row++){46for(col=0;col<8;col++){47 chessboard[row][col]=0;48 }49 }5051 iCount = 4;//游戏开始的四颗棋⼦52 chessboard[3][3] = chessboard[4][4] = 1;53 chessboard[3][4] = chessboard[4][3] = -1;5455 printf("\n棋盘初始状态:\n");56 Output(chessboard);5758//双⽅下棋59do{60if(player==1){//玩家下棋(⿊)61 player = 0;62if(Check(chessboard,isDown,2)){63while(1){64 fflush(stdin);65 printf("输⼊下⼦的位置(⾏,列):");66 scanf("%d%c",&x,&ch);67 x--;//因为数组是从0开始存的68if(ch>='a'){69 y = ch - 'a' + 1;70 } else{71 y = ch - 'A' + 1;72 }73 y--;74//判断是否越界、是否已有棋⼦75if(x>=0&&x<8&&y>=0&&y<8&&isDown[x][y]){76 PlayStep(chessboard,x,y,2);77 iCount++;78break;79 }else{80 printf("坐标输⼊有误,请重新输⼊。
c语言黑白棋程序设计文档本文将为您介绍一份经过精心设计的基于C语言的黑白棋程序设计文档。
这个文档旨在为开发者提供一个清晰易懂、易于扩展的代码框架,以便更好地完成黑白棋游戏。
以下是本文档的结构和内容:一、简介黑白棋是一款二人对弈的棋类游戏,在8x8的方格棋盘上进行。
本程序的目标是实现一个基本的黑白棋人机对战游戏。
玩家可以使用键盘来操作棋子落下的位置,程序会根据规则自动判断是否可以落子,并自动翻转另一方的棋子。
程序还可以提供简单的AI进行游戏,让玩家可以对战电脑。
本程序使用了C语言进行编写,并且采用简单易懂的函数式编程方法,使得程序更加易于维护和扩展。
二、程序设计在程序设计中,我们遵循了模块化、封装和数据隐藏的原则,使得代码结构更加清晰明了,易于理解和维护。
主要分为5个模块:负责程序的初始化工作,包括初始化棋盘、初始化玩家、初始化AI等等。
在main函数中,我们通过调用下面四个模块的函数来构建整个游戏的逻辑流程。
2. chessboard模块负责棋盘的初始化、显示、落子、判断是否合法等逻辑处理。
该模块中定义了结构体变量用于存储棋盘信息。
在该模块中定义了落子的函数check(),该函数根据当前棋子的位置、颜色和棋盘状态进行判断,如果可以落子,则将当前棋子位置上色,并调用翻转棋子的函数reverse(),否则提示玩家重新输入坐标。
3. player模块负责玩家的初始化、操作、胜负判断等逻辑处理。
在该模块中定义了结构体变量用于存储玩家信息。
该模块中定义了getinput()函数,该函数根据玩家从键盘输入的信息获取当前落子的位置。
4. AI模块负责人工智能的实现,其中包括随机落子AI、进攻型AI、防守型AI 等。
在该模块中定义了结构体变量用于存储AI信息。
AI的实现方式采用了启发式搜索,寻找最优解。
同时,AI还要判断当前落子位置是否合法,如果不合法则重新进行随机落子。
负责一些通用函数的实现,如计算得分、判断胜负等等。
运行结果:源码:#include<stdio.h>#include<math.h>int rule(int map[8][8],int x,int y,int order);////规则函数int judge(int map[8][8],int order);////判断函数void eat(int map[8][8],int x,int y,int order);//////吃子函数void refresh(int map[8][8]);/////刷新函数void main(){int x,y,order=1,count=0,can=0,end=2;int map[8][8]={0};map[3][3]=1;map[3][4]=-1;map[4][3]=-1;map[4][4]=1;/////-1 represent white 1 represent blackrefresh(map);while(end)/////如果双方同时不能落子则宣告结束{count=judge(map,order);if(order==1)printf("黑方下:");elseprintf("白方下:");if(count==0){printf("无法落子,请对方下\n");order=-order;end--;}else{end=2;scanf("%d %d",&x,&y);can=rule(map,x-1,y-1,order);if(can==0)printf("不符合落子规则\n");else{eat(map,x-1,y-1,order);order=-order;}}}printf(" game over\n");}int judge(int map[8][8],int order){int rule(int map[8][8],int x,int y,int order);int i,j,ju=0,n=0;for(i=0;i<8;i++)for(j=0;j<8;j++){n=rule(map,i,j,order);if(n>0){printf("横标%d竖标%d可以下子\n",i+1,j+1);ju++;}}return ju;}int rule(int map[8][8],int x,int y,int order){int arry[8][2]={{0,-1},{0,1},{-1,-1},{-1,0},{-1,1},{1,-1},{1,0},{1,1}};int i,ru=0,lx,ly;if(map[x][y]==0)////保证所下的子原来是空处{for(i=0;i<8;i++){lx=x+arry[i][0];ly=y+arry[i][1];if(map[lx][ly]!=-order)continue;while(map[lx][ly]==-order&&lx>-1&&ly>-1&&lx<8&&ly<8) {lx=lx+arry[i][0];ly=ly+arry[i][1];}if(map[lx][ly]==order&&lx>-1&&ly>-1&&lx<8&&ly<8)ru++;}}return ru;}void eat(int map[8][8],int x,int y,int order){void refresh(int map[8][8]);int arry[8][2]={{0,-1},{0,1},{-1,-1},{-1,0},{-1,1},{1,-1},{1,0},{1,1}};int i,lx,ly;for(i=0;i<8;i++){lx=x+arry[i][0];ly=y+arry[i][1];if(map[lx][ly]!=-order)continue;while(map[lx][ly]==-order&&lx>-10&&ly>-1&&lx<8&&ly<8){lx=lx+arry[i][0];ly=ly+arry[i][1];}if(map[lx][ly]==order&&lx>-1&&ly>-1&&lx<8&&ly<8){int m=0,n=0;if(lx-x!=0&&ly-y!=0){do{map[x+m][y+n]=order;m=m+(lx-x)/abs(lx-x);n=n+(ly-y)/abs(ly-y);}while(m!=lx-x);}else if(lx-x==0){do{map[x][y+n]=order;n=n+(ly-y)/abs(ly-y);}while(n!=ly-y);}else{do{map[x+m][y]=order;m=m+(lx-x)/abs(lx-x);}while(m!=lx-x);}}}refresh(map);}void refresh(int map[8][8]){int i,j,hei=0,bai=0;printf(" 1 2 3 4 5 6 7 8\n");printf(" +---+---+---+---+---+---+---+---+\n");for(i=0;i<8;i++){printf("%d",i+1);for(j=0;j<8;j++){switch(map[i][j]){case 0: printf(" | ");break;case 1: printf(" |○");hei++;break;///黑子case -1: printf(" |●");bai++;break;///白子}}printf(" |\n");printf(" +---+---+---+---+---+---+---+---+\n");}printf(" count of white %d\n count of black %d\n",bai,hei); }。
引言黑白棋的简要历史:黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。
黑白棋起源中世纪的英国,18世纪传入日本,并在日本得到了发展。
现在,黑白棋在西方和日本很流行。
游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。
它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。
有一种说法是:只需要几分钟学会它,却需要一生的时间去精通它。
“黑白棋规则”:1)两人对奕,以轮流方式持黑子与白子。
2)开辟新局者持白子,加入者持黑子,之后以轮流方式将棋子置于棋盘格子中。
若无地方可下子,则跳过一回,由对方下子。
3)在提示的格子中,选择一个格子下子,当下子的位置与离最近的同色旗子中,若有其他棋子则中间的棋子变为与我方一样颜色。
4)当下满64个棋子,棋子多者为胜。
关于C语言:C语言是一种结构化设计语言,它兼顾有高级语言的特点和低级语言的功能。
其设计功能十分强大,既可用于编写应用软件,又可用于设计制作系统软件。
同时,C语言是一种较为通用的编程软件,在目前的软件行业中使用也是十分的广泛。
虽然C语言是面向DOS编程的,但它是计算机的底层编程工具之一。
由C语言编写的程序,它的代码质量和运行速度仅次于汇编语言编写的程序,C语言具有简单易学和可移植性好等特点,同时又具有汇编语言的特点,具有较强的生命力和广泛的应用前景。
第一章系统分析1、1 可行性分析科技的飞速发展,将人类带入了信息时代,计算机越来越贴近人的生活,速度成为人们成功的前提条件,以致于人们必须不断尝试着使用各种手段来提高自身的工作效率,其手段之一就是对键盘的充分利用和相应游戏软件的开发.智能型的游戏越来越深受广大游戏爱好者的喜欢.方便而快捷.黑白棋的游戏是要在一个8*8的网格中进行,而数组属于构造体类型,数组是具有相同数据类型的变量序列,序列中的每个变量成为元素,数组元素由一个统一标识的数组名和顺序好“下标”来表示。
顾需要在游戏中定义一个二维数从而实现游戏的走棋、落棋、判断棋盘的变化等。
游戏不同于基于C语言的其他程序(如学生成绩管理系统、教务工作管理系统、图书管理系统等)由于游戏本身的问地就在于缓解压力,所以基于C语言设计的游戏需要一个良好的游戏界面,给游戏者以轻松和愉快的感觉。
TURBO C提供了70多个图形函数,这些函数包括在图形库文件graphics.LIB中,他们被定义在graphics.h中。
有如此强大的图形处理能力,去设计一个良好的人机交流界面是可行的。
由于此游戏采用的是“人人对战”的模式,所以在游戏时,需要俩个游戏者轮流下棋,棋手1走棋完毕后,经过判断棋盘变化过程后棋手2走棋,游戏过程需要在俩棋手间不断进行转化。
在C语言中,提供了包括if……else,switch……case等分支语句,综合运用这些分支语句,可以完成上述转化。
黑白棋游戏双方共需要走棋60手,每次走棋后,都需要根据相同的标准判断棋盘变化,来判断旗子颜色的变化情况。
显然需要运用循环语句来简化编程的长度。
C语言中提供了while \for等循环语句可以实现上述功能。
游戏需要操作和输出显示游戏的结果,游戏的操作要由计算机的外部设备在人的操作下完成。
C语言本身并不提供输入和输出语句,输入和输出的操作都是由函数来完成的,在C 语言的标准库函数中提供了一些输入和输出的函数,这些函数的指针都是针对系统隐含指定的输入和输出设备的。
综合运用这些输入和输出的函数可以实现上述的功能。
经济可行性分析:本游戏的实现,花费了很多时间,但没有花费什么费用,而已这样简单但有一定难度的游戏更能激发游戏爱好者的兴趣,因此黑白棋游戏可以满足游戏市场的寻求.综合上述,基于C语言的游戏黑白棋的设计是可行的。
1、2 游戏黑白棋的总体设想在主函数中,通过调用绘制棋盘、棋手对战,判断棋盘变化、改变棋子颜色等函数的调用来实现主函数的相应的功能,以下是有关于主函数的流程图。
绘制棋盘和初始棋子DrawQp棋手对战playtoplay判断棋盘变化(能否分出胜负)QpChange计算棋手的成绩输出胜利者信息Y图2—1 主函数流程图子函数功能一览表表2—1子函数功能一览表序号名称功能备注1DrawQp绘制棋盘和初始棋子在界面上绘制320*320的棋盘,并在棋盘中绘制8*8的格子,初始棋子2SetPlay设置棋子第一次的颜色先走棋者持白子,后走棋黑子,每次交替3Playtoplay人人对战函数俩棋手交替走棋,定义键盘操作等4MoveColor恢复原来棋盘状态棋子由初始位置到落子位置的路径不改变颜色5QpChange判断棋盘的变化改变棋子的颜色走棋后判断棋盘的变化情况,根据变化情况判断是否可以输出分数6DoScore处理分数根据棋盘上旗子的多少进行分数的处理第二章子函数2、1 画棋盘函数绘制过程总括位置定义大小定义底色定义绘制棋子棋子大小颜色颜色定义棋子位置图2——1具体的绘制内容2—1—1图形库文件#include "graphics.h"TURBO C提供了70多个图形函数,这些函数包括在图形库文件graphics.LIB中,他们被定义在graphics.h中。
编写图形程序的时候,一定高包口头文件graphics.h。
2—1—2图形初始化函数int gd=DETECT,gr图形初始化函数initgraph(&driver,&mode,“路径”)功能:装入图形驱动程序参数DRIVER指图形适配器驱动软件,用宏名或数字来表示,它实际上是一个枚举变量。
当不知道所用的显示器是什么名称的时候,可将driver设置成DETECT,它将自动的检测所用的适培器的型号,并奖相应的驱动程序装入,调节到最高分辨显示模式。
参数MODE是每一种图形适配器的代码,可以是宏名或是数字,参数MODE不用指具体的值,系统将采用最高的分辨率。
2—1—3设置背景颜色Setbkcolor(color)——设置背景颜色。
若不设置,则背景的颜色为黑色Setcolor(color)——设置画线的颜色或者是调色板的颜色。
如果不设置,则系统指定为白色,其中COLOR为颜色的控制号或是颜色的宏名,为整形,设置的颜色保存到程序中遇到下一个设置颜色是为止。
在本程序中,设置的的北京颜色为蓝色,setbkcolor(BLUE),根据上述可知,此时,游戏界面的底色为蓝色。
setcolor(0)将线的颜色设置为黑色,由此是为了取消取消了圆形图形周围的东西。
2—1—4画线Line(x1,y1,x2,y2)从点(X1,Y1)到点(X2,Y2)画一条直线,颜色为当前的颜色,当前的位置是画线前的位置。
for(i=100;i<=420;i+=40){line(100,i,420,i);/*画水平线*/line(i,100,i,420); /*画垂直线*/}在本程序中,使用上述源代码实现绘制棋盘的功能,也就是以40为一个步增,以(100,100)为起点,以(100,420)、(420,100)(420,420)为顶点画出棋盘,棋盘大下为320*320,由于步增是40,所以,棋盘上自然出现8*8的格子,由于画线的时候,没有定义线的颜色,所以线的颜色是默认的白色,所以最终出现了兰色的底面上以白色画格子的棋盘。
2—1—5设置填充模式和颜色Setfillstyle(pattern,color)——设置填充模式和颜色其中:pattern=SOLID_FILL为填充实心充色Color为颜色号码。
Ellipse为画椭圆Ellipse——用当前颜色以(X,Y)为中心,X、Y为俩半径FILLELLIPSE(X,Y ,RX,RY)以(X,Y)为中心,以RX、RY为半径画椭圆,并以设置或者是默认的颜色来涂色setfillstyle(SOLID_FILL,15);/*白色实体填充模式*/fillellipse(500,200,15,15); /*在显示得分的位置画棋*/setfillstyle(SOLID_FILL,8); /*黑色实体填充模式*/setfillstyle(SOLID_FILL,WHITE);在本程序中,使用的上述的代码来绘制棋子,棋子为半径为15的圆,,颜色分别为代码为15和8的深灰色和白色俩种棋子,分别由俩为旗手来使用。
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);开局是在8*8的棋盘的四个位置上分别设置四个棋子,位置分别为(3,3)|(4,4)俩个白子,(3,4)、(4,3)俩个黑子,也就是要在棋盘的(120+3*40,120+3*40)和(120+4*40,120+4*40)位置绘制半径为15的俩个白球,在(120+3*40,120+4*40),(120+4*40,120+3*40)俩个位置绘制俩个黑色棋子。
附表:颜色代号颜色颜色号符号常量黑色BLACK1蓝色BLUE15白色WHITE2、2 对战函2—2—1方向操作在主程序前,使用宏定义将UP、DOWN 、LEFT 、RIGHT,做了相应的定义,因此,在对战函数当中可以使用已经进行过定义的以上四个进行操作,在操作的时候,由于所画的棋盘的没一个格子的大小是40*40,所以,每次键盘操作后,棋子移动的距离是向相应的方向移动40,这样才能保证每次落子的位置都在棋盘没个格子的中心处,保证了操作的有效性,也使得在棋子在棋盘上移动的过程中,如故和已经落子的棋子有重叠,当上访旗子移走后不会在下方棋子的周围留下其他的颜色。
每次移动后,在屏幕上显示的都是一个以15为半径的圆形。
同时,为了满足这一点就要在棋子每次走棋的初始位置上有所考虑:x=120,y=80每次棋子一开始出来的坐标,x为行坐标,y为列坐标,设定每次走棋的初始位置为(120,80),每次步增为40,以向下移动一次为例子:向下移动一次以后,中心位置变为(120,120),格子的边际的Y坐标为100,一个格子的大小为40*40,所以,此时格子的中心坐标也是(120,120),俩个坐标吻合,保证了棋子落在棋盘位置的中央。
由于走棋时,每个格子不能重复落子,所以,需要判断棋手要落子的地方是不是已经有了棋子,if(y!=80&&a[(x-120)/40][(y-120)/40]!=1&&a[(x-120)/40][(y-120)/40]!=2),当要落子的地方已经有棋子的时候,也就是此时的棋子将要放置的位置的X和是Y坐标已经和以前棋手1或者是2的棋子有重复,重复的时候则不能放置棋子。