# Python#3 [TOC] ## 猜單字遊戲 ### 流程圖 ![](https://i.imgur.com/GjjNWI9.png) ### 程式 輸入圖形與單字 ```python= import random HANGMAN_PICS = [''' +---+ | | | ===''', ''' +---+ O | | | ===''', ''' +---+ O | | | | ===''', ''' +---+ O | /| | | ===''', ''' +---+ O | /|\ | | ===''', ''' +---+ O | /|\ | / | ===''', ''' +---+ O | /|\ | / \ | ==='''] words = 'ant baboon badger bat bear beaver camel cat clam cobra cougar coyote crow deer dog donkey duck eagle ferret fox frog goat goose hawk lion lizard llama mole monkey moose mouse mule newt otter owl panda parrot pigeon python rabbit ram rat raven rhino salmon seal shark sheep skunk sloth snake spider stork swan tiger toad trout turkey turtle weasel whale wolf wombat zebra'.split() ``` 隨機取出一個單字 ```python= def getRandomWord(wordList): # This function returns a random string from the passed list of strings. wordIndex = random.randint(0, len(wordList) - 1) return wordList[wordIndex] ``` 計算你猜贏還猜輸 ```python= def displayBoard(missedLetters, correctLetters, secretWord): print(HANGMAN_PICS[len(missedLetters)]) print() print('Missed letters:', end=' ') for letter in missedLetters: print(letter, end=' ') print() blanks = '_' * len(secretWord) for i in range(len(secretWord)): # replace blanks with correctly guessed letters if secretWord[i] in correctLetters: blanks = blanks[:i] + secretWord[i] + blanks[i+1:] for letter in blanks: # show the secret word with spaces in between each letter print(letter, end=' ') print() ``` 轉成小寫聘重複猜一遍 ```python= def getGuess(alreadyGuessed): # Returns the letter the player entered. This function makes sure the player entered a single letter and not something else. while True: print('Guess a letter.') guess = input() guess = guess.lower() if len(guess) != 1: print('Please enter a single letter.') elif guess in alreadyGuessed: print('You have already guessed that letter. Choose again.') elif guess not in 'abcdefghijklmnopqrstuvwxyz': print('Please enter a LETTER.') else: return guess ``` 問你要不要再猜一遍 ```python= 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') ``` ## 圈圈叉叉 ### 流程圖 ![](https://img2018.cnblogs.com/blog/1168036/201904/1168036-20190416193720420-1894542946.png) ### 程式 建立遊戲版面 ```python= import 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(board[7] + '|' + board[8] + '|' + board[9]) print('-+-+-') print(board[4] + '|' + board[5] + '|' + board[6]) print('-+-+-') print(board[1] + '|' + board[2] + '|' + board[3]) ``` 使用者輸入 ```python= 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'] ``` 誰先開始 ```python= def whoGoesFirst(): # Randomly choose the player who goes first. if random.randint(0, 1) == 0: return 'computer' ``` 版面更新 ```python= def makeMove(board, letter, move): board[move] = letter ``` 定義勝利方程式 ```python= 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)) # diagonal ``` 同步雙方面板 ``` def getBoardCopy(board): # Make a copy of the board list and return it. boardCopy = [] for i in board: boardCopy.append(i) return boardCopy ``` 確認格子是否用過 ```python= def isSpaceFree(board, move): # Return true if the passed move is free on the passed board. return board[move] == ' ' ``` 換玩家移動 ```python= 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) ``` AI選擇位置 ```python= 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 = [] for i in movesList: if isSpaceFree(board, i): possibleMoves.append(i) if len(possibleMoves) != 0: return random.choice(possibleMoves) else: return None ``` AI移動 ```python= 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): boardCopy = getBoardCopy(board) if isSpaceFree(boardCopy, i): makeMove(boardCopy, computerLetter, i) if isWinner(boardCopy, computerLetter): return i # Check if the player could win on his next move, and block them. for i in range(1, 10): boardCopy = getBoardCopy(board) if isSpaceFree(boardCopy, i): makeMove(boardCopy, playerLetter, i) if isWinner(boardCopy, 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]) ``` 如果畫滿了 ```python= 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 True print('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' print('Do you want to play again? (yes or no)') if not input().lower().startswith('y'): break ``` ## 串列(list) ![](https://i1.faceprep.in/Companies-1/lists-in-python.png) 跟矩陣類似但是沒有固定的大小,類似於java的Linkedlist ```python student = ['Neroal','Michael','Secret'] print(student) print(len(student)) #輸出 #['Neroal', 'Michael', 'Secret'] #3 ``` ### 常用方法 - **.append()** 把單一物件宣告再串列的後面 - **.insert()** 插入在index後面(整個資料型態) - **.extend()** 擺兩個串列合併 - **.remove()** 把特定物件移除掉 - **.pop()** 把最後一個物件移除掉 - **.soet()** 排序(遞減)串列 - **.reverse()** 反轉串列 - **.index()** 搜尋再串列裡面的物件 - **.split()** 字串切割 ## 字典(Dictionary) 類似自訂義的變數 ```python= d = {'a' : 1, 'b' : 2 } d['bbb']="asdasdsad" del d['b'] print(d['a']) print(d.get("aaa")) print(d['bbb']) #輸出 #1 #None #asdasdsad ``` ###### tags: `python`