資訊內容
寫一個Python小游戲——四連環(huán)(重力四子棋)
erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
新手學習python,寫第一個Python小游戲——四連環(huán)(重力四子棋)erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
游戲規(guī)則如下:erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
棋盤為8*6erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
玩家輸入列號與電腦下四子棋,棋會隨著重力下降erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
勝利方式是一行/一列/左右斜線連四顆棋子erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
分析:erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
拆分成了這幾個部分,用自定義函數(shù)封裝,便于修改:erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
·初始化erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
·棋盤顯示erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
·玩家輸入erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
·游戲運行erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
·判斷勝利erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
引用庫:randomerb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
第一部分:初始化erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
def init(): global board#棋盤,二維列表 global rest_num#每一列剩余棋子數(shù),一維整型列表 global a#先手判定,整型 global reminded_line#未被填滿列的記錄,一維整型列表 global symbol0#執(zhí)棋方記錄1,字典 global symbol1#執(zhí)棋方記錄2,字典 symbol1 = { "O": "玩家", "X": "電腦" } symbol0 = { "X": "玩家", "O": "電腦" } a = random.randint(0,2) reminded_line = [0,1,2,3,4,5,6,7] board = [["-"] * 8 for i in range(6)] rest_num = [6 for i in range(8)] show(board)這里初始化定義了一些之后用得到的變量erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
第二部分:棋盤顯示erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
def show(board): for i in range(6): for j in range(8): print(board[i][j],end=" ") print()用索引下標的方式遍歷棋盤并打印erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
第三部分:玩家輸入erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
def playerInput(rest_num): while True: inp = int(input()) - 1#注意:列表起始于list[0] if inp in range(0,8):#符合8列 if rest_num[inp] > 0:#該列有空余 return inp else: print("輸入錯誤") else: print("輸入錯誤")輸入用While True循環(huán),直到輸入正確erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
要判定輸入的列號是否在1-8列內,且該列有空余!erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
第四部分:運行erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
先后手問題在主函數(shù)內用 if 判斷初始化內全局變量a來執(zhí)行不同順序erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
四子棋的前三個回合不會分出勝負,因此拆分成前三個回合和剩余回合erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
這里可以算多此一舉吧,前三次只是少了判斷勝負erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
用 round3_0、round4_0 和 round3_1、round4_1 區(qū)分erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
游戲運行使用for次數(shù)循環(huán),勝利提前結束即可erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
def round3_0(): round_cout = 0#回合計數(shù) for i in range(3): round_cout += 1#回合+1 print(" ===回合數(shù)"+str(round_cout)+"===") print(" 電腦")#常規(guī)的面板繪制 #電腦下棋的列號 #這里用從列表隨機是為了不會出現(xiàn)該列已滿無法下棋的情況 robot_line = random.sample(reminded_line,1)[0] #電腦下棋的行號,記得要-1 #因為重力下落,這里行號就是空余數(shù)量-1 robot_height = rest_num[robot_line] - 1 #電腦下棋 board[robot_height][robot_line] = "O" #該列剩余-1 rest_num[robot_line] -= 1 show(board)#顯示棋盤 print(" 輪到你了:") player_line = playerInput(rest_num) player_height = rest_num[player_line] - 1 board[player_height][player_line] = "X" rest_num[player_line] -= 1 show(board) def round3_1():#同上,只是先后手順序改變 round_cout = 0 for i in range(3): round_cout += 1 print(" ===回合數(shù)"+str(round_cout)+"===") print(" 輪到你了:") player_line = playerInput(rest_num) player_height = rest_num[player_line] - 1 board[player_height][player_line] = "O" rest_num[player_line] -= 1 show(board) print(" 電腦") robot_line = random.sample(reminded_line,1)[0] robot_height = rest_num[robot_line] - 1 board[robot_height][robot_line] = "X" rest_num[robot_line] -= 1 show(board) def round4_0(): round_cout = 3#回合計數(shù) for i in range(3,24):#共48個棋子,24個回合 round_cout += 1 print(" ===回合數(shù)"+str(round_cout)+"===") print(" 電腦") robot_line = random.sample(reminded_line,1)[0] robot_height = rest_num[robot_line] - 1 board[robot_height][robot_line] = "O" rest_num[robot_line] -= 1 #如果該列已滿,則在剩余列編號列表中移除,排除隨機到該列 if rest_num[robot_line] == 0: reminded_line.remove(robot_line) show(board) #!勝負判定! IsWinning(board,"O",symbol0) print(" 輪到你了:") player_line = playerInput(rest_num) player_height = rest_num[player_line] - 1 board[player_height][player_line] = "X" rest_num[player_line] -= 1 if rest_num[robot_line] == 0: reminded_line.remove(robot_line) show(board) IsWinning(board, "X", symbol0) print("平局!")#**后分不出勝負就是平局 def round4_1(): round_cout = 3 for i in range(3, 24): round_cout += 1 print(" ===回合數(shù)"+str(round_cout)+"===") print(" 輪到你了:") player_line = playerInput(rest_num) player_height = rest_num[player_line] - 1 board[player_height][player_line] = "O" rest_num[player_line] -= 1 if rest_num[player_line] == 0: reminded_line.remove(player_line) show(board) IsWinning(board, "O", symbol1) print(" 電腦") robot_line = random.sample(reminded_line,1)[0] robot_height = rest_num[robot_line] - 1 board[robot_height][robot_line] = "X" rest_num[robot_line] -= 1 if rest_num[robot_line] == 0: reminded_line.remove(robot_line) show(board) IsWinning(board, "X", symbol1) print("平局!")第五部分:勝利判斷erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
詳細解釋判定條件erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
勝利有四種情況:橫4、豎4、左斜4、右斜4erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
因此繼續(xù)封裝成兩種形式:直線、斜線進行判定erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
因為左斜和右斜是關于棋盤左右對稱的erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
這里board_s就是對稱棋盤erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
用 [::-1] 進行倒序erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
傳入三個參數(shù):棋盤、棋子類型(X/O)、執(zhí)棋方記錄erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
def IsWinning(board,chess_type,symbol): rowIsWinning(board,chess_type,symbol) leftSlashIsWinning(board,chess_type,symbol) board_s = [] for i in board: board_s.append(i[::-1])#左右對稱 leftSlashIsWinning(board_s, chess_type, symbol)========erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
直線判定:erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
def rowIsWinning(board,chess_type,symbol): #豎4 for line_no in range(8): for height_no in range(3): if board[height_no][line_no] == board[height_no + 1][line_no] == board[height_no + 2][line_no] == board[height_no + 3][line_no] == chess_type: print(" 游戲結束!獲勝的是:" + symbol[chess_type]) exit(0) #橫4 for height_no in range(6): for line_no in range(5): if board[height_no][line_no] == board[height_no][line_no + 1] == board[height_no][line_no + 2] == board[height_no][line_no + 3] == chess_type: print(" 游戲結束!獲勝的是:" + symbol[chess_type]) exit(0)首先下標索引遍歷每一列erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
然后在每一列判定是否包含4個相同棋子erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
每一列得到前三行的棋子,之后再通過列下標不變,行下標遞增獲得四個棋子的坐標erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
橫4的判斷同理erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
========erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
難點erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
斜線判定:erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
斜線分左斜和右斜,左右是對稱的,因此只用一種方法而將另一種判定換成將棋盤對稱的操作erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
棋盤也是關于對角線可以對稱的,也可以左右 + 對角線對稱,從而轉換成一種判定方式(棋盤左對角線左方左斜的情況),對棋盤操作統(tǒng)統(tǒng)化成一種erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
以下以左斜線判定為例子:erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
藍色部分無法構成斜線,無需考慮erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
斜線有一個重要性質:坐標行號列號均相差正整數(shù)erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
因此只需要表示出下方綠色區(qū)域的棋子坐標就可以表示所有斜線:erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
(還有一種特殊情況)erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
只要循環(huán)表示出綠色區(qū)域內的坐標 通過行列遞增即可表示斜線:erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
對于左上區(qū)域的坐標可以發(fā)現(xiàn):erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
行號是1-3,而列號是1 ~ 行號erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
對于右下區(qū)域: erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
行號是4-6,列號是(行號+2) ~ 8erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
因此可以使用嵌套for循環(huán)表示erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
def leftSlashIsWinning(board,chess_type,symbol): #表示左上綠色部分 for init_height in range(3): for init_line in range(init_height + 1): if board[init_height][init_line] == board[init_height + 1][init_line + 1] == board[init_height + 2][init_line + 2] == board[init_height + 3][init_line + 3] == chess_type: print(" 游戲結束!獲勝的是:" + symbol[chess_type]) exit(0) #表示右下綠色部分 for init_height in range(3,6): for init_line in range(init_height+2,8): if board[init_height][init_line] == board[init_height - 1][init_line - 1] == board[init_height - 2][init_line - 2] == board[init_height - 3][init_line - 3] == chess_type: print(" 游戲結束!獲勝的是:" + symbol[chess_type]) exit(0) #中間特殊情況 for init_height in range(3): init_line = init_height +1 if board[init_height][init_line] == board[init_height + 1][init_line + 1] == board[init_height + 2][init_line + 2] == board[init_height + 3][init_line + 3] == chess_type: print(" 游戲結束!獲勝的是:" + symbol[chess_type]) exit(0)完整代碼:
erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
import random def init(): global board global rest_num global a global reminded_line global symbol0 global symbol1 symbol1 = { "O": "玩家", "X": "電腦" } symbol0 = { "X": "玩家", "O": "電腦" } a = random.randint(0,2) reminded_line = [0,1,2,3,4,5,6,7] board = [["-"] * 8 for i in range(6)] rest_num = [6 for i in range(8)] show(board) def show(board): for i in range(6): for j in range(8): print(board[i][j],end=" ") print() def IsWinning(board,chess_type,symbol): rowIsWinning(board,chess_type,symbol) leftSlashIsWinning(board,chess_type,symbol) board_s = [] for i in board: board_s.append(i[::-1]) leftSlashIsWinning(board_s, chess_type, symbol) def rowIsWinning(board,chess_type,symbol): for line_no in range(8): for height_no in range(3): if board[height_no][line_no] == board[height_no + 1][line_no] == board[height_no + 2][line_no] == board[height_no + 3][line_no] == chess_type: print(" 游戲結束!獲勝的是:" + symbol[chess_type]) exit(0) for height_no in range(6): for line_no in range(5): if board[height_no][line_no] == board[height_no][line_no + 1] == board[height_no][line_no + 2] == board[height_no][line_no + 3] == chess_type: print(" 游戲結束!獲勝的是:" + symbol[chess_type]) exit(0) def leftSlashIsWinning(board,chess_type,symbol): for init_height in range(3): for init_line in range(init_height + 1): if board[init_height][init_line] == board[init_height + 1][init_line + 1] == board[init_height + 2][init_line + 2] == board[init_height + 3][init_line + 3] == chess_type: print(" 游戲結束!獲勝的是:" + symbol[chess_type]) exit(0) for init_height in range(3,6): for init_line in range(init_height+2,8): if board[init_height][init_line] == board[init_height - 1][init_line - 1] == board[init_height - 2][init_line - 2] == board[init_height - 3][init_line - 3] == chess_type: print(" 游戲結束!獲勝的是:" + symbol[chess_type]) exit(0) for init_height in range(3): init_line = init_height +1 if board[init_height][init_line] == board[init_height + 1][init_line + 1] == board[init_height + 2][init_line + 2] == board[init_height + 3][init_line + 3] == chess_type: print(" 游戲結束!獲勝的是:" + symbol[chess_type]) exit(0) def playerInput(rest_num): while True: inp = int(input()) - 1 if inp in range(0,8): if rest_num[inp] > 0: return inp else: print("輸入錯誤") else: print("輸入錯誤") def round3_0(): round_cout = 0 for i in range(3): round_cout += 1 print(" ===回合數(shù)"+str(round_cout)+"===") print(" 電腦") robot_line = random.sample(reminded_line,1)[0] robot_height = rest_num[robot_line] - 1 board[robot_height][robot_line] = "O" rest_num[robot_line] -= 1 show(board) print(" 輪到你了:") player_line = playerInput(rest_num) player_height = rest_num[player_line] - 1 board[player_height][player_line] = "X" rest_num[player_line] -= 1 show(board) def round3_1(): round_cout = 0 for i in range(3): round_cout += 1 print(" ===回合數(shù)"+str(round_cout)+"===") print(" 輪到你了:") player_line = playerInput(rest_num) player_height = rest_num[player_line] - 1 board[player_height][player_line] = "O" rest_num[player_line] -= 1 show(board) print(" 電腦") robot_line = random.sample(reminded_line,1)[0] robot_height = rest_num[robot_line] - 1 board[robot_height][robot_line] = "X" rest_num[robot_line] -= 1 show(board) def round4_0(): round_cout = 3 for i in range(3,24): round_cout += 1 print(" ===回合數(shù)"+str(round_cout)+"===") print(" 電腦") robot_line = random.sample(reminded_line,1)[0] robot_height = rest_num[robot_line] - 1 board[robot_height][robot_line] = "O" rest_num[robot_line] -= 1 if rest_num[robot_line] == 0: reminded_line.remove(robot_line) show(board) IsWinning(board,"O",symbol0) print(" 輪到你了:") player_line = playerInput(rest_num) player_height = rest_num[player_line] - 1 board[player_height][player_line] = "X" rest_num[player_line] -= 1 if rest_num[robot_line] == 0: reminded_line.remove(robot_line) show(board) IsWinning(board, "X", symbol0) print("平局!") def round4_1(): round_cout = 3 for i in range(3, 24): round_cout += 1 print(" ===回合數(shù)"+str(round_cout)+"===") print(" 輪到你了:") player_line = playerInput(rest_num) player_height = rest_num[player_line] - 1 board[player_height][player_line] = "O" rest_num[player_line] -= 1 if rest_num[player_line] == 0: reminded_line.remove(player_line) show(board) IsWinning(board, "O", symbol1) print(" 電腦") robot_line = random.sample(reminded_line,1)[0] robot_height = rest_num[robot_line] - 1 board[robot_height][robot_line] = "X" rest_num[robot_line] -= 1 if rest_num[robot_line] == 0: reminded_line.remove(robot_line) show(board) IsWinning(board, "X", symbol1) print("平局!") #程序入口 if __name__ == "__main__": init() if a == 1: round3_1() round4_1() else: round3_0() round4_0()
游戲截圖:
erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
erb少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

- 上一篇
python是最好的語言嗎
簡介Python是最好的語言,原因如下:1、Python是人工智能的未來。不同的編程有不同的應用場景和不同的使用場合,因此無法全面的評論哪種語言是最好的。但是各種不同的媒介還是每隔一段時間都會發(fā)布編程語言的熱度排行榜。前不久電氣和電子工程師協(xié)會(IEEE)發(fā)布了頂級編程語言交互排行榜。Python超越J
- 下一篇
介紹python的函數(shù)裝飾器
簡介相關免費學習推薦:python視頻教程pyhton的函數(shù)裝飾器可以將裝飾器函數(shù)通過@方法很便捷的為函數(shù)增添功能一.函數(shù)用法defsum_list(list):將列表中的數(shù)字求和輸入:含有數(shù)字的