C语言五子棋.docx
《C语言五子棋.docx》由会员分享,可在线阅读,更多相关《C语言五子棋.docx(16页珍藏版)》请在冰点文库上搜索。
C语言五子棋
程
序
设
计
报
告
设计题目:
五子棋
学院:
汕头职业技术学院
班级:
计算机07五专
学号:
37
姓名:
蔡佩娜
目录
1、课程设计题目
2、课程设计思想
3、调试中问题及解决方案
4、小结
5、附录源程序
1、课程设计题目
题目:
五子棋
功能:
1.由两个玩家分别下棋,当某一玩家五子相连,则赢。
`2.界面要求:
初始状态——显示棋盘,并显示两个玩家的操作键及初始玩家号;游戏进行状态——显示棋盘,不同玩家的棋子用不同颜色显示,屏幕上显示当前玩家棋子颜色,结束时显示赢家。
分步实施:
1、初步完成总体设计,搭好框架,确定人人对话的界面,确定函数个数;
2、完成最低要求:
由两个玩家分别下棋;
3、进一步要求:
可以考虑人机对弈。
要求:
1、用C语言实现系统;
2、函数功能要划分好(结构化程序设计);
3、界面友好(图形界面,良好的人人交互),加必要的注释;
4、要提供程序测试方案,程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
课程设计的最后成果是实验报告一份,内容包括:
1、预习报告(题目、流程图、程序的设计思想等);
2、实验总结报告(测试方案、源程序代码(需打印)、调试中问题及解决方案、小结等)。
二、课程设计思想
根据题目的要求,需要一个主程序main()和五个子程序:
分别为draw_box();draw_cicle();change();judgewho();judgekey();judgeresult();可以实现人人对战。
三、调试中问题及解决方案
1、怎么画棋盘?
解决方案:
先在纸上画个棋盘,用笔把棋盘分区域,并参考上网找资料,与同学讨论。
2、定义方向键时移动过程会有痕迹。
解决方案:
从改变棋子和键盘的坐标位置着手,慢慢的改变坐标,尝试着改。
3、画好的棋盘在显示器并不能完全显示出来
解决方案:
调制显示器分辨率、借用其他宿友电脑进行调制,安装虚拟机进行调试。
四、流程图
4、小结
通过对C语言的课程设计,我了解发现了很多调试程序的方法,而且懂得了如何处理错误的方法。
对C语言的使用得到了进一步的提高。
针对顺序结构程序,选择结构程序的设计和图形函数等知识得到进一步认识,加深了我对程序的深层理解,清楚程序中每一步的功能。
结构设计的合理决定了这个程序的价值。
经历了这次课程设计,不仅使我对C语言有进一步的了解,而且在意志力方面也得到了锻炼。
没有足够的耐力与钻研精神就很难坚持对课程设计每一步的顺利进行。
五、附录源程序
#include
#include
#include
#include
#include
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
#defineSPACE0x3920
#defineBILI20
#defineJZ4
#defineJS3
#defineN19
intbox[N][N];
intstep_x,step_y;
intkey;
intflag=1;
voiddraw_box();
voiddraw_cicle(intx,inty,intcolor);
voidchange();
voidjudgewho(intx,inty);
voidjudgekey();
intjudgeresult(intx,inty);
voiddraw_box()
{
intx1,x2,y1,y2;
setbkcolor(BLUE);
setcolor(YELLOW);
gotoxy(7,2);
printf("caipeina'swuziqi");
outtextxy(490,400,"Welcometo");
outtextxy(470,425,"caipeina'swuziqi");
outtextxy(490,70,"\30isup");
outtextxy(490,90,"\31isdown");
outtextxy(490,110,"\32isright");
outtextxy(490,130,"\33isleft");
outtextxy(490,150,"SpacebarisGo");
for(x1=1,y1=1,y2=18;x1<=18;x1++)
line((x1+JZ)*BILI,(y1+JS)*BILI,(x1+JZ)*BILI,(y2+JS)*BILI);
for(x1=1,y1=1,x2=18;y1<=18;y1++)
line((x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI);
for(x1=1;x1<=18;x1++)
for(y1=1;y1<=18;y1++)
box[x1][y1]=0;
}
voiddraw_circle(intx,inty,intcolor)
{
setcolor(color);
setlinestyle(SOLID_LINE,0,1);
x=(x+JZ)*BILI;
y=(y+JS)*BILI;
circle(x,y,9);
}
voidjudgekey()
{
inti;
intj;
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_circle(step_x,step_y,BLUE);
break;
}
if(i<1)break;
step_x=i;
judgewho(step_x,step_y);
break;
}
caseRIGHT:
if(step_x+1>18)
break;
else
{
for(i=step_x+1,j=step_y;i<=18;i++)
if(box[i][j]==0)
{
draw_circle(step_x,step_y,BLUE);
break;
}
if(i>18)break;
step_x=i;
judgewho(step_x,step_y);
break;
}
caseDOWN:
if((step_y+1)>18)
break;
else
{
for(i=step_x,j=step_y+1;j<=18;j++)
if(box[i][j]==0)
{
draw_circle(step_x,step_y,BLUE);
break;
}
if(j>18)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_circle(step_x,step_y,BLUE);
break;
}
if(j<1)break;
step_y=j;
judgewho(step_x,step_y);
break;
}
caseESC:
break;
caseSPACE:
if(step_x>=1&&step_x<=18&&step_y>=1&&step_y<=18)
{
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);
if(flag==1)
{
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);
/*三重笔划字体,水平放?
5倍*/
outtextxy(20,20,"TheWhiteWin!
");
setcolor(15);
settextstyle(3,0,5);
/*无衬笔划字体,水平放大5倍*/
outtextxy(120,120,"TheWhiteWin!
");
setcolor(14);
settextstyle(2,0,8);
getch();
closegraph();
exit(0);
}
if(flag==2)
{
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,8);
/*三重笔划字体,水平放大8倍*/
outtextxy(20,20,"TheRedWin!
");
setcolor(15);
settextstyle(3,0,5);
/*无衬笔划字体,水平放大5倍*/
outtextxy(120,120,"TheRedWin!
");
setcolor(14);
settextstyle(2,0,8);
getch();
closegraph();
exit(0);
}
}
change();
break;
}
}
else
break;
}
}
voidchange()
{
if(flag==1)
flag=2;
else
flag=1;
}
voidjudgewho(intx,inty)
{
if(flag==1)
draw_circle(x,y,15);
if(flag==2)
draw_circle(x,y,4);
}
intjudgeresult(intx,inty)
{
intj,k,n1,n2;
while
(1)
{
n1=0;
n2=0;
/*水平向左数*/
for(j=x,k=y;j>=1;j--)
{
if(box[j][k]==flag)
n1++;
else
break;
}
/*水平向右数*/
for(j=x,k=y;j<=18;j++)
{
if(box[j][k]==flag)
n2++;
else
break;
}
if(n1+n2-1>=5)
{
return
(1);
break;
}
/*垂直向上数*/
n1=0;
n2=0;
for(j=x,k=y;k>=1;k--)
{
if(box[j][k]==flag)
n1++;
else
break;
}
/*垂直向下数*/
for(j=x,k=y;k<=18;k++)
{
if(box[j][k]==flag)
n2++;
else
break;
}
if(n1+n2-1>=5)
{
return
(1);
break;
}
/*向左上方数*/
n1=0;
n2=0;
for(j=x,k=y;j>=1,k>=1;j--,k--)
{
if(box[j][k]==flag)
n1++;
else
break;
}
/*向右下方数*/
for(j=x,k=y;j<=18,k<=18;j++,k++)
{
if(box[j][k]==flag)
n2++;
else
break;
}
if(n1+n2-1>=5)
{
return
(1);
break;
}
/*向右上方数*/
n1=0;
n2=0;
for(j=x,k=y;j<=18,k>=1;j++,k--)
{
if(box[j][k]==flag)
n1++;
else
break;
}
/*向左下方数*/
for(j=x,k=y;j>=1,k<=18;j--,k++)
{
if(box[j][k]==flag)
n2++;
else
break;
}
if(n1+n2-1>=5)
{
return
(1);
break;
}
return(0);
break;
}
}
voidmain()
{
intgdriver=VGA,gmode=VGAHI;
clrscr();
initgraph(&gdriver,&gmode,"c:
\\tc");
/*setwritemode(XOR_PUT);*/
flag=1;
draw_box();
do
{
step_x=0;
step_y=0;
/*draw_circle(step_x,step_y,8);*/
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();
}