常量
local CHESSMAN_TYPE = {
EMPTY = 0,
BLACK = -1,
WHITE = 1,
}
local PLAY_TYPE ={
MAN = -1,
AI = 1,
}
local GAMESTATUS = {
PLAYING = 1,
WIN = 2,
DEAD = 3,
}
local BoardSizeNum = 15
初始化界面
image.png
初始化棋盘数据
image.png
AI的下棋的函数
function GameGobangScene:actionByAI(row, col)
self.playerFlag = PLAY_TYPE.AI
self:calcuateScore()
local maxScore = 0
local maxPoints = {}
for row = 1, BoardSizeNum do
for col = 1, BoardSizeNum do
if self.gameMap[row][col] == 0 then
if self.scoreMap[row][col] > maxScore then
maxPoints = {}
maxScore = self.scoreMap[row][col]
local t = {row , col}
table.insert(maxPoints, t)
elseif self.scoreMap[row][col] == maxScore then
local t = {row , col}
table.insert(maxPoints, t)
end
end
end
end
math.randomseed(os.time())
local index = math.random(#maxPoints)
local aiRow = maxPoints[index][1]
local aiCol = maxPoints[index][2]
local randTime = math.random()
self:performWithDelay(function ()
local posX = self.minX + (self.gap * (aiRow - 1))
local posY = self.minY + (self.gap * (aiCol - 1))
self.gameMap[aiRow][aiCol] = CHESSMAN_TYPE.WHITE
self:createChessMan(CHESSMAN_TYPE.WHITE, posX, posY)
printInfo("GameGobangScene:actionByAI 白字棋子在棋盘 ===========> "..aiRow .. " , ".. aiCol)
self:showGameMapData()
self:performWithDelay(function ()
self.playerFlag = PLAY_TYPE.MAN
if self:isWin(aiRow, aiCol, CHESSMAN_TYPE.WHITE) then
self:gameOver()
end
if self:isDeadGame() then
self:gameOver()
end
end, 0.2)
-- body
end, randTime)
end
AI的评分函数,通过评分来确定下子
关于ai方面的代码 引用
function GameGobangScene:calcuateScore()
local personNum = 0
local botNum = 0
local emptyNum = 0
self.scoreMap = {}
for i = 1, BoardSizeNum, 1 do
local lineScore = {}
for j = 1, BoardSizeNum, 1 do
table.insert(lineScore, 0)
end
self.scoreMap[i] = lineScore
end
for row = 1, BoardSizeNum do
for col = 1, BoardSizeNum do
if row > 1 and col > 1 and self.gameMap[row][col] == 0 then
for y = -1, 1 do
for x = -1, 1 do
personNum = 0
botNum = 0
emptyNum = 0
if not (y == 0 and x == 0) then
for i = 1, 4 do
if row + i * y > 0 and row + i * y < BoardSizeNum and
col + i * x > 0 and col + i * x < BoardSizeNum and
self.gameMap[row + i * y][col + i * x] == -1 then
personNum = personNum + 1
elseif row + i * y > 0 and row + i * y < BoardSizeNum and
col + i * x > 0 and col + i * x <BoardSizeNum and
self.gameMap[row + i * y][col + i * x] == 0 then
emptyNum = emptyNum + 1
break
else
break
end
end
for i = 1, 4 do
if row - i * y > 0 and row - i * y < BoardSizeNum and
col - i * x > 0 and col - i * x < BoardSizeNum and
self.gameMap[row - i * y][col - i * x ] == -1 then
personNum = personNum + 1
elseif row - i * y > 0 and row - i * y < BoardSizeNum and
col - i * x > 0 and col - i * x < BoardSizeNum and
self.gameMap[row - i * y][col - i * x] == CHESSMAN_TYPE.EMPTY then
emptyNum = emptyNum + 1
break
else
break
end
end
if personNum == 1 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 10
elseif personNum == 2 then
if emptyNum == 1 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 30
elseif emptyNum == 2 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 40
end
elseif personNum == 3 then
if emptyNum == 1 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 60
elseif emptyNum == 2 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 110
end
elseif personNum == 4 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 10100;
end
emptyNum = 0
-- 对ai评分
for i = 1, 4 do
if row + i * y > 0 and row + i * y < BoardSizeNum and
col + i * x > 0 and col + i * x < BoardSizeNum and
self.gameMap[row + i * y][col + i * x] == 1 then
botNum = botNum + 1
elseif row + i * y > 0 and row + i * y < BoardSizeNum and
col + i * x > 0 and col + i * x < BoardSizeNum and
self.gameMap[row + i * y][col + i * x] == 0 then
emptyNum = emptyNum + 1
break
else
break
end
end
for i = 1, 4 do
if row - i * y > 0 and row - i * y < BoardSizeNum and
col - i * x > 0 and col - i * x < BoardSizeNum and
self.gameMap[row - i * y][col - i * x] == 1 then -- Ai的子
botNum = botNum + 1
elseif row - i * y > 0 and row - i * y < BoardSizeNum and
col - i * x > 0 and col - i * x < BoardSizeNum and
self.gameMap[row - i * y][col - i * x] == 0 then
emptyNum = emptyNum + 1
break
else
break
end
end
if botNum == 0 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 5
elseif botNum == 1 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 10
elseif botNum == 2 then
if emptyNum == 1 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 25
elseif emptyNum == 2 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 50
end
elseif botNum == 3 then
if emptyNum == 1 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 55
elseif emptyNum == 2 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 100
end
elseif botNum >= 4 then
self.scoreMap[row][col] = self.scoreMap[row][col] + 10050
end
end
end
end
end
end
end
end
结算函数
function GameGobangScene:isWin(row, col, chessType)
-- Todo 计算是否胜利 判断黑方 白方的棋子成功连成一片
local i = row
local j = col
local count = 0
--[[ 判断水平方向 ]]
while i > 0 and self.gameMap[i][j] == chessType do
i = i - 1
count = count + 1
end
i = row + 1
while i <= 15 and self.gameMap[i][j] == chessType do
i = i + 1
count = count + 1
end
if count >= 5 then
return true
end
--[[ 判断竖直方向 ]]
i = row
count = 0
while j > 0 and self.gameMap[i][j] == chessType do
j = j - 1
count = count + 1
end
j = col + 1
while j <= 15 and self.gameMap[i][j] == chessType do
j = j + 1
count = count + 1
end
if count >= 5 then
return true
end
--[[ 判断左上右下方向 ]]
j = col
count = 0
while i > 0 and j > 0 and self.gameMap[i][j] == chessType do
i = i - 1
j = j - 1
count = count + 1
end
i = row + 1
j = col + 1
while j <= 15 and i <= 15 and self.gameMap[i][j] == chessType do
i = i + 1
j = j + 1
count = count + 1
end
if count >= 5 then
return true
end
--[[ 判断右上左下方向 ]]
i = row
j = col
count = 0
while i <= 15 and j > 0 and self.gameMap[i][j] == chessType do
i = i + 1
j = j - 1
count = count + 1
end
i = row - 1
j = col + 1
while i > 0 and j <= 15 and self.gameMap[i][j] == chessType do
i = i - 1
j = j + 1
count = count + 1
end
if count >= 5 then
return true
end
return false
end
触摸检测
function GameGobangScene:onTouchBegan(event)
-- Todo 要判断 棋子归属于那一个点,生成棋子
self.startX = event.x
self.startY = event.y
local x = self.startX
local y = self.startY
if self.gameStatus ~= GAMESTATUS.PLAYING then
return
end
if x >= self.minX and x <= self.maxX and y >= self.minY and y <= self.maxY and self.playerFlag == PLAY_TYPE.MAN then
printInfo("GameGobangScene:onTouchBegan begin --- pos(x = %d, y = %d )",self.startX, self.startY)
local mx = (x - self.minX) / self.gap
local row = math.round(mx) + 1
if mx - row > 0.4 then
row = row + 1
end
local my = (y - self.minY) / self.gap
local col = math.round(my) + 1
if my - col > 0.4 then
col = col +1
end
printInfo("GameGobangScene:onTouchBegan 黑子棋子在棋盘 ===========> "..row .. " , ".. col);
local posX = self.minX + (self.gap * (row - 1))
local posY = self.minY + (self.gap * (col - 1))
if self.gameMap[row][col] == CHESSMAN_TYPE.EMPTY then
if self.playerFlag == PLAY_TYPE.MAN then
self.gameMap[row][col] = CHESSMAN_TYPE.BLACK
self:createChessMan(CHESSMAN_TYPE.BLACK, posX, posY)
end
self:actionByAI(row, col)
if self:isWin(row, col, CHESSMAN_TYPE.BLACK) then
self.score = self.score + 100
self.textScoreInScoreNode:setString("当前分数:"..self.score)
self:gameOver()
elseif self:isDeadGame() then
self.score = 0
self:gameOver()
end
end
end
end
网友评论