C语言课程设计实验报告
发布时间:2018-07-01 07:12:33
发布时间:2018-07-01 07:12:33
实验报告
课程名称: C语言课程设计
实验项目: 五子棋游戏设计
专业班级: 计专1502
姓 名: 孙奇 学 号: 248150203
实验室号: 实验组号:
实验时间: 批阅时间:
指导教师: 成 绩:
沈阳工业大学实验报告
(适用计算机程序设计类)
专业班级: 计专1502 学号: 248150203 姓名: 孙奇
实验名称:五子棋游戏设计
1.实验内容: (1)掌握C语言的基本语法结构、程序设计方法和一些常见的算法; (2)掌握对程序排查错误的能力。 2.实验内容: (1)实现双人对战的简单步骤和规则,能够判断输赢; (2)双方轮流使用键盘的“↑”、“↓”、“←”、“→”键控制棋子在屏幕上的位置,按“空格”键放置棋子,判断棋子应放置在棋盘范围内且不能已经有棋子,否则使用扬声器提示不能放置; (3)当一方的棋子数在行、列或对角线上连续达到5个(无禁手判断),则为胜方,在屏幕上显示胜利一方,按任意键退出程序。 3. 实验方案(程序设计说明) (1)算法设计思路 棋盘设计为19×19格,初始状态光标在棋盘的左上,黑棋先走,轮流落子,当一方连成五子或下满棋盘时,游戏结束。当游戏一方胜利后显示胜利信息。从程序表面看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有三种情况,分别是0代表无棋子,1代表黑棋,2代表白棋。这样程序的主要工作是接收棋手按键操作,双方轮流使用键盘的“↑”、“↓”、“←”、“→”键控制光标移动,空格键表示落子。一旦接收到空格键,说明棋手落子,先判断是否是有效位置,也就是说棋子应在棋盘内或棋盘的空位置上,无效位置时利用扬声器发声警示。落子成功后,马上判断以该位置为中心的八个方向相邻的是否有相同颜色的棋子连成五子,如果连成五子,则游戏结束,输出胜利一方的信息。如果想在对弈的过程中退出游戏,可以按Esc键。 (2)程序功能流程图 4.程序运行结果 (1)规则界面 (2)对弈界面 (3)获胜界面 5.出现的问题及解决方法 (1)游戏开始时,棋子原来初始在棋盘中央,一旦中央落子后,初始棋子与已有棋子重叠,为了解决问题将初始棋子移动到棋盘左上方棋盘以外。 (2)棋子都为空心圆,在棋盘不好区分正在控制的棋子,改为已确定落子的棋子为实心圆,正在控制的棋子为空心圆。 |
附件A 沈阳工业大学实验报告
(适用计算机程序设计类)
专业班级: 计专1502 学号:248150203 姓名: 孙奇
实验程序:
本程序在Windows XP SP3操作系统及Turbo C 2.0开发环境下调试通过。
#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 SIZE 19
int box[SIZE][SIZE];
int step_x,step_y;
int key;
int flag=1;
void attentoin();
void draw_box();
void draw_cicle(int x,int y,int color);
void draw_slice(int x,int y,int color);
void change();
void judgewho(int x,int y);
void judgekey();
int judgeresult(int x,int y);
void attention()
{
char ch;
window(1,1,80,25);
textbackground(LIGHTBLUE);
textcolor(YELLOW);
clrscr();
gotoxy(15,4);
printf("Play Rules:");
gotoxy(15,8);
printf("1.Press Left,Right,Up,Down Key to move Piece");
gotoxy(15,12);
printf("2.Press Space to place the Piece");
gotoxy(15,16);
printf("3.DO NOT press Space outside of the chessboard");
gotoxy(15,20);
printf("Do you accept the above Playing Rules? [Y/N]:");
while(1)
{
gotoxy(60,20);
ch=getche();
if (ch=='Y' || ch=='y')
break;
else if(ch=='N' || ch=='n')
{
window(1,1,80,25);
textbackground(BLACK);
textcolor(LIGHTGRAY);
clrscr();
exit(0);
}
gotoxy(51,12);
printf(" ");
}
}
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=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;
}
void draw_circle(int x,int y,int color)
{
setcolor(color);
setlinestyle(SOLID_LINE,0,1);
x=(x+JZ)*BILI;
y=(y+JS)*BILI;
circle(x,y,8);
}
void draw_slice(int x,int y,int color)
{
x=(x+JZ)*BILI;
y=(y+JS)*BILI;
setcolor(color) ;
setfillstyle(SOLID_FILL,color);
circle(x,y,8);
floodfill(x,y,color);
setcolor(color);
setfillstyle(SOLID_FILL,color);
pieslice(x,y,0,360,8);
setcolor(color);
}
void judgekey()
{
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(box[i][j]==0)
{
draw_circle(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>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,LIGHTBLUE);
break;
}
if(i>18) break;
step_x=i;
judgewho(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(box[i][j]==0)
{
draw_circle(step_x,step_y,LIGHTBLUE);
break;
}
if(j>18)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_circle(step_x,step_y,LIGHTBLUE);
break;
}
if(j<1)break;
step_y=j;
judgewho(step_x,step_y);
break;
}
case ESC :
break;
case SPACE :
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 (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,"The Black Win !");
setcolor(14);
settextstyle(3,0,5);
outtextxy(120,120,"The Black Win !");
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);
outtextxy(20,20,"The White Win !");
setcolor(14);
settextstyle(3,0,5);
outtextxy(120,120,"The White Win !");
setcolor(14);
settextstyle(2,0,8);
getch();
closegraph();
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_circle(x,y,BLUE);
if(flag==2)
draw_circle(x,y,WHITE);
}
int judgeresult(int x,int y)
{
int j,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;
}
}
void main()
{
int gdriver=VGA,gmode=VGAHI;
clrscr();
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!=ESC);
closegraph();
}