分模块实现程序
设置棋盘,下棋过程,判断输赢
其中难点问题:棋盘的画法,下棋过程中的落子问题,五子连珠的判断问题,游戏情景的营造问题,其中落子问题是最困难的,需要寻找鼠标点击在屏幕上的坐标消息
#include<stdio.h>
#include<windows.h>
#include<easyx.h>
//#include<graphics.h>
#include<MMSystem.h>
#pragma comment(lib,"winmm.lib")
#include<math.h>
#include<iostream>
using namespace std;
#define WIDE 30//每条线条间隔
#define SPACE (3*WIDE)
# define ROW 15
# define COL 15
void BeforeGame();
void playChess();
//void mousePressMsg(ExMessage m );
int judge(int a,int b);
int flag=0;
int board[15][15]={0};
int x=0,y=0;
int a=0,b=0;
void BeforeGame()
{
initgraph(600, 800);
cleardevice();
settextcolor(GREEN); //设置文字颜色
setbkmode(TRANSPARENT); //设置窗口透明
settextstyle(128, 0, "宋体"); //设置字体大小、宽度、字体
outtextxy(100, 100, "五子棋");
setlinecolor(GREEN);
rectangle(150, 300, 450, 650);
rectangle(160, 310, 440, 640);
line(160, 420, 440, 420);
line(160, 530, 440, 530);
settextstyle(65, 0, "华文琥珀");
outtextxy(170, 340, "人机大战");
outtextxy(170, 450, "双人对战");
outtextxy(170, 560, "联系作者");
setlinecolor(WHITE);
settextcolor(WHITE);
settextstyle(23, 0, "华文琥珀");
outtextxy(527, 37, "音乐");
circle(550, 50, 25);
Sleep(800);
}
void initGame()
{
initgraph(650,650);//创建窗口
/*setbkcolor(LIGHTCYAN);
cleardevice();*/
loadimage(NULL,"bk.jpg");//加载图片
mciSendString("open 前奏.mp3 ",0,0,0);
mciSendString("play 前奏.mp3",0,0,0);
setlinecolor(BLACK);
for(int i=0;i<15;i++)
{line(SPACE,i*WIDE+SPACE,14*WIDE+SPACE,i*WIDE+SPACE);//画横线
line(i*WIDE+SPACE,SPACE,i*WIDE+SPACE,14*WIDE+SPACE);//画竖线
}
//外边框(增粗)
setlinestyle(PS_SOLID,2);
rectangle(SPACE,SPACE,14*WIDE+SPACE,14*WIDE+SPACE);
//画点
setfillcolor(BLACK);
solidcircle(SPACE+7*WIDE,SPACE+7*WIDE,7);//正中间
solidcircle(SPACE+(7-4)*WIDE,SPACE+(7-4)*WIDE,7);//左上
solidcircle(SPACE+(7-4)*WIDE,SPACE+(7+4)*WIDE,7);//左下
solidcircle(SPACE+(7+4)*WIDE,SPACE+(7-4)*WIDE,7);//右上
solidcircle(SPACE+(7+4)*WIDE,SPACE+(7+4)*WIDE,7);//右下
outtextxy(540,250,"玩家1:黑棋");
outtextxy(540,400,"玩家2:白棋");
}
//下棋
void playChess()
{
ExMessage m;//ExMessage这个结构体用于保存消息,定义一个变量m, m.x,m.y鼠标当前坐标,m.message m的消息
while(1)
{
m=getmessage(EM_MOUSE);
if(m.message==WM_LBUTTONDOWN)
{
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
if(abs(m.x-(i*WIDE+SPACE))<15&&abs(m.y-(j*WIDE+SPACE))<15)
{
x=i*WIDE+SPACE;
y=j*WIDE+SPACE;
a=i;
b=j;
}
}
}
//重叠
if(board[a][b]!=0)
{
MessageBox(NULL,"这里已有棋子 请重新选择","提示",MB_OK);//MessageBox (句柄, 显示内容,标题,MB_OK) 界面显示函数
continue;//退出循环重新进入
}
if(flag%2==0)
{
setfillcolor(BLACK);
solidcircle(x,y,12);
board[a][b]=1;
flag++;
}
else
{
setfillcolor(WHITE);
solidcircle(x,y,12);
board[a][b]=2;
flag++;
}
if(judge(a,b))
{
if(flag%2==0)
{
mciSendString("open 结束1.mp3 ",0,0,0) ;
mciSendString("play 结束1.mp3",0,0,0);
MessageBox(NULL,"玩家2胜利","游戏结束",MB_OK);
exit(0);
}
if(flag==224)
{
MessageBox(NULL,"平局","游戏结束",MB_OK);
}
else
{
mciSendString("open 结束2.mp3 ",0,0,0);
mciSendString("play 结束2.mp3",0,0,0);
MessageBox(NULL,"玩家1胜利","游戏结束",MB_OK);
exit(0);
}
}
}
}
}
//判断输赢
int judge(int a,int b)
{
int i,j;
int t=2-flag%2;
for(i=a-4,j=b;i<=a;i++)//横向五子连珠
{
if(i>=0&&i<11&&t==board[i][j]&&t==board[i+1][j]&&t==board[i+2][j]&&t==board[i+3][j]&&t==board[i+4][j])
return 1;
}
for(i=a,j=b-4;j<=b;j++)//纵向五子连珠
{
if(j>=0&&j<11&&t==board[i][j]&&t==board[i][j+1]&&t==board[i][j+2]&&t==board[i][j+3]&&t==board[i][j+4])
return 1;
}
for(i=a-4,j=b-4;i<=a,j<=b;i++,j++)//左上到右下五子连珠
{
if(i>=0&&i<11&&j>=0&&j<11&&t==board[i][j]&&t==board[i+1][j+1]&&t==board[i+2][j+2]&&t==board[i+3][j+3]&&t==board[i+4][j+4])
return 1;
}
for(i=a-4,j=b+4;i<=a,j>=b;i++,j--)//左下到右上五子连珠
{
if(i>=0&&i<11&&j>=0&&j<11&&t==board[i][j]&&t==board[i+1][j-1]&&t==board[i+2][j-2]&&t==board[i+3][j-3]&&t==board[i+4][j-4])
return 1;
}
return 0;
}
int main()
{
BeforeGame();
initGame();
playChess();
system("pause");
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/9c2238716050d7107c792b39536153c3.png)