This repository was archived by the owner on Jun 26, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgamemodel.cpp
113 lines (105 loc) · 2.89 KB
/
gamemodel.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "gamemodel.h"
bool gamemodel::isWin(int row, int col)
{
// 横竖斜四种大情况,每种情况都根据当前落子往后遍历5个棋子,有一种符合就算赢
// 水平方向
for (int i = 0; i < 5; i++)
{
// 左右延申4个
if (col - i >= 0 &&
col - i + 4 < kBoardSizeNum &&
gameMapVec[row][col - i] == gameMapVec[row][col - i + 1] &&
gameMapVec[row][col - i] == gameMapVec[row][col - i + 2] &&
gameMapVec[row][col - i] == gameMapVec[row][col - i + 3] &&
gameMapVec[row][col - i] == gameMapVec[row][col - i + 4])
return true;
}
// 竖直方向(上下延伸4个)
for (int i = 0; i < 5; i++)
{
if (row - i >= 0 &&
row - i + 4 < kBoardSizeNum &&
gameMapVec[row - i][col] == gameMapVec[row - i + 1][col] &&
gameMapVec[row - i][col] == gameMapVec[row - i + 2][col] &&
gameMapVec[row - i][col] == gameMapVec[row - i + 3][col] &&
gameMapVec[row - i][col] == gameMapVec[row - i + 4][col])
return true;
}
// 左斜方向
for (int i = 0; i < 5; i++)
{
if (row + i < kBoardSizeNum &&
row + i - 4 >= 0 &&
col - i >= 0 &&
col - i + 4 < kBoardSizeNum &&
gameMapVec[row + i][col - i] == gameMapVec[row + i - 1][col - i + 1] &&
gameMapVec[row + i][col - i] == gameMapVec[row + i - 2][col - i + 2] &&
gameMapVec[row + i][col - i] == gameMapVec[row + i - 3][col - i + 3] &&
gameMapVec[row + i][col - i] == gameMapVec[row + i - 4][col - i + 4])
return true;
}
// 右斜方向
for (int i = 0; i < 5; i++)
{
if (row - i >= 0 &&
row - i + 4 < kBoardSizeNum &&
col - i >= 0 &&
col - i + 4 < kBoardSizeNum &&
gameMapVec[row - i][col - i] == gameMapVec[row - i + 1][col - i + 1] &&
gameMapVec[row - i][col - i] == gameMapVec[row - i + 2][col - i + 2] &&
gameMapVec[row - i][col - i] == gameMapVec[row - i + 3][col - i + 3] &&
gameMapVec[row - i][col - i] == gameMapVec[row - i + 4][col - i + 4])
return true;
}
return false;
}
bool gamemodel::isDeadGame()
{
// 所有空格全部填满
for (int i = 0; i < kBoardSizeNum; i++)
for (int j = 0; j < kBoardSizeNum; j++)
{
if (!(gameMapVec[i][j] == 1 || gameMapVec[i][j] == -1))
return false;
}
return true;
}
void gamemodel::startGame()
{
// 初始棋盘
gameMapVec.clear();
for (int i = 0; i < kBoardSizeNum; i++)
{
std::vector<int> lineBoard;
lineBoard.reserve(kBoardSizeNum);
for (int j = 0; j < kBoardSizeNum; j++)
lineBoard.push_back(0);
gameMapVec.push_back(lineBoard);
}
// 黑方下为true,白方下为false
playerFlag = true;
}
void gamemodel::updateGameMap(int row, int col)
{
if (playerFlag)
gameMapVec[row][col] = 1;
else
gameMapVec[row][col] = -1;
// 换手
playerFlag = !playerFlag;
}
int gamemodel::action(int row, int col)
{
if (playerFlag)
{
gameMapVec[row][col] = 1;
int check = forbid::check(gameMapVec, row, col);
if (check != 0)
{
gameMapVec[row][col] = 0;
return check;
}
}
updateGameMap(row, col);
return 0;
}