#include <graphics.h>
#include <conio.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")//多媒体库文件
/*
1.绘制窗口
2.背景图片
3.背景音乐
4.棋盘(划线)
5.判断输赢
*/
int jugdewin(int a,int b);
int flag=0;//判断当前下棋的是黑子还是白子
int board[21][21];
//绘制窗口
void initGame()
{
//设置窗口大小
initgraph(568,550);
//加载背景图片,要放在.c文件下
loadimage(NULL,"2.jpg");
/*
IMAGE img;
loadimage(&img,"2.jpg",300,250);//设置图片大小
putimage(100,100,&img);//设置图片放置的坐标
*/
mciSendString("open 庐州月.mp3",0,0,0);//打开音乐文件
mciSendString("play 庐州月.mp3",0,0,0);//播放音乐文件
//绘制棋盘
setlinestyle(PS_SOLID,2);//线条加粗
setlinecolor(BLACK);//设置线条颜色
for(int i=1;i<=20;i++)//棋盘划线
{
line(i*20,0,i*20,400);
line(0,i*20,400,i*20);
}
setbkmode(0);//使字样的背景颜色透明,显示北京颜色
settextcolor(BLACK);
outtextxy(450,120,"玩家1:黑棋");
outtextxy(450,170,"玩家2:白棋");//文本输出字样
}
//判断输赢
int jugdewin(int a,int b)
{
int i,j;
for(i=a-4,j=b;i<=a;i++)
{
if(i>=1&&board[i][j]==1&&board[i+1][j]==1&&board[i+2][j]==1&&board[i+3][j]==1&&board[i+4][j]==1)
{
return 1;
}
else if(i>=1&&board[i][j]==2&&board[i+1][j]==2&&board[i+2][j]==2&&board[i+3][j]==2&&board[i+4][j]==2)
{
return 2;
}
}//横
for(j=b-4,i=a;j<=b;j++)
{
if(j>=1&&board[i][j]==1&&board[i][j+1]==1&&board[i][j+2]==1&&board[i][j+3]==1&&board[i][j+4]==1)
{
return 1;
}
else if(j>=1&&board[i][j]==2&&board[i][j+1]==2&&board[i][j+2]==2&&board[i][j+3]==2&&board[i][j+4]==2)
{
return 2;
}
}//竖
for(i=a-4,j=b-4;i<=a;i++,j++)
{
if(j>=1&&i>=1&&board[i][j]==1&&board[i+1][j+1]==1&&board[i+2][j+2]==1&&board[i+3][j+3]==1&&board[i+4][j+4]==1)
{
return 1;
}
else if(j>=1&&i>=1&&board[i][j]==2&&board[i+1][j+1]==2&&board[i+2][j+2]==2&&board[i+3][j+3]==2&&board[i+4][j+4]==2)
{
return 2;
}
}//左斜
for(i=a-4,j=b+4;i<=a;i++,j--)
{
if(j>=1&&i>=1&&board[i][j]==1&&board[i+1][j-1]==1&&board[i+2][j-2]==1&&board[i+3][j-3]==1&&board[i+4][j-4]==1)
{
return 1;
}
else if(j>=1&&i>=1&&board[i][j]==2&&board[i+1][j-1]==2&&board[i+2][j-2]==2&&board[i+3][j-3]==2&&board[i+4][j-4]==2)
{
return 2;
}
}//右斜
return 0;
}
//下棋
void playChess()
{
MOUSEMSG m;
HWND hwnd;//窗口句柄
hwnd=GetHWnd();//窗口置前
while(1)
{
m=GetMouseMsg();//获取鼠标消息
int a;
int b;
int x;
int y;
for(int i=1;i<=20;i++)
{
for(int j=1;j<=20;j++)
{
if(abs(m.x-i*20)<10&&abs(m.y-j*20)<10)
{
a=i;
b=j;//存进board
x=i*20;
y=j*20;//坐标
}
}
}
if(m.uMsg==WM_LBUTTONDOWN)//判断当前是否是鼠标左键按下
{
if(board[a][b]!=0)
{
MessageBox(hwnd,"这里已经有棋子,请重新选择下棋位置","五子棋",MB_OK);//弹出提示窗口,有确定按键
continue;
}
if(flag%2==0)
{
setfillcolor(BLACK);//为棋子填充黑色
solidcircle(x,y,5);//画棋子
board[a][b]=1;
}
else
{
setfillcolor(WHITE);//为棋子填充白色
solidcircle(x,y,5);//画棋子
board[a][b]=2;
}
flag++;
}
if(jugdewin(a,b)==1)
{
MessageBox(hwnd,"游戏结束!黑方胜利!","五子棋",MB_OK);
break;
}
else if(jugdewin(a,b)==2)
{
MessageBox(hwnd,"游戏结束!白方胜利!","五子棋",MB_OK);
break;
}
}
}
int main()
{
initGame();
playChess();
getch();
return 0;
}