#include <utility>
#include <time.h>
#include<QTime>
#include "GameModel.h"
GameModel::GameModel()
{
}
void GameModel::startGame(GameType type)
{
gameType = type;
// 初始棋盘
gameMapVec.clear();
for (int i = 0; i < kBoardSizeNum; i++)
{
std::vector<int> lineBoard;
for (int j = 0; j < kBoardSizeNum; j++)
lineBoard.push_back(0);
gameMapVec.push_back(lineBoard);
}
// 如果是AI模式,需要初始化评分数组
if (gameType == BOT)
{
scoreMapVec.clear();
for (int i = 0; i < kBoardSizeNum; i++)
{
std::vector<int> lineScores;
for (int j = 0; j < kBoardSizeNum; j++)
lineScores.push_back(0);
scoreMapVec.push_back(lineScores);
}
}
// 己方下为true,对方下位false
playerFlag = true;
}
void GameModel::updateGameMap(int row, int col)
{
if (playerFlag)
gameMapVec[row][col] = WHITECHESS;
else
gameMapVec[row][col] = BLACKCHESS;
// 换手
playerFlag = !playerFlag;
}
void GameModel::actionByPerson(int row, int col)
{
updateGameMap(row, col);
}
void GameModel::actionByAI(int &clickRow, int &clickCol)
{
// 计算评分
calculateScore();
// 从评分中找出最大分数的位置
int maxScore = 0;
std::vector<std::pair<int, int>> maxPoints;
for (int row = 1; row < kBoardSizeNum; row++)
for (int col = 1; col < kBoardSizeNum; col++)
{
// 前提是这个坐标是空的
if (gameMapVec[row][col] == 0)
{
if (scoreMapVec[row][col] > maxScore) // 找最大的数和坐标
{
maxPoints.clear();
maxScore = scoreMapVec[row][col];
maxPoints.push_back(std::make_pair(row, col));
}
else if (scoreMapVec[row][col] == maxScore) // 如果有多个最大的数,都存起来
maxPoints.push_back(std::make_pair(row, col));
}
}
// 随机落子,如果有多个点的话
srand((unsigned)time(0));
int index = rand() % maxPoints.size();
std::pair<int, int> pointPair = maxPoints.at(index);
clickRow = pointPair.first; // 记录落子点
clickCol = pointPair.second;
updateGameMap(clickRow, clickCol);
}
// 最关键的计算评分函数
void GameModel::calculateScore()
{
// 统计玩家或者电脑连成的子
int personNum = 0; // 玩家连成子的个数
int botNum = 0; // AI连成子的个数
int emptyNum = 0; // 各方向空白位的个数
// 清空评分数组
scoreMapVec.clear();
for (int i = 0; i < kBoardSizeNum; i++)
{
std::vector<int> lineScores;
for (int j = 0; j < kBoardSizeNum; j++)
lineScores.push_back(0);
scoreMapVec.push_back(lineScores);
}
// 计分(此处是完全遍历,其实可以用bfs或者dfs加减枝降低复杂度,通过调整权重值,调整AI智能程度以及攻守风格)
for (int row = 0; row < kBoardSizeNum; row++)
for (int col = 0; col < kBoardSizeNum; col++)
{
// 空白点就算
if (row > 0 && col > 0 &&
gameMapVec[row][col] == 0)
{
// 遍历周围八个方向
for (int y = -1; y <= 1; y++)////////////////////////////////
for (int x = -1; x <= 1; x++)////////////////////////////////
{
// 重置
personNum = 0;
botNum = 0;
emptyNum = 0;
// 原坐标不算
if (!(y == 0 && x == 0))
{
// 每个方向延伸4个子
// 对玩家白子评分(正反两个方向)
for (int i = 1; i <= 4; i++)
{
if (row + i * y > 0 && row + i * y < kBoardSizeNum &&
col + i * x > 0 && col + i * x < kBoardSizeNum &&
gameMapVec[row + i * y][col + i * x] == WHITECHESS) // 玩家的子/********************/
{
personNum++;
}
else if (row + i * y > 0 && row + i * y < kBoardSizeNum &&
col + i * x > 0 && col + i * x < kBoardSizeNum &&
gameMapVec[row + i * y][col + i * x] == 0) // 空白位
{
emptyNum++;
break;
}
else // 出边界
break;
}
for (int i = 1; i <= 4; i++)
{
if (row - i * y > 0 && row - i * y < kBoardSizeNum &&
col - i * x > 0 && col - i * x < kBoardSizeNum &&
gameMapVec[row - i * y][col - i * x] == WHITECHESS) // 玩家的子/********************/
{
personNum++;
}
else if (row - i * y > 0 && row - i * y < kBoardSizeNum &&
col - i * x > 0 && col - i * x < kBoardSizeNum &&
gameMapVec[row - i * y][col - i * x] == 0) // 空白位
{
emptyNum++;
break;
}
else // 出边界
break;
}
if (personNum == 1) // 杀二
scoreMapVec[row][col] += 10;
else if (personNum == 2) // 杀三
{
if (emptyNum == 1)
scoreMapVec[row][col] += 30;
else if (emptyNum == 2)
scoreMapVec[row][col] += 40;
}
else if (personNum == 3) // 杀四
{
// 量变空位不一样,优先级不一样
if (emptyNum == 1)
scoreMapVec[row][col] += 60;
else if (emptyNum == 2)
scoreMapVec[row][col] += 110;
}
else if (personNum == 4) // 杀五
scoreMapVec[row][col] += 10100;
// 进行一次清空
emptyNum = 0;
// 对AI黑子评分
for (int i = 1; i <= 4; i++)
{
if (row + i * y > 0 && row + i * y < kBoardSizeNum &&
col + i * x > 0 && col + i * x < kBoardSizeNum &&
gameMapVec[row + i * y][col + i * x] == WHITECHESS) // 玩家的子/********************/
{
没有合适的资源?快使用搜索试试~ 我知道了~
Qt五子棋程序源码
共93个文件
sample:9个
master:4个
head:4个
5星 · 超过95%的资源 需积分: 50 44 下载量 73 浏览量
2018-11-08
12:32:59
上传
评论 5
收藏 264KB ZIP 举报
温馨提示
亲测通过,这是一个单机人机、人人版本的五子棋源码程序。我的文章参考:https://blog.csdn.net/u013457167/article/details/83859312,
资源推荐
资源详情
资源评论
收起资源包目录
Qwuziqi.zip (93个子文件)
GameModel.h 1KB
pic
wuziqi.gif 75KB
res
sound
chessone.wav 2KB
lose.wav 8KB
win.wav 11KB
QtWuziqi.pro.user 23KB
.git
index 1KB
hooks
pre-push.sample 1KB
prepare-commit-msg.sample 1KB
applypatch-msg.sample 452B
pre-commit.sample 2KB
pre-applypatch.sample 398B
commit-msg.sample 896B
pre-rebase.sample 5KB
update.sample 4KB
post-update.sample 189B
config 331B
description 73B
refs
tags
heads
master 41B
remotes
origin
master 41B
HEAD 32B
branches
logs
refs
heads
master 1KB
remotes
origin
master 876B
HEAD 185B
HEAD 1KB
packed-refs 107B
objects
75
5816bb3e7d53c8c1d2eac9d5066a5643a3109b 6KB
fd
7b0f5d0b8a56f3e9b219329f2d9bb01ef73a35 235B
7f
73e863d1a99c52f4e908efd48b8a030842ab90 3KB
5e
2494c13c217d98db22768a2cf1037009c51027 732B
c63531a83e04b33ec61667a62a0e949ddf16a0 233B
90
a1de9c5425a71375cd344fd6dd6fc31049a4c7 2KB
ec
c4b2068339a8e8c8d551eebb09c8966c77b9e4 71KB
eb
5c43eddbe58e70bbf15e2c0f9d5e61144b30ef 115B
64
8ce63f81a501fb30ffefd8be5539e194ed056f 153B
c8
23fa3a62c33c19aa21c21e67ecf873f37c4160 153B
419c8b296daf40538b06172e2d5c5f8b83b937 153B
bb
b2289a659e54babaa4fb847899d44d4f61b099 55B
5c
0bfaae17477e9c9a6cf964bf88e35bc65c73b6 249B
a2
f6f3061b29882a86bee12358ceadd0595f8d29 267B
a8
7e8296d2da5756d4be6548b726f9f96a8cf96e 3KB
ca
57379edfe249838b5ae469861a4847e6d0f0f6 1KB
c0
d41919b3d7faf69f1e3bc4282f244c62c54448 3KB
a6
1e94fd3572440cb5914087696633983bf4d6b1 3KB
89
4e9382221ee4b4e99d4ff477212a5090069b0f 660B
15
d8a4bfcd3b3f785196169e018c0a988132f528 154B
b631d691d1e5af07accfcfe0384b6c90396176 267B
82
fac6634ebe747d9ab815f0dd710defcfe91bcc 952B
d7
40eaa83934b4bf0a6a2cc2600facf8fa550e83 154B
69
ee5e24c2ef256a9ecb1ee89392930e29799165 2KB
252dfe9963e11129e86fba368f34ce55243e7c 47B
2a
64d8334c77138eab467e1fff7a522cd1770c62 2KB
40
7ec66b38e31fe4be4271d7bc81dac255d38d2a 505B
ea
d895c48ae74b931dec62cac3d38566fe5725cf 104B
info
f0
df28958b0615f918f48fbbca9846416905e7d8 156B
ad
8bcb3909c3063d112bc1bccc0f4c8760779d5a 331B
57
e97cbea47d0ae4459b29d77d1bc1cd05a707c1 333B
2e
958c4a9c0990c0393ec75ac0a5d41031317511 260B
85
444548eaba9eafbd954e307838b41cad2cece4 698B
8c
d3e003918f5e6319eb734b88c1b6050b436072 485B
d8
1d475fe6bf3269ed7b460072dd636d0b68c472 2KB
pack
ae
6a2ae6bf89abd99968e4450e2c1842a2f57366 494B
1c
d4a41d13bad10f64612a0dc001c0690c8f7184 360B
4e
ac548dd55b852c4a6d1e0eb5f4d80248dbe654 492B
18
151dd08d8682aef10d421cf3d60dcc05f7b121 3KB
16
69499ceb4048b28ff8218c2b7e3cd1ae11e850 2KB
da
b3fb4b42816aa99577dcf65e3b30ef8fcb9138 10KB
e741328538b3b7fe4afbd8ce91bda64f9a1925 125B
9b
357bafa6703207e7b1ecaa089bd1781d001191 1KB
19
6a4911e824da9d93088def66e6dbca8dfb140c 3KB
5dd4d86843c8494f9c35a591ac104500697260 3KB
62
ba153b61e621393c3f133bd2865eedbf7d7d0d 523B
b5
845528be807933d31615aabf2e1b9de33fc836 866B
2f
5b5a8f4056bc48724ebfd65980510727ec1b2e 267B
7d
69fd7c6add013808414bafd4bda16e24d55000 671B
b1
1bfb27b69dc92cdd5f78e679d5eb0e3279a4be 540B
09
80cba43ccc0d01ad5809834bdd712c88939e89 3KB
28
10e5a21fd44044388274e705670daa275978c3 1KB
e7f817411001ade9ce6491ff1bce402909a48f 229B
3b
267070980e2ac3e64f594ff546b18c52cdba3e 413B
32
1149bd5a5b7eec8f0d8e33d440c8bf250a8dbe 153B
b4
8f94ec827033ef073fb3c7f060837e90b935ec 141B
info
exclude 240B
COMMIT_EDITMSG 7B
HEAD 23B
FETCH_HEAD 99B
resource.qrc 187B
GameModel.cpp 13KB
QtWuziqi.pro.user.861cae8 24KB
main.cpp 183B
QtWuziqi.pro 439B
mainwindow.cpp 9KB
mainwindow.h 874B
共 93 条
- 1
资源评论
- cibiren20112024-02-02资源很好,再Qt4 mingw 编译,需要注意 error: ‘>>‘ should be ‘> >‘ within a nested template argument list 嵌套模板的>> 要写成 > > ,就可以编译通过,很适合初学者。
wsqyouth
- 粉丝: 598
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功