北京师范大学C语言课程设计汇报课题名称:游戏五子棋指导老师:**课题组员:罗福莉赵帅帅何虹达院系:信息科学和技术时间:20XX.3.15-20XX.4.20摘要五子棋是一个两人对弈纯策略型棋类游戏,应用C语言编写程序能够在计算机上实现二人对弈五子棋功效。
二人对弈五子棋程序由欢迎界面显示、游戏界面生成、光标移动和落子、判定胜败、悔棋功效、提供音效等子程序组成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。
程序经过棋盘和棋子图像生成、二人移子和落子和判定胜败等功效实现,在计算机上实现了二人五子棋对弈。
目录摘要-------------------------------------------------------------------------------------- 2 第1章:需求分析-------------------------------------------------------------------- 41.1五子棋背景-------------------------------------------------------------------- 41.2 五子棋需求分析和步骤设计 -------------------------------------------- 4 第2章:概要设计-------------------------------------------------------------------- 92.1 各类头文件和全局变量--------------------------------------------------- 92.2 画面显示模块-------------------------------------------------------------- 10 第3章:具体设计------------------------------------------------------------------ 133.1 玩家操作模块-------------------------------------------------------------- 133.2音效提供模块 -------------------------------------------------------------- 143.3 胜败判定模块-------------------------------------------------------------- 14 第4章:调试分析------------------------------------------------------------------ 154.1 图形模块 -------------------------------------------------------------------- 154.2 玩家操作模块-------------------------------------------------------------- 154.3 胜败判定模块-------------------------------------------------------------- 16 第5章:用户手册------------------------------------------------------------------ 16第6章:小组分工------------------------------------------------------------------ 17 第7章:结论和心得 -------------------------------------------------------------- 18 第8章:源程序代码------------------------------------------------------------- 18 附录一Color命令使用说明 ------------------------------------------------ 38 附录二ASCII 码表------------------------------------------------------------- 39第1章:需求分析1.1五子棋背景传统五子棋棋具和围棋相同,棋子分为黑白两色,棋盘为18×18,棋子放置于棋盘线交叉点上。
两人对局,各执一色,轮番下一子,先将横、竖或斜线5个或5个以上同色棋子连成不间断一排者为胜。
因为传统五子棋在落子后不能移动或拿掉,所以也能够用纸和笔来进行游戏。
1.2 五子棋需求分析和步骤设计本程序设计为人和人对弈,一方执黑棋,一方执白棋,轮番走棋,每方全部试图在游戏结束前让自己棋子五子相连,首先实现五子相连一方获胜。
程序实施过程中,要求棋盘、棋子时时可见,游戏界面有提醒信息轮到何方下棋,人能够经过按键盘按键移动光标,再点击enter键摆放棋子,而且每落一子全部有系统声音,创新之处是能够提供悔棋功效。
1.2.1 程序需求分析依据功效需求,将程序分为画面显示、玩家操作、音效提供、胜败判定五个模块,以下分析各模块需求。
画面显示模块:程序开始运行时,显示制作者和给出欢迎及退出界面;游戏开始后要求生成18×18棋盘图像,并在棋盘上方显示欢迎信息“欢迎play our五子棋”,棋盘下方游戏显示应该轮到甲方或乙方落子,棋盘左右显示双方操作方法,进行过程中,要求实时显示棋盘上已落下棋子,甲方为白球,乙方为白圈;分出胜败后,要求给出游戏结束画面,而且问询用户是否需要继续游戏。
玩家操作模块:程序开始时,需玩家确定选择“人人对战”后开始游戏;游戏过程中,两个玩家经过不一样按键移动光标,选择落子;游戏进行过程中,目前玩家下棋后,另一位玩家下棋前,目前玩家能够悔棋。
悔棋提醒在棋盘右下方,为按键“b”。
游戏结束时,有玩家选择是否开始新游戏。
音效提供模块:玩家每落一子,系统提供音效一声,增加下棋趣味性。
胜败判定模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线五子,棋盘下方弹出该色玩家胜出信息。
1.2.2程序步骤设计依据程序需求分析结果,能够得出程序总体结构图图1,程序总体步骤图图2。
图1 五子棋总体结构图图2 程序总体步骤图第2章:概要设计2.1 各类头文件和全局变量#include <stdio.h>#include<windows.h>#include <stdlib.h>#include<conio.h> //使用getch()函数int startchoice; //int winner; //int player; //Q[200][200]= {0}; //Q数组统计旗子char button; //读入键盘输入指令,如→2.2 画面显示模块画面显示模块由欢迎界面,游戏棋盘界面,确定是否退出对话框界面,和感谢使用界面组成。
画面显示模块函数以下:void Welcome() //欢迎界面void Draw() //绘画游戏棋盘界面void Clean() //清除—→运动轨迹void menu_choose(char press) //选择是否退出游戏对话框void PutDown() //显示落子函数void goto_xy(int x, int y) //光标移动函数画面效果图图3,4,5,6。
图3 欢迎界面图图4 主菜单界面图图5 游戏界面图图6 确定退出对话框第3章:具体设计3.1 玩家操作模块棋子移动和落子有键盘上按键控制,本程序选择甲乙双方按键全部为W、S、↑、↓、←、→和回车键,“b”,“ESC”,分别代表上移、下移、左移、右移光标和落子,悔棋,退出。
在光标移动过程中,光标根据玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判定胜败子程序。
目前玩家下棋后,另一位玩家下棋前,目前玩家能够悔棋。
悔棋提醒在棋盘右下方,为按键“b”。
甲乙落子后,程序会为落子处数组元素赋一个特定值(玩家甲棋子赋为1,玩家乙棋子赋为2),用于判定胜败和悔棋。
玩家操作模块关键由以下函数组成:void Record() //统计棋子情况void go_back(int x1,int y1) //悔棋函数void Play(char ch) //读取键盘操作移动光标下棋和悔棋操作3.2音效提供模块为了提升游戏趣味性,我们为本游戏提供了简单系统音效。
程序语句很简单printf("\a"); //'\a'表示蜂鸣声3.3 胜败判定模块胜败判定模块是程序关键,该模块设计直接关系到程序运行速率和运行结果正确是否。
本函数依据每次落子位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判定是否有相同颜色棋子连成五子,假如成立,游戏就结束,并显示提醒信息,不然继续落子。
以下简析本程序步骤:,由获胜条件能够知,经过判定行、列、斜边、反斜边方向上是否有连续5个子即可得出是否获胜结果。
在游戏开始时,将棋盘初始化,立即棋盘抽象为一个18*18数组,数组中每个元素数值设为0。
甲方落子时,将数组内对应坐标处元素赋值为2;乙方落子时,将数组内对应坐标处元素赋值为1。
经过循环扫描棋盘数组,经扫描后,如发觉在行、列、斜边、反斜边方向上有五个连续2,甲方获胜;如发觉在行、列、斜边、反斜边方向上有五个连续1,乙方获胜。
胜败判定模块关键由一个函数组成:int Judge() //判定胜败函数第4章:调试分析4.1 图形模块1.在图形模块中,因为是第一次使用,所以刚开始时对于棋盘创建位置把握有些欠缺。
处理方案:参考书本和谷歌,找出最适宜位置坐标。
2.在构建棋子时候,发觉C语言中似乎对颜色处理有些错误,当棋谱线颜色为白色时,无法构建黑色棋子,只能画出白色棋子。
处理方案:用白圈区分于白球,类似白子和黑子。
4.2 玩家操作模块1. 在玩家操作模块中,出现最大问题之一就是棋盘已经有棋子地方还能够覆盖另一个棋子。
处理方案:经过在PutDown()函数中添加if条件语句,判定假如所在位置对应数组值不等于0时,不能落子。
2. 另一个问题就是之前提到,操作定位框时候会将定位框移到棋盘之外造成溢出。
处理方案:经过if语句判定,假如操作框超出范围则移动到对应相反位置,比如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置。