C语言课程设计实验报告Word下载.docx
《C语言课程设计实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《C语言课程设计实验报告Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
(2)双方轮流使用键盘的“↑”、“↓”、“←”、“→”键控制棋子在屏幕上的位置,按“空格”键放置棋子,判断棋子应放置在棋盘范围内且不能已经有棋子,否则使用扬声器提示不能放置;
(3)当一方的棋子数在行、列或对角线上连续达到5个(无禁手判断),则为胜方,在屏幕上显示胜利一方,按任意键退出程序。
3.实验方案(程序设计说明)
(1)算法设计思路
棋盘设计为19×
19格,初始状态光标在棋盘的左上,黑棋先走,轮流落子,当一方连成五子或下满棋盘时,游戏结束。
当游戏一方胜利后显示胜利信息。
从程序表面看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有三种情况,分别是0代表无棋子,1代表黑棋,2代表白棋。
这样程序的主要工作是接收棋手按键操作,双方轮流使用键盘的“↑”、“↓”、“←”、“→”键控制光标移动,空格键表示落子。
一旦接收到空格键,说明棋手落子,先判断是否是有效位置,也就是说棋子应在棋盘内或棋盘的空位置上,无效位置时利用扬声器发声警示。
落子成功后,马上判断以该位置为中心的八个方向相邻的是否有相同颜色的棋子连成五子,如果连成五子,则游戏结束,输出胜利一方的信息。
如果想在对弈的过程中退出游戏,可以按Esc键。
(2)程序功能流程图
4.程序运行结果
(1)规则界面
(2)对弈界面
(3)获胜界面
5.出现的问题及解决方法
(1)游戏开始时,棋子原来初始在棋盘中央,一旦中央落子后,初始棋子与已有棋子重叠,为了解决问题将初始棋子移动到棋盘左上方棋盘以外。
(2)棋子都为空心圆,在棋盘不好区分正在控制的棋子,改为已确定落子的棋子为实心圆,正在控制的棋子为空心圆。
附件A沈阳工业大学实验报告
计专1502学号:
248150203姓名:
实验程序:
本程序在WindowsXPSP3操作系统及TurboC2.0开发环境下调试通过。
#include<
stdio.h>
stdlib.h>
graphics.h>
bios.h>
conio.h>
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
#defineSPACE0x3920
#defineBILI20
#defineJZ4
#defineJS3
#defineSIZE19
intbox[SIZE][SIZE];
intstep_x,step_y;
intkey;
intflag=1;
voidattentoin();
voiddraw_box();
voiddraw_cicle(intx,inty,intcolor);
voiddraw_slice(intx,inty,intcolor);
voidchange();
voidjudgewho(intx,inty);
voidjudgekey();
intjudgeresult(intx,inty);
voidattention()
{
charch;
window(1,1,80,25);
textbackground(LIGHTBLUE);
textcolor(YELLOW);
clrscr();
gotoxy(15,4);
printf("
PlayRules:
"
);
gotoxy(15,8);
1.PressLeft,Right,Up,DownKeytomovePiece"
gotoxy(15,12);
2.PressSpacetoplacethePiece"
gotoxy(15,16);
3.DONOTpressSpaceoutsideofthechessboard"
gotoxy(15,20);
DoyouaccepttheabovePlayingRules?
[Y/N]:
while
(1)
{
gotoxy(60,20);
ch=getche();
if(ch=='
Y'
||ch=='
y'
)
break;
elseif(ch=='
N'
n'
{
window(1,1,80,25);
textbackground(BLACK);
textcolor(LIGHTGRAY);
clrscr();
exit(0);
}
gotoxy(51,12);
printf("
"
}
}
voiddraw_box()
intx1,x2,y1,y2;
setbkcolor(LIGHTBLUE);
setcolor(YELLOW);
gotoxy(7,2);
Left,Right,Up,DownKEYtomove,Spacetoput,ESC-quit."
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<
y1++)
line((x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI);
for(x1=1;
for(y1=1;
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,8);
voiddraw_slice(intx,inty,intcolor)
setcolor(color);
setfillstyle(SOLID_FILL,color);
floodfill(x,y,color);
pieslice(x,y,0,360,8);
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,LIGHTBLUE);
break;
}
if(i<
1)break;
step_x=i;
judgewho(step_x,step_y);
}
caseRIGHT:
if(step_x+1>
18)
for(i=step_x+1,j=step_y;
i<
i++)
if(i>
18)break;
caseDOWN:
if((step_y+1)>
for(i=step_x,j=step_y+1;
j<
j++)
if(j>
18)break;
step_y=j;
caseUP:
if((step_y-1)<
for(i=step_x,j=step_y-1;
j>
j--)
if(j<
1)break;
caseESC:
caseSPACE:
if(step_x>
=1&
&
step_x<
=18&
step_y>
step_y<
=18)
if(box[step_x][step_y]==0)
{
box[step_x][step_y]=flag;
if(flag==1)
draw_slice(step_x,step_y,BLUE);
else
draw_slice(step_x,step_y,WHITE);
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);
outtextxy(20,20,"
TheBlackWin!
setcolor(14);
settextstyle(3,0,5);
outtextxy(120,120,"
settextstyle(2,0,8);
getch();
closegraph();
exit(0);
}
if(flag==2)
settextstyle(1,0,8);
TheWhiteWin!
change();
break;
}
else
voidchange()
if(flag==1)
flag=2;
else
flag=1;
voidjudgewho(intx,inty)
draw_circle(x,y,BLUE);
if(flag==2)
draw_circle(x,y,WHITE);
intjudgeresult(intx,inty)
intj,k,n1,n2;
n1=0;
n2=0;
/*
水平向左数
*/
for(j=x,k=y;
if(box[j][k]==flag)
n1++;
水平向右数
n2++;
if(n1+n2-1>
=5)
return
(1);
垂直向上数
k>
k--)
垂直向下数
k<
k++)
向左上方数
=1,k>
j--,k--)
向右下方数
=18,k<
j++,k++)
向右上方数
=18,k>
j++,k--)
向左下方数
=1,k<
j--,k++)
return(0);
break;
voidmain()
intgdriver=VGA,gmode=VGAHI;
attention();
initgraph(&
gdriver,&
gmode,"
c:
\\tc\\bgi"
flag=1;
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!
closegraph();