您好,欢迎来到百家汽车网。
搜索
您的当前位置:首页c语言设计 五子棋游戏

c语言设计 五子棋游戏

来源:百家汽车网


河 南 城 建 学 院

测绘与城市空间信息系

测绘程序设计

题 目: 五子棋游戏 班 级: 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 #include #include #include #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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务