当前位置:文档之家› 课程设计.doc

课程设计.doc

目录
一、摘要.......................2 ...................... 二 、 程 序 设 计 总 概 ..................2 ................. 1、下边框图是对整个函数的运行的呈现....... .......2 2、开始游戏的页面如下.............. ..............4 3、结束游戏的页面如下.............. ..............4 三、主要函数的简单概述 ............... ...............5 1、DrawBoard( ) .................5 ................ 2、DrawCirle(intx,inty,int color) .......5 ...... 3、Alternation( )................ ................6 4、JudgePlayer(intx,int y)........... ...........6 5、ResultCheck(intx,int y) ...........6 .......... 6、Done( ) ................... ...................8 四、设计总结.................... ....................11 五、课 程 论 文 成 绩 评 定 表 ...........12 ..........
1 / 12

一、摘要
五子棋游戏可以分为双人对弈、人机对弈两类游戏,在本次设计中 我用的是双人对弈的游戏,一 方 执 黑 棋 , 一 方 执 白 棋 , 轮 流 走 棋 , 每方都试图在游戏结束前让自己的棋子五子相连。 键盘上的方 按 向键可以移动光标,回车键可以摆放棋子。
二、程 序设 计总 概
该五子棋游戏的程序采用了多个函数的套用,用函数的之间 的相互调用来实现程序的运行顺利。本次程序设计采用了画棋盘 的函数 DrawBoard(),画圆的函数 DrawCircle(intx,inty,int color),交换行棋方的函数 Alternation(),对不同的行棋方画不 同颜色的圆函数 JudgePlayer(intx,int y),执行下棋函数 Done(), 判断当前行棋方是否获胜的函数 ResultCheck(intx,int y), 显 示欢迎信息的函数 WelcomeInfo(),显示行棋方的函数 ShowMessage()。 各个函数的使用都是采用坐标变换的形式来实现的,通过坐 标的移动,使得函数能够很好的连接成一个整体。程序的开始先 是对头文件 () 的声明,然后是对一些按键 (LEFT、 RIGHT、 DOWN、 ESC、 UP、 SPACE) 、 数组大小以及偏移量(OFFSET、OFFSET_x、OFFSET_y)的预编译 处理,随后是对一些变量的定义, 最后是定义函数的原型, 从而实 现程序的正确运行。 1、 下边框图是对整个函数的运行的呈现:
2 / 12

开始
int gdriver int gmode int errorcode clrscr() WelcomeInfo()
1 errorcode!= grOk
2
N
step_x=0 step_y=0
Y
printf("\nNotice:Error occured when grphics initialization: %s\n", grapherrormsg bioskey(1)==0 JudgePlayer (step_x-1,step_y-1)
N
gdriver=DETECT gmode=0 Registerbgidriver (EGAVGA_driver)
(errorcode)) printf("Press any key to quit!");
Y
key=bioskey(0) Done()
getch() exit(1)
key!=SPACE&&key!=ESC
Y
N
initgraph(&gdriver, &gmode,"") flag=1 DrawBoard() ShowMessage() 1 2
Y
key!=ESC N closegraph()
errorcode=graphresult()
return 0
结束
3 / 12

2 2、开始游戏的页面如下: ○It's
turn to Player1 !
Player key : UP__up DOWN__down LEFT__left RIGHT__right ENTER__space Exit: ESC
3、结束游戏的页面如下:
Congratulation!
Player1 win the game !
4 / 12

