昨日已经创建好了棋盘游戏棋盘,今天写一写如何落子,和输赢的判别。
1.落子:
? ? ? ?这里用到了图形库中的结构体MOUSEMSG,他的具体作用是保存一个鼠标信息,判断鼠标是否点下,并保存他的坐标。具体的点击坐标与二维数组之间的关系可根据自己创建的棋盘计算,我这里用到的是500*500的棋盘,横纵均为20的二维数组。
这里信息量有点大,我直接将落子和最后输赢的输出写在了同一个函数当中,代码的大概思路是:
(1)用结构体变量保存鼠标点击的坐标,我们划定一个12*12的矩形当点击这个区域的时候均认为点击的是一个区域内黑线相交的点,接下来判断鼠标左键是否按下即(m.uMsg == WM_LBUTTONDOWN)若点击的位置超出棋盘或者该点已有棋子(二维数组的对应值不为零)则对用户进行提示,如果在棋盘区域内且没有落子,则利用库函数solidcircle(x,y,10)画一个棋子,这个函数也比较容易理解,那便是以x,y为圆心画一个半径为10的圆,为了使颜色出现黑白双色,我们需要 定义一个flag变量进行记数操作,当flag的值变化的时候我们利用setfillcolor函数对改圆圈填充另一种颜色。
//对局
void playChess()
{
int x = 0, y = 0;
int a = 0, b = 0;
MOUSEMSG m;//存放鼠标信息
HWND hwnd = GetHWnd();
loadimage(&back, "悔棋.jpg");//悔棋背景
while (1)
{
m = GetMouseMsg();//获取一个鼠标消息
for (int i = 1; i < 20; i++)
{
for (int j = 1; j < 20; j++)
{
if (abs(m.x - i * 25) < 12 && abs(m.y - j * 25) < 12)
{
x = i * 25;
y = j * 25;
a = i;
b = j;
}
}
}
if (m.uMsg == WM_LBUTTONDOWN)
{
if (m.x >= 520 && m.x <= 570 && m.y>=190 && m.y <= 230)
{
BackChess(m.x,m.y);
}
else if (m.x > 500 || m.y > 500 || x < 0 || y < 0)
MessageBox(NULL, "请在棋盘中落子!","温馨提示",MB_OK);
else if (board[a][b] != 0)
{
outtextxy(0, 565, "这里已经有棋子了,请重新选择");
continue;
}
else if (flag % 2 == 0)
{
setfillcolor(BLACK);//当flag为偶数,下黑棋,否则下白棋
solidcircle(x, y, 10);//画一个圆圈包含于图形库
board[a][b] = 1;
}
else
{
setfillcolor(WHITE);
solidcircle(x, y, 10);//获取鼠标点击位置
board[a][b] = 2;
}
loadimage(&img, "背景7.jpg");
putimage(0, 565, 225,17, &img, 0, 0);
flag++;
}
if (judge(a, b))
{
if (flag % 2 == 0)
{
MessageBox(hwnd, "玩家2获胜", "游戏结束", MB_OK);
system("cls");
Newgame();
}
else
{
MessageBox(hwnd, "玩家1获胜", "游戏结束", MB_OK);
system("cls");
Newgame();
}
}
2.输赢算法判断:
? ? ? ?横着方向遍历一遍二维数组,看是否有五个1相连,或者五个2相连,再纵向遍历一遍棋盘,若有则证明有一方赢,结束程序,具体代码实现如下,没有太大难度,只是两个for循环遍历数组而已。
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 >= 1 && i < 16 && 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 >= 1 && j < 16 && 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; j <= b, i <= a; i++, j++)
{
if (i >= 1 && i < 16 && j >= 0 && j < 16 && 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; j >= 1, i <= a; i++, j--)
{
if (i >= 1 && i < 16 && j >= 0 && j < 16 && 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;
}
|