河 南 城 建 学 院
测绘与城市空间信息系
测绘程序设计
题 目: 五子棋游戏 班 级: 0614112 人 数: 3人 学 号: 061411257 0614411225 061411223 061411245 指导老师: 闫继涛 邢晓娜 高松峰 毛政利 时 间: 2012年6月
成 员: 赵哲武 李志强 李少帅 夏韦程
目 录
1课程设计报告-------------------2
1.1问题描述----------------------2
1.2 任务分工- - - - - - - - - - - - - - - 2
1.3需求分析---------------------------3
1.4概要设计-----------------------3
1.5详细设计-----------------------4
1.6调试分析---------------------5
2源程序---------------------6
3程序的说明文件-------------------12
4课设总结-----------------------13
1
1. 课程设计报告
1.1问题描述
连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方就算获胜。此时,算法结束。当有任何一方想退出时,都可在算法中实现。
1.2 五子棋的背景
传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为15×15,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。
因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。
1.2 任务分工 组长:赵哲武
负责小组程序的输入和创新部分,分配任务,使工作衔接有序,以及程序的整体规划,将各部分文件衔接,查找错误,排版论文并完成
2
主函数的设及相关变量的定义,完成void attentoin()的设计细节设计,完成void draw_box(),void change();void judgekey()的设计并调试并运行程序,完成实验报告。
。
组员:李志强
完成void judgewho(int x,int y)的设计,并作出自己部分的编程代码,流程图。
组员:夏韦程
完成void draw_cicle(int x,int y,int color)的设计,并作出自己部分的编程代码,流程图。
组员:李少帅
完成int judgeresult(int x,int y)的设计。 1.3需求分析
(1)、输出游戏规则并由用户决定是否遵守并开局。
(2)、要求动态画出棋盘大小。 (3)、画棋子并确定其颜色。 (4)、玩家轮流下棋。
(5)、判断键盘输入哪个键按规则执行操作 (6)、判断谁先落棋。 (7)判断赢家
1.4概要设计
流程图
3
流程图 1
西 开始输出游戏规则 玩家遵守? Y Error! Y
谁先下棋,输入棋盘大小s
画出s*s大小的棋盘 用户决定谁先走 4
白棋先走? N 画红棋 Y
改变玩家 画白棋 下棋 下棋 N
Y
白棋? 横竖斜有五个相同颜色的棋子相连? N Y
流程图 2
输出:The white win! 输出:The red win!
5
1.5详细设计
本程序中包含一个主函数和七个子函数,它们的函数名及功
能分别如下:
void draw_box();画棋盘,确定背景色和棋盘色按用户输入大小画 出棋盘
void draw_cicle(int x,int y,int color);画棋子,确定棋子大小及颜色画出棋子。
void change();改变玩家,作战双方轮流下棋。
void judgewho(int x,int y);判断谁落棋,是1则画出白棋,是2则画出红棋。
void judgekey();判断键盘输入哪个键按规则执行操作,UP 键上移,DOWN键下移,LEFT键左移,RIGHT键右移,ESC键退出,SPACE键确定棋子落点。
int judgeresult(int x,int y);判断赢家,横向竖向斜向够5个相同颜色的棋子则为赢家。
void attentoin();显示游戏规则,按上下左右键移动棋子,按空格键确定棋子落点,不能在棋盘外按空格键。
1.6调试分析
运行结果:屏幕显示:Please input who is first:1 or 2
当输入1时,白棋先走;当输入2时,红棋先走。屏幕显示:
Please input the size of chessbox:从键盘输入s值,则
6
棋盘大小为s*s型。屏幕显示:Left, Right, Up, Down KEY to move, Space to put, ESC-quit 及棋盘,棋子,用上下左右键控制棋子向,用空格键确定棋子的落点 。当白棋赢时,显示The White Win ! 当红棋赢时,显示The Red Win ! 算法改进思想:将棋盘由原先的固定大小改进为可动态变化,由
原来固定的白棋先走改进为让用户可以选择哪方先落子。
2源程序
#include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b #define SPACE 0x3920 #define BILI 20 #define JZ 4 #define JS 3 #define N 19 int box[N][N],s; /*落子点*/ int step_x,step_y ; int key ; int flag,i,j ; void draw_box(); void draw_cicle(int x,int y,int color); void change(); void judgewho(int x,int y); void judgekey(); int judgeresult(int x,int y); void attentoin(); 7 void attentoin() /*游戏规则*/ { char ch ; printf(\"Play attentoins:\\n\\n\"); printf(\"1. Press Left,Right,Up,Down Key to move Piece\\n\\n\");/*方向键移动棋子*/ printf(\"2. Press Space to place the Piece\\n\\n\");/*空格键确定棋子落点*/ printf(\"3. DO NOT press Space outside of the draw_box\\n\\n\");/*棋盘外不能落棋*/ printf(\"Do you accept the above Playing attentoins? [Y/Other]:\");/*是否遵守*/ while(1) { ch=getche(); if(ch=='Y'||ch=='y') break ; else exit(0); } printf(\"\\n\\nwhat size of the draw_box:\"); scanf(\"%d\输出棋盘大小*/ printf(\"\\n\\nwho is the frist:1 or 2? \"); /*谁先落子*/ while(1) { scanf(\"%d\ if(flag!=1&&flag!=2) printf(\"Error!\\n\"); else break; } } void draw_box() /*画出棋盘*/ { int x1,x2,y1,y2 ; setbkcolor(LIGHTBLUE); /*背景色*/ setcolor(YELLOW); /*文本色*/ gotoxy(7,2); printf(\"Left, Right, Up, Down KEY to move, Space to put, ESC-quit.\"); for(x1=1,y1=1,y2=s;x1<=s;x1++) line((x1+JZ)*BILI,(y1+JS)*BILI,(x1+JZ)*BILI,(y2+JS)*BILI);/*画竖线*/ for(x1=1,y1=1,x2=s;y1<=s;y1++) line((x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI); /*画横线*/ for(x1=1;x1<=s;x1++) for(y1=1;y1<=s;y1++) box[x1][y1]=0 ; /*棋盘初始化*/ } void draw_cicle(int x,int y,int color) /*棋子*/ { 8 setcolor(color); /*棋子颜色*/ setlinestyle(SOLID_LINE,0,1); /*线条类型*/ x=(x+JZ)*BILI ; y=(y+JS)*BILI ; circle(x,y,8); /*画半径为8的棋子*/ } void judgekey() { switch(key) { case LEFT : /*左键控制棋子左移*/ if(step_x-1<0) break ; else { for(i=step_x-1,j=step_y;i>=1;i--) if(box[i][j]==0) { draw_cicle(step_x,step_y,LIGHTBLUE); break ;} if(i<1)break ; step_x=i ; judgewho(step_x,step_y); break ; } case RIGHT : /*右键控制棋子右移*/ if(step_x+1>s) break ; else { for(i=step_x+1,j=step_y;i<=s;i++) if(box[i][j]==0) { draw_cicle(step_x,step_y,LIGHTBLUE); break ; } if(i>s)break ; step_x=i ; judgewho(step_x,step_y); break ; } case DOWN : /*下键控制棋子下移*/ if(step_y+1>s) break ; else 9 { for(i=step_x,j=step_y+1;j<=s;j++) if(box[i][j]==0) { draw_cicle(step_x,step_y,LIGHTBLUE);break ; } if(j>s)break ; step_y=j ; judgewho(step_x,step_y); break ; } case UP : /*上键控制棋子上移*/ if(step_y-1<0) break ; else { for(i=step_x,j=step_y-1;j>=1;j--) if(box[i][j]==0) { draw_cicle(step_x,step_y,LIGHTBLUE); break ; } if(j<1)break ; step_y=j ; judgewho(step_x,step_y); break ; } case ESC : break ; /*ESC键退出游戏*/ case SPACE : /*空格键控制落子*/ if(step_x>=1&&step_x<=s&&step_y>=1&&step_y<=s) { if(box[step_x][step_y]==0) { box[step_x][step_y]=flag ; if(judgeresult(step_x,step_y)==1) { sound(1000); delay(1000); nosound(); gotoxy(30,4); cleardevice(); if(flag==1) { settextstyle(3,0,5); outtextxy(120,120,\"The White Win !\"); /*显示白棋赢*/ 10 setcolor(14); } if(flag==2) { settextstyle(3,0,5); outtextxy(120,120,\"The Red Win !\"); /*显示红棋赢*/ setcolor(15); settextstyle(3,0,5); } getch(); exit(0); } change(); break ; } } else break ; } } void change() /*{ if(flag==1) flag=2 ; else flag=1 ; } void judgewho(int x,int y) { if(flag==1) draw_cicle(x,y,15); /* if(flag==2) draw_cicle(x,y,4); /*} int judgeresult(int x,int y) { int j,k,n; while(1) { n=0 ; for(j=x,k=y;j>=1;j--) /* { if(box[j][k]==flag) 11 改变玩家*/ 画白棋*/ 画红棋*/ 水平向左数*/ n++; else break ; } for(j=x,k=y;j<=s;j++) /*水平向右数*/ { if(box[j][k]==flag) n++; else break ; } if(n>5) return(1); n=0 ; for(j=x,k=y;k>=1;k--) /* { if(box[j][k]==flag) n++; else break ; } for(j=x,k=y;k<=s;k++) /* { if(box[j][k]==flag) n++; else break ; } if(n>5) return(1); n=0 ; for(j=x,k=y;j>=1,k>=1;j--,k--) /* { if(box[j][k]==flag) n++; else break ; } for(j=x,k=y;j<=s,k<=s;j++,k++) /* { if(box[j][k]==flag) n++; else break ; 12 垂直向上数*/ 垂直向下数*/ 向左上方数*/ 向右下方数*/ } if(n>5) return(1); n=0 ; for(j=x,k=y;j<=s,k>=1;j++,k--) /*向右上方数*/ { if(box[j][k]==flag) n++; else break ; } for(j=x,k=y;j>=1,k<=s;j--,k++) /* { if(box[j][k]==flag) n++; else break ; } if(n>5) return(1); return(0); } } void main() { int gdriver=VGA,gmode=VGAHI; /* clrscr(); attentoin(); initgraph(&gdriver,&gmode,\"c:\\\c\"); /* draw_box(); do { step_x=0,step_y=0 ; /* judgewho(step_x-1,step_y-1); do { while(bioskey(1)==0); key=bioskey(0); judgekey(); } while(key!=SPACE&&key!=ESC); } while(key!=ESC); closegraph(); } 13 向左下方数*/ 定义图形适配器*/ 图形初始化*/ 棋盘初始化*/ /*关闭图形*/ 3程序的说明文件 void draw_box();......................................7 void draw_cicle(int x,int y,int color);...............8 void change();........................................10 void judgewho(int x,int y);...........................10 void judgekey();......................................8 int judgeresult(int x,int y);.........................11 void attentoin();.....................................7 主函数................................................12 4课设总结 从6月11日开始,我们进行了为期两周的测绘程序设计。通过这 次课程设计,我们拓宽了知识面,锻炼了小组的分工与合作能力,综合素质得到较大提高。 本次课程设计,使我们对从五子棋设计方案到设计的基本过程的设计方法、步骤、思路、有一定的了解与认识。在课程设计过程中,我们基本能按照规定的程序进行,先针对五子棋的设计收集、调查有关资料,其间,同组成员之间进行几次方案的讨论、修改,再讨论、再修改,最后定案。设计方案确定后,又在老师指导下进行扩充详细设计,最终用c语言实现了可视化的五子棋算法。整个过程周密有序,对我们按时高质完成课程设计非常有利! 程设计达到了专业学习的预期目的。课程设计之后,我们普遍感到不仅实际动手能力有所提高,更重要的是进一步激发了我们对专业 14 知识的兴趣,并能够结合实际存在的问题在专业领域内进行更深入的学习。 对我们这些本科生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。通过课程设计,让我们找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。 15
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务