bingo小游戏(圈圈叉叉小游戏)python
来源:互联网 发布:怎么样能加入淘宝客 编辑:程序博客网 时间:2024/04/29 21:54
这个游戏原本是学习的这本书上的小游戏,但是文章最后留了一个地址,然后我点进去了,然后就看到了这个小游戏
觉得很有趣,一下子没看懂,所以就把它注释了一番,帮助自己理解
原文源码地址(需要翻墙)
# Tic Tac Toeimport random# 打印方法def drawBoard(board): # This function prints out the board that it was passed. # "board" is a list of 10 strings representing the board (ignore index 0) print(' | |') print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9]) print(' | |') print('-----------') print(' | |') print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6]) print(' | |') print('-----------') print(' | |') print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3]) print(' | |')def inputPlayerLetter(): # Lets the player type which letter they want to be. # Returns a list with the player’s letter as the first item, and the computer's letter as the second. letter = '' while not (letter == 'X' or letter == 'O'): print('Do you want to be X or O?') letter = input().upper() # the first element in the list is the player’s letter, the second is the computer's letter. if letter == 'X': return ['X', 'O'] else: return ['O', 'X']def whoGoesFirst(): # Randomly choose the player who goes first. if random.randint(0, 1) == 0: return 'computer' else: return 'player'def playAgain(): # This function returns True if the player wants to play again, otherwise it returns False. print('Do you want to play again? (yes or no)') return input().lower().startswith('y')# 下子def makeMove(board, letter, move): board[move] = letter# 判断游戏是否结束def isWinner(bo, le): # Given a board and a player’s letter, this function returns True if that player has won. # We use bo instead of board and le instead of letter so we don’t have to type as much. return ((bo[7] == le and bo[8] == le and bo[9] == le) or # across the top (bo[4] == le and bo[5] == le and bo[6] == le) or # across the middle (bo[1] == le and bo[2] == le and bo[3] == le) or # across the bottom (bo[7] == le and bo[4] == le and bo[1] == le) or # down the left side (bo[8] == le and bo[5] == le and bo[2] == le) or # down the middle (bo[9] == le and bo[6] == le and bo[3] == le) or # down the right side (bo[7] == le and bo[5] == le and bo[3] == le) or # diagonal (bo[9] == le and bo[5] == le and bo[1] == le)) # diagonaldef getBoardCopy(board): # Make a duplicate of the board list and return it the duplicate. dupeBoard = [] for i in board: dupeBoard.append(i) return dupeBoard# 验证输入的list值是否为空def isSpaceFree(board, move): # Return true if the passed move is free on the passed board. return board[move] == ' '# 返回下子位置def getPlayerMove(board): # Let the player type in their move. 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, movesList): # Returns a valid move from the passed list on the passed board. # Returns None if there is no valid move. possibleMoves = [] # 获取空子位置list for i in movesList: if isSpaceFree(board, i): possibleMoves.append(i) # list不为空,随机选一个 if len(possibleMoves) != 0: return random.choice(possibleMoves) else: return None# 电脑获取下子位置def getComputerMove(board, computerLetter): # Given a board and the computer's letter, determine where to move and return that move. if computerLetter == 'X': playerLetter = 'O' else: playerLetter = 'X' # 这个是机器下子的算法 # Here is our algorithm for our Tic Tac Toe AI: # 首先检测我们下一步是否能赢 # First, check if we can win in the next move for i in range(1, 10): # copy一份目前的下子画板 copy = getBoardCopy(board) # 如果备份的画板中内容不为空 if isSpaceFree(copy, i): # 下子 makeMove(copy, computerLetter, i) # 如果下这个位置赢就将这个位置返回 if isWinner(copy, computerLetter): return i # 检测对手下一步是否会赢,会赢的话就堵它 # Check if the player could win on their next move, and block them. for i in range(1, 10): copy = getBoardCopy(board) if isSpaceFree(copy, i): makeMove(copy, playerLetter, i) if isWinner(copy, playerLetter): return i # 优先下这些位置(优先占据角落) # Try to take one of the corners, if they are free. move = chooseRandomMoveFromList(board, [1, 3, 7, 9]) if move != None: return move # 夺取中心点 # Try to take the center, if it is free. if isSpaceFree(board, 5): return 5 # 在最后的列表中下子 # Move on one of the sides. return chooseRandomMoveFromList(board, [2, 4, 6, 8])def isBoardFull(board): # Return True if every space on the board has been taken. Otherwise return False. for i in range(1, 10): if isSpaceFree(board, i): return False return Trueprint('Welcome to Tic Tac Toe!')# 死循环,没有while True: # Reset the board # 重置输出板 theBoard = [' '] * 10 # 选棋子 playerLetter, computerLetter = inputPlayerLetter() # 随机产生谁先下 turn = whoGoesFirst() # 打印是谁先下 print('The ' + turn + ' will go first.') # 游戏开始 gameIsPlaying = True while gameIsPlaying: # 人先下 if turn == 'player': # Player’s turn. # 打印画板 drawBoard(theBoard) # 获取下子位置 move = getPlayerMove(theBoard) # 下子 makeMove(theBoard, playerLetter, move) # 判断游戏是否结束 if isWinner(theBoard, playerLetter): drawBoard(theBoard) print('Hooray! You have won the game!') # 结束游戏 gameIsPlaying = False else: # 验证画板是否画满 if isBoardFull(theBoard): drawBoard(theBoard) print('The game is a tie!') break else: turn = 'computer' else: # Computer’s turn. # 机器获取下子位置 move = getComputerMove(theBoard, computerLetter) makeMove(theBoard, computerLetter, move) if isWinner(theBoard, computerLetter): drawBoard(theBoard) print('The computer has beaten you! You lose.') gameIsPlaying = False else: if isBoardFull(theBoard): drawBoard(theBoard) print('The game is a tie!') break else: turn = 'player' # 如果不想玩了就跳出循环 if not playAgain(): break
阅读全文
0 0
- bingo小游戏(圈圈叉叉小游戏)python
- bingo小游戏介绍以及概率问题
- 算术小游戏(python版)
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 小游戏
- 数据分析之《菜鸟侦探挑战数据分析》-6-r语言-时间序列-逻辑回归分析-自相关-日历图
- 数组的本质分析
- JavaScript高级程序设计(第3版)笔记(四)
- FPGA基础-异步复位,同步释放
- ubuntu下mysql出现 warning: Changed limits: max_connections: 214 问题
- bingo小游戏(圈圈叉叉小游戏)python
- Java中对Array数组的常用操作,交集并集合集!
- php 在LINUX下创建目录失败的解决方法
- Python语言入门(六)关键字参数与命名关键字参数
- 【Java并发学习】之原子类
- Android Studio NDK 入门教程(1)--来自C 语言的String
- 结合redis设计与实现的redis源码学习-15-TCP网络连接(anet.c)
- POJ
- pandas基础