三、主要函数的简单概述:
1、DrawBoard( ):
voidDrawBoard() { int x1,x2; int y1,y2; setbkcolor(2); setcolor(1); setlinestyle(DOTTED_LINE,1,1); for(x1=1,y1=1,y2=18;x1<=18;x1++) line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x1+OFFSET_x)*OFFSE T,(y2+OFFSET_y)*OFFSET); for(x1=1,y1=1,x2=18;y1<=18;y1++) line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x2+OFFSET_x)*OFFSE T,(y1+OFFSET_y)*OFFSET); for(x1=1;x1<=18;x1++) for(y1=1;y1<=18;y1++) status[x1][y1]=0; setcolor(14); settextstyle(1,0,1); outtextxy((19+OFFSET_x)*OFFSET,(2+OFFSET_y)*OFFSET,"Player key:"); setcolor(9); settextstyle(3,0,1); outtextxy((19+OFFSET_x)*OFFSET,(4+OFFSET_y)*OFFSET,"UP--up "); outtextxy((19+OFFSET_x)*OFFSET,(6+OFFSET_y)*OFFSET,"DOWN--down "); outtextxy((19+OFFSET_x)*OFFSET,(8+OFFSET_y)*OFFSET,"LEFT--left"); outtextxy((19+OFFSET_x)*OFFSET,(10+OFFSET_y)*OFFSET,"RIGHT--right" ); outtextxy((19+OFFSET_x)*OFFSET,(12+OFFSET_y)*OFFSET,"ENTER--space" ); setcolor(14); settextstyle(1,0,1); outtextxy((19+OFFSET_x)*OFFSET,(14+OFFSET_y)*OFFSET,"Exit:"); setcolor(9); settextstyle(3,0,1); outtextxy((19+OFFSET_x)*OFFSET,(16+OFFSET_y)*OFFSET,"ESC"); }
花棋盘的函数是按照偏移量的变化进行计算的,第一步是保持两点的 Y 坐标不变,X 坐标按照 X=(x1+OFFSET_x)*OFFSET 的公式采用划线函数 line( int x1,int y1,int x2,int y2)进行划线;第二步是保持两点的 X 坐标不变,Y 坐标按照 Y=(y1+OFFSET_y)*OFFSET 的公式再次采用划 线函数 line( int x1,int y1,int x2,int y2)进行划线的。这样就画出 了下棋的棋盘。 2、DrawCirle(intx,inty,int color):
voidDrawCircle(intx,inty,int color) { setcolor(color);
5 / 12

setlinestyle(SOLID_LINE,0,1); x=(x+OFFSET_x)*OFFSET; y=(y+OFFSET_y)*OFFSET; circle(x,y,8); }
画棋子的函数也是采用相似的偏移量的变化来画棋子的,在坐标的 确定下对不同下棋方画不同颜色的棋子。 3、Alternation( ):
void Alternation() { if(flag==1) flag=2 ; else flag=1 ; }
交换行棋方的函数是在采用 if……else……的判断语句下, 判断谁 是行棋方来执行画不同颜色的棋子的函数。 4、JudgePlayer(intx,int y):
voidJudgePlayer(intx,int y) { if(flag==1) DrawCircle(x,y,15); if(flag==2) DrawCircle(x,y,4); }
在交换行棋方后执行画棋子函数,并且设计好所画棋子的颜色。轮 到 player1 画棋子时,画白色棋子,轮到 player2 画棋子时,画红色棋 子。 5、ResultCheck(intx,int y):
intResultCheck(intx,int y) { intj,k; int n1,n2 ; while(1) { n1=0; n2=0; for(j=x,k=y;j>=1;j--) { if(status[j][k]==flag) n1++; else
6 / 12

break;
} for(j=x,k=y;j<=18;j++) { if(status[j][k]==flag) n2++; else break; } if(n1+n2-1>=5) { return(1); } n1=0; n2=0; for(j=x,k=y;k>=1;k--) { if(status[j][k]==flag) n1++; else break ; } for(j=x,k=y;k<=18;k++) { if(status[j][k]==flag) n2++; else break ; } if(n1+n2-1>=5) { return(1); } n1=0; n2=0; for(j=x,k=y;(j>=1)&&(k>=1);j--,k--) { if(status[j][k]==flag) n1++; else break; } for(j=x,k=y;(j<=18)&&(k<=18);j++,k++) { if(status[j][k]==flag) n2++; else break; } if(n1+n2-1>=5) { return(1); } n1=0;
7 / 12

n2=0; for(j=x,k=y;(j<=18)&&(k>=1);j++,k--) { if(status[j][k]==flag) n1++; else break; } for(j=x,k=y;(j>=1)&&(k<=18);j--,k++) { if(status[j][k]==flag) n2++; else break; } if(n1+n2-1>=5) { return(1); } return(0); } }
判断行棋方是否获胜的函数是在坐标偏移量变化的情况下,按照上、 下、左、右、左上、左下、右上、右下八个方向进行判断是否达到 5 个 棋子为同一行棋方所下的棋子。左、右判断是以 Y 坐标保持不变,X 坐 标增减偏移量的方式进行的;上、下判断是以 X 坐标保持不变,Y 坐标 增减偏移量的方式进行的;左上、右下的判断是以 X、Y 坐标同增同减 的方式进行的;左下判断是以 X 坐标增加, Y 坐标减少的方式进行的; 右上判断是以 X 坐标减少, 坐标增加的方式进行的。 Y 综合左右、 上下、 右上左下、左上右下四个方向的各向棋子数来进行判断输赢。 6、Done( ):
void Done() { int i ; int j ; switch(key) { case LEFT: if(step_x-1<0) break ; else { for(i=step_x-1,j=step_y;i>=1;i--) if(status[i][j]==0) {
8 / 12

DrawCircle(step_x,step_y,2); break ; } if(i<1) break ; step_x=i ; JudgePlayer(step_x,step_y); break ; } case RIGHT : if(step_x+1>18) break ; else { for(i=step_x+1,j=step_y;i<=18;i++) if(status[i][j]==0) { DrawCircle(step_x,step_y,2); break ; } if(i>18)break ; step_x=i ; JudgePlayer(step_x,step_y); break ; } case DOWN : if((step_y+1)>18) break ; else { for(i=step_x,j=step_y+1;j<=18;j++) if(status[i][j]==0) { DrawCircle(step_x,step_y,2); break ; } if(j>18)break ; step_y=j ; JudgePlayer(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(status[i][j]==0) { DrawCircle(step_x,step_y,2); break ; } if(j<1)break ; step_y=j ;
9 / 12

JudgePlayer(step_x,step_y); break ; } case ESC : break ; case SPACE: if(step_x>=1&&step_x<=18&&step_y>=1&&step_y<=18) { if(status[step_x][step_y]==0) { status[step_x][step_y]=flag ; if(ResultCheck(step_x,step_y)==1) { sound(1000); delay(1000); nosound(); 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(1,0,5); outtextxy(20,20,"Congratulation !"); setcolor(15); settextstyle(3,0,4); if(flag==1) { outtextxy(20,120,"Player1 win the game !"); } if(flag==2) { outtextxy(20,120,"Player2 win the game !"); } setcolor(14); settextstyle(2,0,8); getch(); exit(0); } Alternation(); ShowMessage(); break; } } else break ; } }
执行画棋子的函数是在对键盘按键 (LEFT、 RIGHT、 DOWN、 UP、 ESC、
10 / 12

SPACE) 的定义, 规定相应方向的按键对应相同的方向。 采用了 switch( ) 多分支选择语句,实现了按键的设计。
四、设计总结
此次程序设计采用了多个语句,采用了 if……else……的选 择语句,do……while 和 while 的循环语句以及 switch 的多分支选 择语句,这次课程设计让我学会了如何将学到的各种语句套用在程 序中,并且还将各种函数在程序中能够成功的借用。 本五子棋游戏用到了 C 语言所学到的知识,例如算法,全局变 量以及局部变量的定义,数据类型的使用,顺序结构、选择结构和 循环结构的嵌套,数组的定义等等。课程设计让我学会了如何利用 学到的知识来编写程序,为以后程序的编写奠定基础。 通过编制该程序我对以下的知识点进行的巩固和掌握: 1.数 组 元 素 为 结 构 体 的 数 组 应 用 。 2.全 局 变 量 应 用 。 3.按 键 的 处 理 。 3.图 形 方 式 等 等 。 虽 然 该 程 序 是 一 个 普 通 而 又 简 单 的 程 序 ,但 是 对 于 一 C 语 言 初 级 阶 段 的 我 们 来 说 ,是 一 个很 好的锻炼甚至可以说是一个很好的提高。由于个人能力的限 制 该 程 序 还 有 许 多 的 缺 陷 ,若 要 进 一 步 的 完 善 还 需 要 对 C 语 言更深一步的学习。
11 / 12

课 程 论 文 成 绩 评 定 表
学生姓名 论文题目 指导教师评语及意见: 专业班级
成绩:
指导教师签字 年 月 日
12 / 12

相关主题
文本预览
相关文档 最新文档