#include<graphics.h>
#include<conio.h>
#include<math.h>
#include<stdio.h>
#include <Windows.h>
#include <mmsystem.h>
#pragma comment(lib,"WINMM.LIB")
//函数的声明
void hello();//音乐
void board();//绘制棋盘
void turn();//交替下棋
bool judgewin(int a[20][20],int x,int y,int player);//判断输赢
void mechine();
int main()
{
int mode = 0;//模式选择
//hello(); //播放音乐
scanf("%d",&mode);
if(mode==1)//mode=1是双人下棋
{
board();//棋盘加载
turn();//交替下棋加载
}
closegraph();// 关闭图形窗口
return 0;
}
//播放音乐
void hello()
{
mciSendString("open 1.mp3 alias bkmusic", NULL, 0, NULL);
mciSendString("play bkmusic repeat", NULL, 0, NULL); //循环播放音乐
system("pause");
return;
}
void board()//绘制棋盘
{
int i = 0;
int step=30;//绘制图形的间距参数
initgraph(500,500); //初始化绘图窗口
setbkcolor(YELLOW); //设置背景色为黄色
cleardevice(); //用背景色清空屏幕
setcolor(RGB(0,0,0));//设置为黑色
setlinestyle(PS_SOLID,2);//画实线,宽度为两个像素
for(i=1;i<=16;i++)//画横线和竖线
{
line(i*step,1*step,i*step,16*step); //绘制的竖线下x = i
line(1*step,i*step,16*step,i*step); //绘制的横线 y = i
}
}
void turn()//交替下棋
{
ExMessage m;// 定义消息变量
int x = 0;//横坐标
int y = 0;//纵坐标
int flag = 0;//交替下棋
float a = 0, b = 0; //横纵坐标的中间量
int chessboard[20][20] = {0};//记录鼠标横坐标的位置
int chess[20][20] = {0};//记录下棋的位置
while(true)
{
m = getmessage(EX_MOUSE | EX_KEY);// 获取一条鼠标或按键消息
if(m.message==WM_LBUTTONDOWN) //鼠标左键
{
if((m.x>=30&&m.y>=30)&&(m.x<=480&&m.y<=480))//在规定的位置上下棋
{
//计算坐标
a = (m.x/30.0)+0.5;
b = (m.y/30.0)+0.5;
x = floor(a);
y = floor(b);
if(chessboard[x][y] != 0)//判断当前位置上是否有棋子
continue; //回到循环
// 画一个黑棋
if(flag==0){
setfillcolor(BLACK);
fillcircle(x*30,y*30,10);
chess[x][y] = 1;
if(judgewin(chess,x,y,1))
{
MessageBox(GetHWnd(), _T("黑棋胜利"), _T("游戏结束"), MB_OK);//判断为黑方胜利
return;
}
}
//画一个白棋
if(flag==1){
setfillcolor(WHITE);
fillcircle(x*30,y*30,10);
chess[x][y] = 2;
if(judgewin(chess,x,y,2))
{
MessageBox(GetHWnd(),_T("白棋胜利"),_T("游戏结束"),MB_OK);//判断为白方胜利
return;
}
}
chessboard[x][y] = 1;//标记已经下过的位置
flag = !flag; //交替下棋
}
}
// 按 ESC 键退出程序
if(m.message==WM_KEYDOWN)
{
if (m.vkcode == VK_ESCAPE)
return;
}
}
}
bool judgewin(int a[20][20],int x,int y,int player)//判断输赢
{
int count = 0;//记录连续棋子的个数
int i = 0;
int j = 0;
//判断横向
for (i = max(1, x - 4); i <= min(16, x); i++)
{
count = 0;
for (j = i; j <= min(i + 4,16); j++)
{
if (a[j][y] == player)
count++; //每有一个连续的棋子就加1
else
break; //如果出现别的棋子,则直接跳出最近的一个for循环
}
if (count >= 5) //有连续的五个就结束
return true;
}
//判断纵向
for(i=max(y-4,1);i<=min(y,16);i++)
{
count = 0;
for(j=i;j<=min(i+4,16);j++)
{
if(a[x][j]==player)
count++; //每有一个连续的棋子就加1
else
break; //如果出现别的棋子,则直接跳出最近的一个for循环
}
if(count >= 5) //有连续的五个就结束
return true;
}
//判断右斜
for(i = 0; i <= 4; i++)
{
count = 0;
for (j = i-4; j <= i; j++)
{
if(a[x+j][y+j]==player)
count++; //每有一个连续的棋子就加1
else
break; //如果出现别的棋子,则直接跳出最近的一个for循环
}
if(count >= 5) //有连续的五个就结束
return true;
}
//判断左斜
for(i = 0; i <= 4; i++)
{
count = 0;
for (j = i-4; j <= i; j++)
{
if(a[x+j][y-j]==player)
count++; //每有一个连续的棋子就加1
else
break; //如果出现别的棋子,则直接跳出最近的一个for循环
}
if(count >= 5) //有连续的五个就结束
return true;
}
return false; //没有赢,就返回false,之后接着下棋,等着下一次调用judgewin函数
}
void mechine()
{
ExMessage m;// 定义消息变量
int x = 0;//横坐标
int y = 0;//纵坐标
int flag = 0;//交替下棋
float a = 0, b = 0; //横纵坐标的中间量
int chessboard[20][20] = {0};//记录鼠标横坐标的位置
int chess[20][20] = {0};//记录下棋的位置
while(true)
{
m = getmessage(EX_MOUSE | EX_KEY);// 获取一条鼠标或按键消息
if(flag==0)
{
if(m.message==WM_LBUTTONDOWN) //鼠标左键
{
if((m.x>=30&&m.y>=30)&&(m.x<=480&&m.y<=480))//在规定的位置上下棋
{
//计算坐标
a = (m.x/30.0)+0.5;
b = (m.y/30.0)+0.5;
x = floor(a);
y = floor(b);
if(chessboard[x][y] != 0)//判断当前位置上是否有棋子
continue; //回到循环
// 画一个黑棋
if(flag==0){
setfillcolor(BLACK);
fillcircle(x*30,y*30,10);
chess[x][y] = 1;
if(judgewin(chess,x,y,1))
{
MessageBox(GetHWnd(), _T("黑棋胜利"), _T("游戏结束"), MB_OK);//判断为黑方胜利
return;
}
}
}
}
}
if(flag==1)
{
if((m.x>=30&&m.y>=30)&&(m.x<=480&&m.y<=480))//在规定的位置上下棋
{
setfillcolor(WHITE);
fillcircle(x*30,y*30,10);
chess[x][y] = 2;
}
}
flag = !flag;
chessboard[x][y] = 1;//标记已经下过的位置
// 按 ESC 键退出程序
if(m.message==WM_KEYDOWN)
{
if (m.vkcode == VK_ESCAPE)
return;
}
}
}