




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 计算机程序设计基础(C语言)课程设计题目:简易五子棋软件设计 院(系、部): 信息工程学院 姓 名: 班 级: 指导教师签名 2011 年7月7 日·北京目录任务书-第 3 页总体设计-第 4 页模块划分-第 4 页算法说明-第 4 页流程图-第 5 页程序测试-第 9 页结论-第 22 页体会及建议-第 22 页参考文献-第 23 页任务书题目9 :简易五子棋软件设计一 设计目的:通过一个综合应用程序的开发,掌握C语言程序设计的基本方法和常用算法,学会从实际应用出发来分析问题,进行软件规划和算法设计,逐步求精,养成良好的编程风格,熟悉软件设计的基本步骤,为后续课程的学习打下良好的
2、基础。功能:在单机上通过操作键盘来进行二人对战,五个棋子连在一起时能显示输赢。二 基本要求:(1)键盘上事先设定8个按键,分作两组,每组四个,分别代表两个人用来控制棋子的上下左右键。(2) 盘,15条横线,15条竖线,在直线交点处下棋子(实心圆形)。(3) 黑子先行,黑白交替下子,在棋盘上设定一个与棋盘格大小边长相等的正方形,初始状态,正方形的中心位于期盼的中心点。当一方欲走棋的时候,应用四个按键来控制所要下棋的位置,每按一次按键,正方形都要向相应方向移动一个格,但不能让其移出边界。当按下回车键时,应在正方形所在位置放下一个棋子,然后此组按键不能操作,换另一个人下棋,用另一组按键,规则同前。(
3、4) 当任何一方有五个棋子沿着横,竖,斜连在一起时,系统自动判断赢棋,并显示黑方或白方胜利。棋局结束后,任何一方均不能继续操作。相关知识:图形绘制、音乐制作、键盘响应功能扩充:(1)让喇叭发出某种声音,将要移出边界时,发出另一种警告声音 (2)其他自己定义的功能。三 总体设计本程序是为了实现运行简易五子棋游戏的运行。基于结构化设计思想的指导,本程序在设计的同时,将各个功能分为多个自定义函数来实现,最后在”main”函数里进行功能的整合。程序设计大体思路:由欢迎界面进入主程序,介绍游戏玩的方式,作者。若想进入游戏按y后回车,若想退出游戏按n即可。画16*16的五子棋棋盘,进入游戏界面,当每次落子
4、时判断是否当前棋子是否有同色的五个棋子,当棋子接近棋盘边界时,有报警音乐响起,当有五个同色的棋子时,播放胜利的音乐并且显示赢棋的玩家。音乐制作: 播放胜利的音乐,棋子每步的音乐及接近边界的报警声音。四 模块划分声音模块棋盘模块图形绘制图形填充五 算法说明步骤1: 初始化显示器,设置背景颜色和字体颜色及大小,输出欢迎界面,等待用户输入y进入游戏界面。步骤2: 得到输入键后,进入游戏界面,画16*16的棋盘。步骤3: 根据”Key值,应用”switch”语句进行选择。步骤4: 判断当前棋子是否获胜。步骤5: 清除屏幕上的棋盘,播放胜利音乐,恭喜赢得玩家。六 流程图主函数 main( )Step1
5、调用welcomeinfo( )进行欢迎词Step2 调用Drawboard( )画棋盘Step3 调用show message( )显示赢棋信息Step4 调用closegraph( )关闭图形系统开始调用welcomeinfo()进行欢迎词调用Drawboard()画棋盘调用show message()显示赢棋信息调用closegraph()关闭图形系统退出程序函数welcomeinfo( )Step1 移动光标到指定位置Step2 显示欢迎信息Step3 判断是否要进入游戏开始移动光标到指定位置(x,y)显示欢迎信息Do you want to enter game(y/n)Ch=n|c
6、h=N?进入程序Exit(0)10函数Drawboard( )Step1 定义X1,X2,Y1,Y2和背景Step1 画16条竖线Step1 画16条横线开始X1=1,X2=16X1<=16X1+1=X1X1+Y1=1,Y2=16Y2<=16Y1+1=Y1Y1+结束00函数Alternation( )开始Int flag=1Flag=1Flag=2Flag=1结 束0函数music( )Step1 定义变量初值Step2 for 语句Step3 关闭声音函数开 始Freq=50Freq<100Freq+=1Freq+结束 nosound01函数Resultcheck( )St
7、ep1 向八个方向数棋子Step2 判断同一种棋子是否为5个Step3 退出函数开始Int j,k,n1=0,n2=0;While(1)J=x,k=yj>=1j-Statusjk=flag N1+n2-1>=5Return 1breakN1+breakJ=x,k=yJ<=15J+Statusjk=flagN2+break0001101011函数done ( )Step1:根据不同key值进行不同操作Step2:判断下一步是否超边界Step3:在空白的地方落棋子 开始Switch(key)leftRightDownUpEscEnter向左向右向下向上退出落棋出去运算结果结束七
8、程序测试#include<stdio.h>#include<stdlib.h>#include<graphics.h>#include<bios.h>#include<conio.h>#include<dos.h>/*编译预处理,定义按键码*/#define LEFT 0x4b00 /*左移-方向键left*/#define RIGHT 0x4d00 /*右移-方向键right*/#define DOWN 0x5000 /*下移-方向键down*/ #define UP 0x4800 /*上移-方向键up*/#define
9、 ENTER 0x1c0d /*ENTER键表示落子*/*若想在游戏中途退出, 可按 Esc 键*/#define ESC 0x011b /*设置偏移量*/#define OFFSET 20#define OFFSET_x 4#define OFFSET_y 3/*定义数组大小*/#define N 16/*定义全局变量*/int statusNN; /*定义的数组,保存状态*/int step_x,step_y;/*行走的坐标*/int key ; /*获取按下的键盘的键*/int flag; /*玩家标志*/*自定义函数原型*/void music();void WinMusic();vo
10、id DrawBoard();void DrawCircle(int x,int y,int color);void Alternation();void JudgePlayer(int x,int y);void Done();int ResultCheck(int x,int y);void WelcomeInfo();void ShowMessage();/*定义函数*/*显示欢迎信息函数*/void WelcomeInfo() char ch ; /*移动光标到指定位置*/ gotoxy(12,4); /*显示欢迎信息*/ printf("Welcome you to gob
11、ang word!"); gotoxy(12,6); printf("1.You can use the up,down,left and right key to move the chessman,"); gotoxy(12,8); printf(" and you can press ENTER key to enter after you move it !"); gotoxy(12,10); printf("2.You can use Esc key to exit the game too !"); gotoxy
12、(12,12); printf("3.Don not move the pieces out of the chessboard !"); gotoxy(12,14); printf("Game Producer: *Student Number:* school:BIPT"); gotoxy(12,16); printf("DO you want to continue ?(Y/N)"); ch=getchar(); /*判断程序是否要继续进行*/ if(ch='n'|ch='N') /*如果不继续进
13、行,则推出程序*/ exit(0);/*走棋音乐*/void music()int freq;for(freq=50;freq<100;freq+=1)sound (freq);delay(1000);nosound();/*画棋盘函数*/void DrawBoard() int x1,x2; int y1,y2; /*设置背景色*/ setbkcolor(2); /*设置线条颜色*/ setcolor(1); /*设置线条风格、宽度*/ setlinestyle(DOTTED_LINE,1,1); /*按照预设的偏移量开始画棋盘*/ /*画16条竖线*/ for(x1=1,y1=1,y
14、2=16;x1<=16;x1+)line(x1+OFFSET_x)*OFFSET-8.5,(y1+OFFSET_y)*OFFSET-8,(x1+OFFSET_x)*OFFSET-8.5,(y2+OFFSET_y)*OFFSET-8); /*画16条横线*/ for(x1=1,y1=1,x2=16;y1<=16;y1+) line(x1+OFFSET_x)*OFFSET-8.5,(y1+OFFSET_y)*OFFSET-8.5,(x2+OFFSET_x)*OFFSET-8.5,(y1+OFFSET_y)*OFFSET-8.5); /*将各个点的状态设置为0*/ for(x1=1;x1
15、<=16;x1+) for(y1=1;y1<=16;y1+) statusx1y1=0; /*显示帮助信息*/ setcolor(14); /*设置字体、大小*/ settextstyle(1,0,1); outtextxy(460,61," Player key:"); setcolor(9); settextstyle(3,0,1);outtextxy(460,84,"*"); setcolor(5); settextstyle(3,0,1); outtextxy(460,100,"play1 UP-up "); ou
16、ttextxy(460,130,"play1 DOWN-down "); outtextxy(460,160,"play1 LEFT-left"); outtextxy(460,190,"play1 RIGHT-right"); setcolor(6); settextstyle(3,0,1); outtextxy(460,210,"play2 UP-up "); outtextxy(460,240,"play2 DOWN-down"); outtextxy(460,270,"play
17、2 LEFT-left"); outtextxy(460,300,"play2 RIGHT-right"); setcolor(9); settextstyle(3,0,1); outtextxy(460,330,"ENTER-enter"); setcolor(9); settextstyle(3,0,1); outtextxy(460,360,"*"); setcolor(14); settextstyle(1,0,1); outtextxy(460,380," Exit:"); setcolor(9
18、); settextstyle(3,0,1); outtextxy(460,410," ESC"); setcolor(15); settextstyle(3,0,3); outtextxy(95,380,"Welcome to gobang word !"); outtextxy(95,420,"Student Number: ");/*画圆函数*/void DrawCircle(int x,int y,int color) setcolor(color); /*设置画圆线条的风格,宽度,这里设置为虚线*/ setlinestyle
19、(SOLID_LINE,0,1); x=(x+OFFSET_x)*OFFSET+0.5; y=(y+OFFSET_y)*OFFSET+0.5; /*以(x,y)为圆心,8为半径画圆*/ circle(x,y,8); setfillstyle(1,color); floodfill(x,y,color); music();/*胜利时放的音乐*/void WinMusic()int i,j;int fr=392,392,440,294,262,262,220,294,392,392, 440,532,440,392,262,262,220,294,392,294, 262,247,220,196,
20、392,294,330,294,262,262, 220,294,330,294,262,294,262,247,220,196;int tim=4,2,2,8,4,2,2,8,4,4,2,2,2,2,4,2,2,8,4,4, 4,2,2,4,4,4,2,2,4,2,2,2,2,2,2,2,2,2,2,12;for(i=0;i<40;i+) sound(fri); delay(timi*20000); nosound(); /*交换行棋方函数*/void Alternation() if(flag=1) flag=2 ; else flag=1 ; /*对不同的行棋方画不同颜色的圆函数*
21、/void JudgePlayer(int x,int y) if(flag=1) DrawCircle(x,y,8); if(flag=2) DrawCircle(x,y,15);/*判断当前行棋方是否获胜函数*/int ResultCheck(int x,int y) int j,k; int n1,n2 ; while(1) /*对水平方向进行判断是否有5个同色的圆*/ n1=0; n2=0; /*水平向左数*/ for(j=x,k=y;j>=1;j-) if(statusjk=flag) n1+; else break; /*水平向右数*/ for(j=x,k=y;j<=1
22、5;j+) if(statusjk=flag) n2+; else break; if(n1+n2-1>=5) return(1); /*对垂直方向进行判断是否有5个同色的圆*/ n1=0; n2=0; /*垂直向上数*/ for(j=x,k=y;k>=1;k-) if(statusjk=flag) n1+; else break ; /*垂直向下数*/ for(j=x,k=y;k<=15;k+) if(statusjk=flag) n2+; else break ; if(n1+n2-1>=5) return(1); /*从左上方到右下方进行判断是否有5个同色的圆*/
23、 n1=0; n2=0; /*向左上方数*/ for(j=x,k=y;(j>=1)&&(k>=1);j-,k-) if(statusjk=flag) n1+; else break; /*向右下方数*/ for(j=x,k=y;(j<=15)&&(k<=15);j+,k+) if(statusjk=flag) n2+; else break; if(n1+n2-1>=5) return(1); /*从右上方到左下方进行判断是否有5个同色的圆*/ n1=0; n2=0; /*向右上方数*/ for(j=x,k=y;(j<=15)
24、&&(k>=1);j+,k-) if(statusjk=flag) n1+; else break; /*向左下方数*/ for(j=x,k=y;(j>=1)&&(k<=15);j-,k+) if(statusjk=flag) n2+; else break; if(n1+n2-1>=5) return(1); return(0); /*执行下棋函数*/void Done() int i ; int j ; /*根据不同的key值进行不同的操作*/ switch(key) /*如果是向左移动的*/ case LEFT: /*如果下一步超出
25、棋盘左边界则什么也不作*/ if(step_x-1<0) /*报警音乐*/ sound(1000); /*扬声器的发生时间,为1秒钟*/ delay(1000); nosound(); break ; else for(i=step_x-1,j=step_y;i>=1;i-) if(statusij=0) /*每移动一步画一个圆,消除移动的过程*/ DrawCircle(step_x,step_y,2); break ; if(i<1) break ; step_x=i ; JudgePlayer(step_x,step_y); break ; /*如果是向右移动的*/ ca
26、se RIGHT : /*如果下一步超出棋盘右边界则什么也不作*/ if(step_x+1>15) /*报警音乐*/ sound(1000); /*扬声器的发生时间,为1秒钟*/ delay(1000); nosound(); break ; else for(i=step_x+1,j=step_y;i<=15;i+) if(statusij=0) /*每移动一步画一个圆,消除移动的过程*/ DrawCircle(step_x,step_y,2); break ; if(i>15)break ; step_x=i ; /*根据不同的行棋者画不同颜色的圆*/ JudgePlay
27、er(step_x,step_y); /*显示行棋一方是谁*/ break ; /*如果是向下移动的*/ case DOWN : /*如果下一步超出棋盘下边界则什么也不作*/ if(step_y+1)>15) /*报警音乐*/ sound(1000); /*扬声器的发生时间,为1秒钟*/ delay(1000); nosound(); break ; else for(i=step_x,j=step_y+1;j<=15;j+) if(statusij=0) DrawCircle(step_x,step_y,2); break ; if(j>15)break ; step_y=
28、j ; JudgePlayer(step_x,step_y); break ; /*如果是向上移动的*/ case UP : /*报警音乐*/ if(step_y-1)<0) sound(1000); delay(1000); nosound(); break ; else for(i=step_x,j=step_y-1;j>=1;j-) if(statusij=0) DrawCircle(step_x,step_y,2); break ; if(j<1)break ; step_y=j ; JudgePlayer(step_x,step_y); break ; /*如果是退
29、出键*/case ESC :/*报警音乐*/ sound(500); /*扬声器的发生时间,为1秒钟*/ delay(1000); nosound(); break ; /*如果是确定键*/ case ENTER: /*如果操作是在棋盘之内*/ if(step_x>=1&&step_x<=15&&step_y>=1&&step_y<=15) /*按下确定键后,如果棋子当前位置的状态为0*/ if(statusstep_xstep_y=0) /*则更改棋子当前位置的状态在flag,表示是哪个行棋者行的棋*/ statusst
30、ep_xstep_y=flag ; /*如果判断当前行棋者获胜*/ if(ResultCheck(step_x,step_y)=1) gotoxy(30,4); setbkcolor(BLUE); /*清除图形屏幕*/ cleardevice(); /*为图形输出设置当前视口*/ setviewport(100,100,540,380,1); /*绿色实填充*/ setfillstyle(1,2); setcolor(YELLOW); /*画矩形*/ rectangle(0,0,439,279); floodfill(50,50,14); setcolor(12); settextstyle(
31、1,0,5); /*三重笔划字体, 水平放大5倍*/ outtextxy(20,20,"Congratulation !"); setcolor(15); settextstyle(3,0,4); /*如果是Player1获胜,显示获胜信息*/ if(flag=1) /*无衬笔划字体, 水平放大5倍*/ outtextxy(20,120,"Player1 win the game !"); WinMusic(); /*如果是Player1获胜,显示获胜信息*/ if(flag=2) /*无衬笔划字体, 水平放大5倍*/ outtextxy(20,120,
32、"Player2 win the game !"); WinMusic(); setcolor(14); settextstyle(2,0,8); getch(); exit(0); /*如果当前行棋者没有获胜,则交换行棋方*/ Alternation(); /*提示行棋方是谁*/ ShowMessage(); break; else break ; /*显示行棋方函数*/void ShowMessage() /*轮到Player1行棋*/ if(flag=1) setcolor(2); settextstyle(1,0,1); gotoxy(100,30); /*覆盖原有
33、的字迹*/ outtextxy(100,30,"It's turn to Player2 !"); setcolor(12); settextstyle(1,0,1); outtextxy(100,30,"It's turn to Player1 !"); /*轮到Player2行棋*/ if(flag=2) setcolor(2); settextstyle(1,0,1); /*覆盖原有的字迹*/ outtextxy(100,30,"It's turn to Player1 !"); setcolor(12); settextstyle(1,0,1); gotoxy(100,20); outtextxy(100,30,"It's turn to Player2 !"); /*主函数*/int main() int gdriver; int gmode; int errorcode; /*清
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工厂流水加工合同范本
- 招聘演员的合同范本
- 转让公司合同范本
- 代理车险合同范本
- 设计加采购合同范本
- 深圳法律合同范本
- 个人转让门面合同范本
- 共同买货车合同范本
- 大宗企业采购合同范本
- 承包小区树木合同范本
- 2025年建筑工程管理与实务一级建造师考试冲刺押题卷
- 2025版建筑垃圾处理废弃物处理设施运营管理合同
- (2025年标准)融资委托协议书
- 2025自贡开放大学公需科目答案
- 2025年招录考试-工会招聘考试历年参考题库含答案解析(5套典型题)
- 毕马威:2025年第三季度中国经济观察报告
- 2025公需课《人工智能赋能制造业高质量发展》试题及答案
- 各国钢材-合金牌号对照表
- 医院定岗定编要点
- 护理质控简报
- 车工高级工操作技能试卷
评论
0/150
提交评论