课程设计c语言设计五子棋游戏 0528.docx
- 文档编号:27819463
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:17
- 大小:80.98KB
课程设计c语言设计五子棋游戏 0528.docx
《课程设计c语言设计五子棋游戏 0528.docx》由会员分享,可在线阅读,更多相关《课程设计c语言设计五子棋游戏 0528.docx(17页珍藏版)》请在冰豆网上搜索。
课程设计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课设总结-----------------------13
1.课程设计报告
1.1问题描述
连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。
在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方就算获胜。
此时,算法结束。
当有任何一方想退出时,都可在算法中实现。
1.2五子棋的背景
传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为15×15,棋子放置于棋盘线交叉点上。
两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。
因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。
1.2任务分工
组长:
赵哲武
负责小组程序的输入和创新部分,分配任务,使工作衔接有序,以及程序的整体规划,将各部分文件衔接,查找错误,排版论文并完成主函数的设及相关变量的定义,完成voidattentoin()的设计细节设计,完成voiddraw_box(),voidchange();voidjudgekey()的设计并调试并运行程序,完成实验报告。
。
组员:
李志强
完成voidjudgewho(intx,inty)的设计,并作出自己部分的编程代码,流程图。
组员:
夏韦程
完成voiddraw_cicle(intx,inty,intcolor)的设计,并作出自己部分的编程代码,流程图。
组员:
李少帅
完成intjudgeresult(intx,inty)的设计。
1.3需求分析
(1)、输出游戏规则并由用户决定是否遵守并开局。
(2)、要求动态画出棋盘大小。
(3)、画棋子并确定其颜色。
(4)、玩家轮流下棋。
(5)、判断键盘输入哪个键按规则执行操作
(6)、判断谁先落棋。
(7)判断赢家
1.4概要设计
流程图
流程图1
Y
Y
N
Y
N
Y
N
Y
流程图2
1.5详细设计
本程序中包含一个主函数和七个子函数,它们的函数名及功能分别如下:
voiddraw_box();画棋盘,确定背景色和棋盘色按用户输入大小画出棋盘
voiddraw_cicle(intx,inty,intcolor);画棋子,确定棋子大小及颜色画出棋子。
voidchange();改变玩家,作战双方轮流下棋。
voidjudgewho(intx,inty);判断谁落棋,是1则画出白棋,是2则画出红棋。
voidjudgekey();判断键盘输入哪个键按规则执行操作,UP键上移,DOWN键下移,LEFT键左移,RIGHT键右移,ESC键退出,SPACE键确定棋子落点。
intjudgeresult(intx,inty);判断赢家,横向竖向斜向够5个相同颜色的棋子则为赢家。
voidattentoin();显示游戏规则,按上下左右键移动棋子,按空格键确定棋子落点,不能在棋盘外按空格键。
1.6调试分析
运行结果:
屏幕显示:
Pleaseinputwhoisfirst:
1or2
当输入1时,白棋先走;当输入2时,红棋先走。
屏幕显示:
Pleaseinputthesizeofchessbox:
从键盘输入s值,则棋盘大小为s*s型。
屏幕显示:
Left,Right,Up,DownKEYtomove,Spacetoput,ESC-quit及棋盘,棋子,用上下左右键控制棋子向,用空格键确定棋子的落点。
当白棋赢时,显示TheWhiteWin!
当红棋赢时,显示TheRedWin!
算法改进思想:
将棋盘由原先的固定大小改进为可动态变化,由原来固定的白棋先走改进为让用户可以选择哪方先落子。
2源程序
#include
#include
#include
#include
#include
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
#defineSPACE0x3920
#defineBILI20
#defineJZ4
#defineJS3
#defineN19
intbox[N][N],s;/*落子点*/
intstep_x,step_y;
intkey;
intflag,i,j;
voiddraw_box();
voiddraw_cicle(intx,inty,intcolor);
voidchange();
voidjudgewho(intx,inty);
voidjudgekey();
intjudgeresult(intx,inty);
voidattentoin();
voidattentoin()/*游戏规则*/
{
charch;
printf("Playattentoins:
\n\n");
printf("1.PressLeft,Right,Up,DownKeytomovePiece\n\n");/*方向键移动棋子*/
printf("2.PressSpacetoplacethePiece\n\n");/*空格键确定棋子落点*/
printf("3.DONOTpressSpaceoutsideofthedraw_box\n\n");/*棋盘外不能落棋*/
printf("DoyouaccepttheabovePlayingattentoins?
[Y/Other]:
");/*是否遵守*/
while
(1)
{ch=getche();
if(ch=='Y'||ch=='y')break;
elseexit(0);
}
printf("\n\nwhatsizeofthedraw_box:
");
scanf("%d",&s);/*输出棋盘大小*/
printf("\n\nwhoisthefrist:
1or2?
");/*谁先落子*/
while
(1)
{scanf("%d",&flag);
if(flag!
=1&&flag!
=2)printf("Error!
\n");
elsebreak;
}
}
voiddraw_box()/*画出棋盘*/
{
intx1,x2,y1,y2;
setbkcolor(LIGHTBLUE);/*背景色*/
setcolor(YELLOW);/*文本色*/
gotoxy(7,2);
printf("Left,Right,Up,DownKEYtomove,Spacetoput,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;/*棋盘初始化*/
}
voiddraw_cicle(intx,inty,intcolor)/*棋子*/
{
setcolor(color);/*棋子颜色*/
setlinestyle(SOLID_LINE,0,1);/*线条类型*/
x=(x+JZ)*BILI;
y=(y+JS)*BILI;
circle(x,y,8);/*画半径为8的棋子*/
}
voidjudgekey()
{
switch(key)
{
caseLEFT:
/*左键控制棋子左移*/
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;
}
caseRIGHT:
/*右键控制棋子右移*/
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;
}
caseDOWN:
/*下键控制棋子下移*/
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;
}
caseUP:
/*上键控制棋子上移*/
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;
}
caseESC:
break;/*ESC键退出游戏*/
caseSPACE:
/*空格键控制落子*/
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,"TheWhiteWin!
");/*显示白棋赢*/
setcolor(14);
}
if(flag==2)
{settextstyle(3,0,5);
outtextxy(120,120,"TheRedWin!
");/*显示红棋赢*/
setcolor(15);
settextstyle(3,0,5);
}
getch();
exit(0);
}
change();
break;
}
}
else
break;
}
}
voidchange()/*改变玩家*/
{
if(flag==1)
flag=2;
else
flag=1;
}
voidjudgewho(intx,inty)
{
if(flag==1)
draw_cicle(x,y,15);/*画白棋*/
if(flag==2)
draw_cicle(x,y,4);/*画红棋*/
}
intjudgeresult(intx,inty)
{
intj,k,n;
while
(1)
{
n=0;
for(j=x,k=y;j>=1;j--)/*水平向左数*/
{
if(box[j][k]==flag)
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;
}
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);
}
}
voidmain()
{
intgdriver=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程序的说明文件
voiddraw_box();......................................7
voiddraw_cicle(intx,inty,intcolor);...............8
voidchange();........................................10
voidjudgewho(intx,inty);...........................10
voidjudgekey();......................................8
intjudgeresult(intx,inty);.........................11
voidattentoin();.....................................7
主函数................................................12
4课设总结
从6月11日开始,我们进行了为期两周的测绘程序设计。
通过这次课程设计,我们拓宽了知识面,锻炼了小组的分工与合作能力,综合素质得到较大提高。
本次课程设计,使我们对从五子棋设计方案到设计的基本过程的设计方法、步骤、思路、有一定的了解与认识。
在课程设计过程中,我们基本能按照规定的程序进行,先针对五子棋的设计收集、调查有关资料,其间,同组成员之间进行几次方案的讨论、修改,再讨论、再修改,最后定案。
设计方案确定后,又在老师指导下进行扩充详细设计,最终用c语言实现了可视化的五子棋算法。
整个过程周密有序,对我们按时高质完成课程设计非常有利!
程设计达到了专业学习的预期目的。
课程设计之后,我们普遍感到不仅实际动手能力有所提高,更重要的是进一步激发了我们对专业知识的兴趣,并能够结合实际存在的问题在专业领域内进行更深入的学习。
对我们这些本科生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。
通过课程设计,让我们找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计c语言设计五子棋游戏 0528 课程设计 语言 设计 五子棋 游戏