基于python实现井字棋⼩游戏
本⽂为⼤家分享了python实现井字棋⼩游戏,供⼤家参考,具体内容如下
周五晚上上了python的选修课,本来以为⽼师是从python的基础语法开始的,没想到是从turtle画图开始,正好补上了我以前⼀些不懂的地⽅,有⼈讲⼀下还是⽐啃书好⼀点。
之前从图书馆借了⼀本python游戏编程,看了前⾯⼏章后就没怎么看了,晚上突然想看看,然后跟着教程写个游戏的。最后就有了这个井字棋的诞⽣,其实代码并不是很长,主要是思路,需要考虑的周全⼀点。代码写完后就和电脑下了好久的井字棋,⼀局都没赢,真的是很⽆奈了,⽐不过⽐不过。
开发环境:windows10 + pycharm(因为下棋时候需要输⼊,sublime不知道怎么弄输⼊,所以就⽤了pycharm)
需要⽤到的包也只有⼀个:random
游戏的话⾸先要弄清楚的是游戏的流程,⾸先做什么然后做什么。因为井字棋相对来说不算是⼀个复杂的游戏,所以流程就不多讲了,我⾸先做的是画棋盘、电脑和玩家的棋⼦、谁先落⼦等,下⾯通过代码来解释:
# 画棋盘的函数,传⼊⼀个放置棋⼦的列表
def drawBoard(board) :
print(" " + board[7] + " | " + board[8] + " | " + board[9])
print("------------")
print(" " + board[4] + " | " + board[5] + " | " + board[6])
print("------------")
print(" " + board[1] + " | " + board[2] + " | " + board[3])
# 玩家选择所想⽤的棋⼦种类
def inputPlayerLetter() :
letter = ''
while not (letter == 'X' or letter == 'O') :
print("Do you want to be X or O")
# ⾃动将⼩写转化为⼤写
letter = input().upper()
# 如果玩家选择的X,则⾃动将O赋给电脑,反之⼀样
if letter == 'X' :
return ['X','O']
else :
return ['O','X']
# 这⾥随机⽣成0或者1来表⽰谁先落⼦
def whoGoesFirst() :
if random.randint(0,1) == 0 :
return 'computer'
else :
return 'player'
# 如果玩家选择y或者Y则游戏重新开始
def playAgain():
print("Do you want to play again?(yes or no)")
return input().lower().startswith('y')
# 将棋⼦放置到棋盘上⾯
# board参数是储存棋⼦的列表
# letter参数是棋⼦的类型
# move是选择将棋⼦放在哪
def makeMove(board, letter, move) :
board[move] = letter
# 根据井字棋规则判断是否获胜
def isWinner(bo, le) :
return ((bo[7] == le and bo[8] == le and bo[9] == le) or
(bo[4] == le and bo[5] == le and bo[6] == le) or
(bo[1] == le and bo[2] == le and bo[3] == le) or
(bo[7] == le and bo[4] == le and bo[1] == le) or
(bo[8] == le and bo[5] == le and bo[2] == le) or
(bo[9] == le and bo[6] == le and bo[3] == le) or
(bo[7] == le and bo[5] == le and bo[3] == le) or
(bo[9] == le and bo[5] == le and bo[1] == le))
# 将已经在棋盘上的棋⼦备份,随时更新
def getBoardCopy(board) :
dupeBoard = []
for i in board :
dupeBoard.append(i)
return dupeBoard
# 判断棋盘是否还有可落⼦的地⽅
def isSpaceFree(board, move) :
return board[move] == ' '
# 获取玩家落⼦的位置
def getPlayerMove(board) :
move = ' '
# 判断落⼦的位置是否正确以及棋盘是否还能落⼦
while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board, int(move)) :
print("What is your next move?(1-9)")
move = input()
return int(move)
# 到可以落⼦的地⽅,主要是计算机使⽤的
def chooseRandomMoveFromList(board, moveList) :
possibleMoves = []
for i in moveList :
if isSpaceFree(board, i) :
possibleMoves.append(i)
if len(possibleMoves) != 0 :
return random.choice(possibleMoves)
else :
return None
上述代码实现了部分简单的功能,然后是实现计算机的落⼦部分,毕竟是计算机,得看着不那么傻,所以下⾯相当于是⼀个⼩⼩的AI,电脑能在备份的副本上判断,根据判断的结果来指定落⼦的位置:
# 电脑落⼦
def getComputerMove(board, computerLetter) :
# 给出棋盘上电脑和玩家棋⼦的类型
if computerLetter == 'X' :
playerLetter = 'O'
else :
playerLetter = 'X'
for i in range(1,10) :
# 在备份的棋盘中判断是否有可以落⼦的地⽅
copy = getBoardCopy(board)
if isSpaceFree(copy, i) :
# 如果有可以落⼦的地⽅,则先在备份的棋盘上落⼦
makeMove(copy, computerLetter, i)
# 落⼦后判断电脑是否能赢,并且返回能赢的落⼦的位置
if isWinner(copy, computerLetter) :
return i
for i in range(1,10) :
copy = getBoardCopy(board)
if isSpaceFree(copy, i) :
# 在备份的棋盘上模拟玩家落⼦
makeMove(copy, playerLetter, i)
# 如果下⼀次玩家落⼦就可以赢,返回玩家落⼦的位置,⽤于堵住玩家
if isWinner(copy, playerLetter) :
return i
# 随机在四个⾓处落⼦
move = chooseRandomMoveFromList(board,[1,3,7,9])
if move != None :
return move
# 如果⾓处已被占满,则落⼦在中间位置5处
if isSpaceFree(board, 5) :
return 5
# 如果⾓和中间都被占满,则随机选择边上落⼦
return chooseRandomMoveFromList(board,[2,4,6,8]) # 判断棋盘是否已满
def isBoardFull(board) :
for i in range(1,10) :
if isSpaceFree(board, i) :
return False
return True
print("Welcome to Tictactoe ")
while True :
# 初始化棋盘为空
theBoard = [' '] * 10
# 玩家和电脑棋⼦类型的选择
playerLetter, computerLetter = inputPlayerLetter()
# 先后顺序的决定
turn = whoGoesFirst()
print('The ' + turn + ' will go first')
# 游戏开始的标志位,当游戏结束时变成False
gameIsPlaying = True
while gameIsPlaying :
# 玩家先⾏
if turn == 'player' :
drawBoard(theBoard)
python可以做什么游戏# 获取玩家下棋的位置
move = getPlayerMove(theBoard)
# 将玩家的棋⼦传⼊列表相应的位置
makeMove(theBoard, playerLetter, move)
# 如果玩家获胜,标志位变为False
if isWinner(theBoard, playerLetter) :
drawBoard(theBoard)
print("You win !")
gameIsPlaying = False
# 否则则判断棋盘是否已满
else :
if isBoardFull(theBoard) :
drawBoard(theBoard)
print("Tie")
break
# 若棋盘未满,且玩家已落⼦,则下⼀次落到计算机落⼦ else :
turn = 'computer'
# 电脑先⾏
else :
# 电脑随机选择位置落⼦
move = getComputerMove(theBoard, computerLetter) makeMove(theBoard, computerLetter, move)
# 如果电脑落⼦获胜,则游戏结束
if isWinner(theBoard, computerLetter) :
drawBoard(theBoard)
print("You lose !")
gameIsPlaying = False
else :
if isBoardFull(theBoard) :
drawBoard(theBoard)
print("Tie")
break
else :
turn = 'player'
# 玩家没有再次开始游戏,则跳出循环
if not playAgain():
break
上述所有代码实现了井字棋的⼈机对战,整合起来就可以玩了,反正我是没有下赢过的。以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论