20##年浙江省教育科学规划课题活页评审表
注:此表可复制和加页。填表后一式六份报送初审单位,其中五份报省教科规划办。
第二篇:五子棋程序。doc
/*=============================================== 五子棋
================================================*/
#include "stdio.h"
#include "graphics.h"
#define LEFT 0x4b00 /*左键值*/
#define RIGHT 0x4d00 /*右键值*/
#define DOWN 0x5000 /*下键值*/
#define UP 0x4800 /*上键值*/
#define ESC 0x011b /* ESC键值*/
#define ENTER 0x1c0d /* 回车键值*/
int x=-1, y = 0; /*纪录棋子移动点的坐标值*/ int max_x, max_y;
int board_flag[15][15]; /*棋盘每格的状态纪录数组*/
void draw_board(); /*画棋盘15*15的棋盘*/ void show_init(int pat); /*棋子出现的初始位置*/ void hide(); /*恢复棋子上一步的状态*/
void show(int pat); /*显示棋子当前状态*/ void move(); /*移动棋子*/
int is_win(int pat); /*判断哪方赢了*/
void main()
{
int driver = DETECT, mode;
int i, j;
for(i=0; i<15; i++)
for(j=0; j<15; j++)
{
board_flag[i][j] = 0;
}
initgraph(&driver, &mode, "");
draw_board();
show_init(0);
move();
getch();
closegraph();
}
/*=======================================================================*/
void draw_board()
{
int i;
max_x = getmaxx();
max_y = getmaxy();
setfillstyle(1, BLUE); /*设置棋盘背景为蓝色*/
bar(0,0, max_x, max_y);
for(i=-7; i<=8; i++)
{
line(max_x/2-7*26, max_y/2 +i*26, max_x/2+8*26, max_y/2+i*26); /*画水平方向的线*/
line(max_x/2+i*26, max_y/2-7*26, max_x/2+i*26, max_y/2+8*26); /*画垂直方向的线*/
}
}
/*==========================================================================*/
void show_init(int pat)
{
setcolor(BLUE);
if(pat == 0)
{
setfillstyle(1, BLACK); /*设置填充的颜色*/
}
else
{
setfillstyle(1,WHITE); /*设置填充的颜色*/
}
x = -1;
y = 0;
fillellipse(max_x/2-8*26+13, max_y/2-7*26+13, 12,12);/*画出初始位值出现的棋子*/
}
/*============================================================================*/
void hide()
{
int m;
m = board_flag[x][y];
switch(m)
{
case 0: /*标志位为零时,说明此处背景色为蓝色*/
setfillstyle(1, BLUE);
break;
case 1: /*标志为1时,说明此处为一黑色棋子*/
setfillstyle(1, BLACK);
break;
case 2: /*标志为2时,说明此处为一白色棋子*/
setfillstyle(1, WHITE);
break;
default:
break;
}
fillellipse(max_x/2+(x-7)*26+13, max_y/2+(y-7)*26+13, 12,12); /*恢复棋子上一步状态*/
}
/*=============================================================================*/
void show(int pat)
{
switch(pat)
{
case 0:
setfillstyle(1, BLACK);
break;
case 1:
setfillstyle(1, WHITE);
break;
default:
break;
}
fillellipse(max_x/2+(x-7)*26+13, max_y/2+(y-7)*26+13, 12,12);/*画出当前位置棋子*/
}
/*=================================================================*/
void move()
{
int key;
int pat = 0;
/*---------------------------------------------------------------*/
for(;;)
{
key = bioskey(0);
switch(key)
{
case LEFT:
if(x == -1)
{
break;
}
hide();
x--;
x = x<0?0:x;
show(pat);
break;
case RIGHT:
if(x == -1)
{
setfillstyle(1, BLUE);
fillellipse(max_x/2 + (x-7)*26+13, max_y/2 + (y-7)*26+13, 12,12); /*上次棋子出现的位置消失*/
}
else
{
hide(); /*隐藏棋子*/
}
x++;
x = x>14?14:x;
show(pat); /*棋子显示*/
break;
case DOWN:
if(x == -1)
{
break;
}
hide();
y++;
y = y>14?14:y;
show(pat);
break;
case UP:
if(x == -1)
{
break;
}
hide();
y--;
y = y<0?0:y;
show(pat);
break;
case ENTER:
if(board_flag[x][y] != 0) /*防止空格处已经放置了棋子,又一次放置*/ {
break;
}
show(pat);
board_flag[x][y] = pat+1;
if(is_win(pat))
{
settextstyle(0, 0, 3);
setcolor(RED);
if(pat == 0)
{
outtextxy(max_x/2-80, max_y/2,"Black Win!");
}
else
{
outtextxy(max_x/2-80, max_y/2,"White Win!");
}
setcolor(BLUE);
getch();
exit(1);
}
if(pat == 0)
{
pat = 1;
}
else
{
pat = 0;
}
show_init(pat);
break;
case ESC:
exit(1);
break;
default:
break;
}
}
}
/*===============================================================*/
int is_win(int pat)
{
int i, j;
int cnt = 0;
/*判断是否五子连在一起*/
/*------------------------------------------------------------*/
/*判断水平方向*/
cnt = 0;
i = x;
while(i<15)
{
if(board_flag[i][y] == pat+1)
{
cnt++;
}
else
{
break;
}
i++;
}
i = x-1;
while(i>=0)
{
if(board_flag[i][y] == pat+1)
{
cnt++;
}
else
{
break;
}
i--;
}
if(cnt >= 5)
{
return 1;
}
/*-------------------------------------------------------*/ /*判断45度直线方向*/
cnt = 0;
i = x;
j = y;
while(i<15)
{
if(j<0)
{
break;
}
if(board_flag[i][j] == pat+1)
{
cnt++;
}
else
{
break;
}
i++;
j--;
}
i = x-1;
j = y+1;
while(i>=0)
{
if(j>14)
{
break;
}
if(board_flag[i][j] == pat+1)
{
cnt++;
}
else
{
break;
}
i--;
j++;
}
if(cnt >=5)
{
return 1;
}
/*----------------------------------------------------------------------------*/ /*判断垂直方向*/
cnt = 0;
j = y;
while(j>=0)
{
if(board_flag[x][j] == pat+1)
{
cnt++;
}
else
{
break;
}
j--;
}
j = y+1;
while(j<15)
{
if(board_flag[x][j] == pat+1)
{
cnt++;
}
else
{
break;
}
j++;
}
if(cnt>=5)
{
return 1;
}
/*----------------------------------------------------------------*/ /*判断135度直线方向*/
cnt = 0;
i = x;
j = y;
while(i>=0)
{
if(j<0)
{
break;
}
if(board_flag[i][j] == pat+1) {
cnt++;
}
else
{
break;
}
i--;
j--;
}
i = x+1;
j = y+1;
while(i<15)
{
if(j>14)
{
break;
}
if(board_flag[i][j] == pat+1) {
cnt++;
}
else
{
break;
}
i++;
j++;
}
if(cnt >= 5)
{
return 1;
}
return 0;
}