/*
运行环境:VC++6.0。
(需添加turbo图形库 网址:http://www.easyx.cn/skills/)
算法改进中。
按上下左右键控制光标。
按空格落子。
*/
#include <graphics.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <windows.h>
//设置偏移量
#define OFFSET 20
#define OFFSET_x 4
#define OFFSET_y 3
//定义棋子的坐标
int ChessMan_y;
int ChessMan_x;
//定义棋子的次序,在x行第几位,y行第几位
int ChessManOrder_x;
int ChessManOrder_y;
//此变量判断下棋方
int PlayChessOrder;
//定义数组大小
#define N 19
//此数组表现棋盘上坐标的状态
int status[N][N];
//获取按键变量
int key;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(hConsole, coord);
}
/*gotoxy()函数,使坐标移动到屏幕(x,y)点。*/
void main()
{
initgraph(640, 480);
ChessMan_x=280;
ChessMan_y=260;
PlayChessOrder=3;
int x1,x2;
int y1,y2;
//在棋盘上画点。
int x=100;
for(int i=1;i<19;i++)
{
int y=80;
for(int ii=1;ii<19;ii++)
{
gotoxy(x,y);
setcolor(YELLOW);
setfillstyle(WHITE);
fillcircle(x,y,3);
y+=20;
}
x+=20;
}
//设置线条颜色
setcolor(WHITE);
//按照预设的偏移量开始画棋盘
for(x1=1,y1=1,y2=18;x1<=18;x1++)
{
line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x1+OFFSET_x)*OFFSET,(y2+OFFSET_y)*OFFSET);
}
for(x1=1,y1=1,x2=18;y1<=18;y1++)
{
line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x2+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET);
}
//将各个点的状态设为三。
for(x1=0;x1<18;x1++)
{
for(y1=0;y1<18;y1++)
{
status[x1][y1]=3;
}
}
//gotoxy(100,80);
while(1)
{
Sleep(10);
//判断按键,用key变量记录。
if(kbhit())
{
key=getch();
switch(key)
{
case 32:
ChessManOrder_x=(ChessMan_x-100)/20;
ChessManOrder_y=(ChessMan_y-80)/20;
gotoxy(ChessMan_x,ChessMan_y);
if(PlayChessOrder%2==0)
{
setcolor(YELLOW);
setfillstyle(RED);
fillcircle(ChessMan_x,ChessMan_y,10);
status[ChessManOrder_x][ChessManOrder_y]=1;
}
else
{
setcolor(YELLOW);
setfillstyle(BLUE);
fillcircle(ChessMan_x,ChessMan_y,10);
status[ChessManOrder_x][ChessManOrder_y]=2;
}
PlayChessOrder++;
break;
case 72:
//如果超出棋盘什么也不做
if((status[ChessManOrder_x][ChessManOrder_y-1]!=3)&&(status[ChessManOrder_x][ChessManOrder_y-1]!=1)&&(status[ChessManOrder_x][ChessManOrder_y-1]!=2))
break;
if((status[ChessManOrder_x][ChessManOrder_y]!=1)&&(status[ChessManOrder_x][ChessManOrder_y]!=2))
{
gotoxy(ChessMan_x,ChessMan_y);
setcolor(YELLOW);
setfillstyle(WHITE);
fillcircle(ChessMan_x,ChessMan_y,3);
(ChessMan_y)-=20;
}
else
(ChessMan_y)-=20;
break;
case 77:
if((status[ChessManOrder_x+1][ChessManOrder_y]!=3)&&(status[ChessManOrder_x+1][ChessManOrder_y]!=1)&&(status[ChessManOrder_x+1][ChessManOrder_y]!=2))
break;
if((status[ChessManOrder_x][ChessManOrder_y]!=1)&&(status[ChessManOrder_x][ChessManOrder_y]!=2))
{
gotoxy(ChessMan_x,ChessMan_y);
setcolor(YELLOW);
setfillstyle(WHITE);
fillcircle(ChessMan_x,ChessMan_y,3);
(ChessMan_x)+=20;
}
else
(ChessMan_x)+=20;
break;
case 80:
if((status[ChessManOrder_x][ChessManOrder_y+1]!=3)&&(status[ChessManOrder_x][ChessManOrder_y+1]!=1)&&(status[ChessManOrder_x][ChessManOrder_y+1]!=2))
break;
if((status[ChessManOrder_x][ChessManOrder_y]!=1)&&(status[ChessManOrder_x][ChessManOrder_y]!=2))
{
gotoxy(ChessMan_x,ChessMan_y);
setcolor(YELLOW);
setfillstyle(WHITE);
fillcircle(ChessMan_x,ChessMan_y,3);
(ChessMan_y)+=20;
}
else
(ChessMan_y)+=20;
break;
case 75:
if((status[ChessManOrder_x-1][ChessManOrder_y]!=3)&&(status[ChessManOrder_x-1][ChessManOrder_y]!=1)&&(status[ChessManOrder_x-1][ChessManOrder_y]!=2))
break;
if((status[ChessManOrder_x][ChessManOrder_y]!=1)&&(status[ChessManOrder_x][ChessManOrder_y]!=2))
{
gotoxy(ChessMan_x,ChessMan_y);
setcolor(YELLOW);
setfillstyle(WHITE);
fillcircle(ChessMan_x,ChessMan_y,3);
(ChessMan_x)-=20;
}
else
(ChessMan_x)-=20;
break;
default:
break;
}
ChessManOrder_x=(ChessMan_x-100)/20;
ChessManOrder_y=(ChessMan_y-80)/20;
if(status[ChessManOrder_x][ChessManOrder_y]==3)
{
gotoxy(ChessMan_x,ChessMan_y);
setcolor(YELLOW);
setfillstyle(RED);
fillcircle(ChessMan_x,ChessMan_y,3);
}
//横向判断胜负。
for(i=0;i<5;i++)
{
int n=0;
int m=0;
for(int ii=(ChessManOrder_x-i);ii<=ChessManOrder_x+(4-i);ii++)
{
if(status[ii][ChessManOrder_y]==1)
m++;
if(status[ii][ChessManOrder_y]==2)
n++;
}
if(m==5||n==5)
{
printf("GameOver");
closegraph();
}
}
//竖向判断胜负
for(i=0;i<5;i++)
{
int n=0;
int m=0;
for(int ii=(ChessManOrder_y-i);ii<=ChessManOrder_y+(4-i);ii++)
{
if(status[ChessManOrder_x][ii]==1)
m++;
if(status[ChessManOrder_x][ii]==2)
n++;
}
if(m==5||n==5)
{
printf("GameOver");
closegraph();
}
}
//左上至右下方向判断红方胜负
int n1=0;
int n2=0;
int j;
int k;
/*向左上方数*/
for(j=ChessManOrder_x,k=ChessManOrder_y;(j>=1)&&(k>=1);j--,k--)
{
if(status[j][k]==1)
n1++;
else
break;
}
/*向左下方数*/
for(j=ChessManOrder_x,k=ChessManOrder_y;(j<=18)&&(k<=18);j++,k++)
{
if(status[j][k]==1)
n2++;
else
break;
}
if(n1+n2>5)
{
printf("GameOver red win.");
closegraph();
}
//左上至右下方向判断红方胜负结束
//左上至右下方向判断蓝方胜负
n1=0;
n2=0;
/*向左上方数*/
for(j=ChessManOrder_x,k=ChessManOrder_y;(j>=1)&&(k>=1);j--,k--)
{
if(status[j][k]==2)
n1++;
else
break;
}
/*向左下方数*/
for(j=ChessManOrder_x,k=ChessManOrder_y;(j<=18)&&(k<=18);j++,k++)
{
if(status[j][k]==2)
n2++;
else
break;
}
if(n1+n2>5)
{
printf("GameOver,blue win.");
closegraph();
}
//左上至右下方向判断蓝方胜负结束
//蓝方右上至左下判断
int m1=0;
int m2=0;
//向右上方数
for(j=ChessManOrder_x,k=ChessManOrder_y;(j<=18)&&(k>=1);j++,k--)
{
if(status[j][k]==2)
m1++;
else
break;
}
//向左下方数
for(j=ChessManOrder_x,k=ChessManOrder_y;(j>=1)&&(k<=18);j--,k++)
{
if(status[j][k]==2)
m2++;
else
break;
}
if(m1+m2>5)
{
printf("GameOver blue win.");
closegraph();
}
//蓝方右上至左下判断
//红方右上至左下判断
m1=0;
m2=0;
//向右上方数
for(j=ChessManOrder_x,k=ChessManOrder_y;(j<=18)&&(k>=1);j++,k--)
{
if(status[j][k]==1)
m1++;
else
break;
}
//向左下方数
for(j=ChessManOrder_x,k=ChessManOrder_y;(j>=1)&&(k<=18);j--,k++)
{
if(status[j][k]==1)
m2++;
else
break;
}
if(m1+m2>5)
{
printf("GameOver.red win.");
closegraph();
}
//红方右上至左下判断
}
//if(kbhit())结束。
}
getch();
closegraph();
}
五子棋
最新推荐文章于 2023-12-27 19:47:25 发布