当前位置:文档之家› 课程设计-c语言设计-五子棋游戏 0528

课程设计-c语言设计-五子棋游戏 0528

课程设计-c语言设计-五子棋游戏河南城建学院测绘与城市空间信息系测绘程序设计题目: 五子棋游戏班级: 0614112 人数: 3人成员:学号:指导老师:时间: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课设总结-----------------------131.课程设计报告1.1问题描述连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。

在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方就算获胜。

此时,算法结束。

当有任何一方想退出时,都可在算法中实现。

1.2 五子棋的背景传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为15×15,棋子放置于棋盘线交叉点上。

两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。

因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。

1.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概要设计流程图流程图 1YY开输出游玩家谁先下棋,输流程图21.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值,则棋盘大小为s*s型。

屏幕显示:Left, Right, Up,Down KEY to move, Space to put, ESC-quit 及棋盘,棋子,用上下左右键控制棋子向,用空格键确定棋子的落点。

当白棋赢时,显示The White Win ! 当红棋赢时,显示The Red Win !算法改进思想:将棋盘由原先的固定大小改进为可动态变化,由原来固定的白棋先走改进为让用户可以选择哪方先落子。

2源程序#include<stdio.h>#include<stdlib.h>#include<graphics.h>#include<bios.h>#include<conio.h>#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 19int 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();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",&s); /*输出棋盘大小*/printf("\n\nwho is the frist:1 or 2? "); /*谁先落子*/while(1){ scanf("%d",&flag);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) /*棋子*/{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{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 !"); /*显示白棋赢*/ 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 ;}}elsebreak ;}}void change() /*改变玩家*/ {if(flag==1)flag=2 ;elseflag=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)n++;elsebreak ;}for(j=x,k=y;j<=s;j++) /*水平向右数*/ {if(box[j][k]==flag)n++;elsebreak ;}if(n>5) return(1);n=0 ;for(j=x,k=y;k>=1;k--) /*垂直向上数*/{if(box[j][k]==flag)n++;elsebreak ;}for(j=x,k=y;k<=s;k++) /*垂直向下数*/{if(box[j][k]==flag)n++;elsebreak ;}if(n>5) return(1);n=0 ;for(j=x,k=y;j>=1,k>=1;j--,k--) /*向左上方数*/ {if(box[j][k]==flag)n++;elsebreak ;}for(j=x,k=y;j<=s,k<=s;j++,k++) /*向右下方数*/{if(box[j][k]==flag)n++;elsebreak ;}if(n>5) return(1);n=0 ;for(j=x,k=y;j<=s,k>=1;j++,k--) /*向右上方数*/{if(box[j][k]==flag)n++;elsebreak ;}for(j=x,k=y;j>=1,k<=s;j--,k++) /*向左下方数*/{if(box[j][k]==flag)n++;elsebreak ;}if(n>5) return(1);return(0);}}void main(){int gdriver=VGA,gmode=VGAHI; /*定义图形适配器*/clrscr();attentoin();initgraph(&gdriver,&gmode,"c:\\tc"); /*图形初始化*/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(); /*关闭图形*/}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日开始,我们进行了为期两周的测绘程序设计。

相关主题