/*编译成功需要graphics.h以及lib百度可以下到
vc6.0编译通过*/
#include <graphics.h>
#include <conio.h>
struct info{
int empty; //判断当前位置是否为空 0为空
int mark; //记录当前位置的棋子颜色
}elem[10][10];
int d=1; //判断本次所下棋子颜色
void initList() // 初始换10*10 的每个数都为0
{
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
elem[i][j].empty=0;
elem[i][j].mark=0;
}
}
}
void welcome()
{
/*
// 颜色
#define BLACK 0
#define BLUE 0xA80000
#define GREEN 0x00A800
#define CYAN 0xA8A800
#define RED 0x0000A8
#define MAGENTA 0xA800A8
#define BROWN 0x0054A8
#define LIGHTGRAY 0xA8A8A8
#define DARKGRAY 0x545454
#define LIGHTBLUE 0xFC5454
#define LIGHTGREEN 0x54FC54
#define LIGHTCYAN 0xFCFC54
#define LIGHTRED 0x5454FC
#define LIGHTMAGENTA 0xFC54FC
#define YELLOW 0x54FCFC
#define WHITE 0xFCFCFC
*/
setcolor(RED); // void setcolor(COLORREF color); // 设置当前绘图前景色
setfont(80,40,"Arial"); // 设置字体 高宽 字体
outtextxy(210,150,"五子棋"); // 在指定位置输出文字
setfont(40,20,"宋体");
// kbhit() 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
// MouseHit 检查是否存在鼠标消息 返回bool型
while (!kbhit())
{
setcolor(BLUE); // 设置当前绘图前景色
outtextxy(150,300,"按任意键进入游戏");
Sleep(500); // 停止0.5秒 继续执行
setcolor(BLACK);
outtextxy(150,300,"按任意键进入游戏");
Sleep(500);
}
getch(); // 接受按下的字符
cleardevice(); // 清屏
}
void draw()
{
setcolor(RED); // 设置当前绘图前景色
for (int i=0;i<10;i++)
{
line(140,60+40*i,500,60+40*i); // 画线 左端(x,y) 右端(x,y)
}
for (int j=0;j<10;j++)
{
line(140+40*j,60,140+40*j,420); // 画线
}
}
void drawcircle(int x,int y,int color) // 画棋子
{
for (int i=1;i<=12;i++)
{
setcolor(RGB(255,color,21*i));
circle(x,y,i); // 画圆
}
}
int cx(int x) // 鼠标x坐标
{
if (x<510&&x>130)
{
if ((x-140)%40<10) // 点之上 约小于1/4格 返回x坐标
{
return (x-140)/40;
}
if (40-(x-140)%40<10) // 点之下 约小于1/4格 返回x坐标
{
return (x-140)/40+1;
}
}
return -1;
}
int cy(int y)
{
if (y<430&&y>50)
{
if ((y-60)%40<10) // 点之右 约小于1/4格 返回y坐标
{
return (y-60)/40;
}
if (40-(y-60)%40<10)
{
return (y-60)/40+1; // 点之左 约小于1/4格 返回y坐标
}
}
return -1;
}
int judge(int x,int y) //判断是否当前位置已下棋,空返回1
{
if (elem[x][y].empty==0)
{
return 1;
}
else
{
return 0;
}
}
void list(int x,int y,int color)
{
elem[x][y].mark=color;
elem[x][y].empty=1;
}
int winh(int x,int y,int color) // 棋子横向的左边,右边
{
int i,j,countl=0,countr=0;
i=x-1;
j=y;
while (elem[i][j].mark==color&&i>=0) // 左边
{
countl++;
i--;
}
i=x+1; // 初始化之右的第一个棋子的坐标
j=y;
while (elem[i][j].mark==color&&i<10) // 右边
{
countr++;
i++;
}
if (countl+countr==4)
{
return 1;
}
else
{
return 0;
}
}
int winv(int x,int y,int color) // 棋子纵向的上边,下边
{
int i,j,countt=0,countb=0;
i=x;
j=y-1;
while (elem[i][j].mark==color&&j>=0) // 上边
{
countt++;
j--;
}
i=x;
j=y+1;
while (elem[i][j].mark==color&&j<10) // 下边
{
countb++;
j++;
}
if (countt+countb==4)
{
return 1;
}
else
{
return 0;
}
}
int winlx(int x,int y,int color) // 棋子的西南 东北
{
int i,j,countlt=0,countlb=0;
i=x-1;
j=y-1;
while (elem[i][j].mark==color&&i>=0&&j>=0) // 西南
{
countlt++;
i--;
j--;
}
i=x+1;
j=y+1;
while (elem[i][j].mark==color&&i<10&&j<10) // 东北
{
countlb++;
i++;
j++;
}
if (countlt+countlb==4)
{
return 1;
}
else
{
return 0;
}
}
int winrx(int x,int y,int color) // 棋子的西北 东南
{
int i,j,countlt=0,countlb=0;
i=x-1;
j=y+1;
while (elem[i][j].mark==color&&i>=0&&j<10) // 西北
{
countlt++;
i--;
j++;
}
i=x+1;
j=y-1;
while (elem[i][j].mark==color&&i<10&&j>=0) // 东南
{
countlb++;
i++;
j--;
}
if (countlt+countlb==4)
{
return 1;
}
else
{
return 0;
}
}
int win(int x,int y,int color)
{
// 四个方向做判断
if (winh(x,y,color)||winv(x,y,color)||winlx(x,y,color)||winrx(x,y,color))
{
return 1;
}
else
{
return 0;
}
}
int pos(int x,int y) // 鼠标按下位置
{
int posx;
int posy;
posx=cx(x); // 棋子落下的x坐标(交点格数)
posy=cy(y); // 棋子落下的y坐标(交点格数)
if (posx!=-1&&posy!=-1) // 在棋盘之内
{
if (d==1&&judge(posx,posy)) // 棋子颜色为1 && 未下棋
{
list(posx,posy,d); // 保存位置和棋子颜色
drawcircle(posx*40+140,posy*40+60,1); // 画棋子
if (win(posx,posy,d))
{
drawcircle(280,30,1);
outtextxy(300,10,"方胜");
return 1;
}
d=-d; // 颜色置反 另一方下棋
}
if (d==-1&&judge(posx,posy))
{
list(posx,posy,d);
drawcircle(posx*40+140,posy*40+60,255);
if (win(posx,posy,d))
{
drawcircle(280,30,255);
outtextxy(300,10,"方胜");
return 1;
}
d=-d;
}
}
return 0;
}
void opeator()
{
/*
struct MOUSEMSG
{
UINT uMsg; // 当前鼠标消息
bool mkCtrl; // Ctrl 键是否按下
bool mkShift; // Shift 键是否按下
bool mkLButton; // 鼠标左键是否按下
bool mkMButton; // 鼠标中键是否按下
bool mkRButton; // 鼠标右键是否按下
int x; // 当前鼠标 x 坐标
int y; // 当前鼠标 y 坐标
int wheel; // 鼠标滚轮滚动值(120的倍数)
};
// 鼠标消息
// 支持如下消息:
// WM_MOUSEMOVE 鼠标移动
// WM_MOUSEWHEEL 鼠标滚轮拨动
// WM_LBUTTONDOWN 左键按下
// WM_LBUTTONUP 左键弹起
// WM_LBUTTONDBLCLK 左键双击
// WM_MBUTTONDOWN 中键按下
// WM_MBUTTONUP 中键弹起
// WM_MBUTTONDBLCLK 中键双击
// WM_RBUTTONDOWN 右键按下
// WM_RBUTTONUP 右键弹起
// WM_RBUTTONDBLCLK 右键双击
*/
MOUSEMSG m;
while (1)
{
m=GetMouseMsg(); // 获取一个鼠标消息。如果没有,就等待
switch (m.uMsg)
{
case WM_LBUTTONDOWN: //左键安下
if (pos(m.x,m.y))
{
return;
}
break;
default:
break;
}
}
}
void main()
{
initgraph(640,480); // 原型: void initgraph(int Width, int Height, int Flag = NULL); // 初始化图形环境
welcome(); // 初始界面
draw(); // 画格子
initList(); // 初始化 10*10 的每个元素都为0
opeator(); // operator下棋
getch(); // 暂停下
closegraph(); // 关闭图形环境
}