昨天我們介紹了一些julia標準輸出的指令。今天我們要來介紹julia的標準輸入,並實作2048的主程式迴圈。
readline()是julia最常用到的標準輸入指令。readline()這個函式會傳回使用者輸入的字串。
我們直接用2048遊戲的使用者輸入來當例子:
function humanPlayer(board)
promptStr="請輸入方向(上(K),下(J),左(H),右(L),離開(Q)):"
print(promptStr)
return chomp(readline())
end
這個函式會先印出一列提示字串。因為julia支援unicode顯示,所以處理unicode的中文字元沒有問題(當然前提是你用的作業系統和終端機也要支援unicode),接著用chomp()這個指令把換行字元去掉。
接下來我們來實作主程式迴圈,同時也用這個主程式迴圈來一次檢視還有那些小零件還沒完成,這個主程式迴圈包括了以下的步驟:
下面就是我的主迴圈的實作:
function gameLoop(player::Function)
#初始化2048的盤面
board=initBoard()
#
while gameState(board)=="continue"
# 印出目前的盤面
println(printBoard(board))
# 從玩家接收下一步的指令
input=player(board)
# 把鍵盤指令轉為在boardMove所定義的方向
if input=="H" || input=="h"
moveDir=1
elseif input=="L" || input=="l"
moveDir=-1
elseif input=="K" || input=="k"
moveDir=2
elseif input=="J" || input=="j"
moveDir=-2
elseif input=="Q" || input=="q"
break
end
# 移動盤面
nextBoard=boardMove(board,moveDir)
# 判斷盤面是否被更動,如果被更動了,就加新的數字進去
if !((nextBoard.==board)==trues(size(board)...))
nextBoard=addTile(nextBoard)
end
# 用gameState確認遊戲是否可以繼續執行
if gameState(board)=="playerwin"
println("Congrats! You Win!")
break
elseif gameState(board)=="playerlost"
println("Good effort, but try again")
break
end
# 更新盤面
board=nextBoard
end
end
這裡我們特別為將來要加入AI agent留了一個伏筆:我們在gameloop()加了一個function argument,為的讓gameloop()可以從不同的來源讀取下一個動作。由真人進行遊戲時,input=player(board)的player會指向humanPlayer(),即,執行gameloop(humanPlayer)來開始遊戲。 而將來我們寫好了2048的AI agent的時候就可以把player指向給某個AI agent函式,例如gameloop(AIagent)。這也是為什麼我們要在humanPlayer(board)的定義中加入board這個引數。
離終點線愈來愈近了,只剩下gameState()、addTile()和initBoard()三個小零件,以及計分器,Julia版的2048就可以宣告完成了。