在python中我們學過流程控制中的循環結構,現在我們來進行一個小應用的練習
本程序是通過循環控制結構來實現五子棋小程序的
游戲規則
五子棋的規則如下:
- 對局雙方各執一色棋子。
- 空棋盤開局。
- 黑先、白后,交替下子,每次只能下一子。
- 棋子下在棋盤的空白點上,棋子下定后,不得向其它點移動,不得從棋盤上拿掉或拿起另落別處。
- 黑方的第一枚棋子可下在棋盤任意交叉點上。
- 輪流下子是雙方的權利,但允許任何一方放棄下子權(即:PASS權)
實現過程
由于本程序較為簡單,基礎知識要求較低,通過觀看本教程,大部分同學都能夠理解和掌握.
在這里需要提前了解的知識有:
- python中的流程控制
- python中列表操作
棋盤界面是通過我們利用循環打印出來的,棋子的兩種是通過"e"和"o"兩個字母打印出來的,其他地方用"+"填充出網格
其中,用戶通過輸入棋子的橫縱坐標來進行位置信息的輸入,這里在輸入后進行了一系列的驗證,輸入的內容是否為數值,數值是否超出范圍,落子的位置是否為空等
用于驗證獲勝者的模塊,是通過循環遍歷所有棋盤中的位置,判斷相鄰的位置的棋子是否同時存在于當前用戶的列表中,若條件成立,則返回True,否則返回False
主模塊中是一個while循環,提示用戶輸入位置信息,并且加入用戶列表數據存儲,以便于計算棋子的位置信息以及數量,每次顯示出新的界面,然后進入win模塊進行獲勝者的檢驗,若通過檢驗,循環終止,游戲結束.
代碼實現
具體代碼如下
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# coding by 秋葉夏風# 定義顯示方法
def dis(user1,user2):print("\t1 2 3 4 5 6 7 8 9 101112131415")for i in range(15):print(i+1,end="")print("\t",end="")for j in range(15):# 遍歷所有位置,判斷是否有下過子if [i+1,j+1] in user1:print("o ", end="")passelif [i+1,j+1] in user2:print("e ", end="")pass# else:# print(" ",end="")else:print("+ ",end="")passprint()pass# 定義輸入校正方法
def ini():while True:hang = input("行數:")lie = input("列數:")if hang.isdigit() and lie.isdigit():hang = int(hang)lie = int(lie) # 判斷輸入的字符是不是數字# 判斷輸入的點位置有沒有之前下過if [hang,lie] in user1 or [hang,lie] in user2:print("這個點已經下過了,請重新輸入")else:# 判斷輸入的數字范圍在不在 棋盤空間內if hang in range(1,16) and lie in range(1,16):return hang,lieelse:print("你輸入的數值不再棋盤范圍內,重新輸入")passelse:print("你這輸入的也不是數字啊,逗我玩呢啊")print("趕緊的,重新輸入")pass# 定義判斷方法
def win(user):# 遍歷所有位置坐標for hang in range(1,15):for lie in range(1,15):# 判斷 有沒有5連子的情況,要是有返回真# 豎著5個子連上的情況if [hang ,lie] in user and\[hang+1,lie] in user and\[hang+2,lie] in user and\[hang+3,lie] in user and\[hang+4,lie] in user :# print("恭喜用戶%s贏了,游戲結束"%yonghu)return Truepass# 橫著5個子連接的情況elif [hang ,lie] in user and\[hang,lie+1] in user and\[hang,lie+2] in user and\[hang,lie+3] in user and\[hang,lie+4] in user :# print("恭喜用戶%s贏了,游戲結束"%yonghu)return Truepass# 斜著\這么斜的情況elif [hang ,lie] in user and\[hang+1,lie+1] in user and\[hang+2,lie+2] in user and\[hang+3,lie+3] in user and\[hang+4,lie+4] in user :# print("恭喜用戶%s贏了,游戲結束"%yonghu)return Truepass# 斜著/這么斜的情況elif [hang ,lie] in user and\[hang-1,lie+1] in user and\[hang-2,lie+2] in user and\[hang-3,lie+3] in user and\[hang-4,lie+4] in user :# print("恭喜用戶%s贏了,游戲結束"%yonghu)return Truepasspassreturn Falsepass# 定義邏輯控制方法
def logic_control():print("-------歡迎使用連珠五子棋程序-------")print("本游戲需要兩名玩家一起玩")wanjia1 = input("請輸入玩家1的名字:")wanjia2 = input("請輸入玩家2的名字:")print("用戶1:o")print("用戶2:e")dis(user1,user2) # 先顯示一下原始狀態i = 0 # 用于記錄下子的次數while i<=225: # 死循環 輸入 其實用不著死循環,一共就那么多下i += 1 # 累加if i%2 : # 判斷出當前的用戶yonghu = wanjia1else:yonghu = wanjia2print("請玩家%s輸入" %yonghu) #用于提示哪個用戶輸入posi = ini() # 調用輸入校正方法,防止用戶下到已經下的位置上hang = posi[0] # 將輸入校正方法返回的返回值元祖拆開lie = posi[1]if yonghu == wanjia1:user1.append([hang, lie]) # 將坐標信息添加到對應用戶的列表passelse:user2.append([hang, lie]) # 將坐標信息添加到對應用戶的列表pass# 調用顯示方法dis(user1, user2)# 游戲勝負判斷if win(user1):print("五子連珠")print("恭喜玩家%s贏了,游戲結束" % yonghu)break # 跳出循環終止程序if win(user2):print("五子連珠")print("恭喜玩家%s贏了,游戲結束" % yonghu)break# print(user1) # 調試的時候用,游戲的時候可以隱藏了# print(user2)# 初始化兩個列表,用于存儲用戶下子的信息
user1 = [] #用于記錄用戶1的下子信息
user2 = [] #用于記錄用戶2的下子信息
# 執行主函數
logic_control()
'''
上面的程序是用的面向過程的思維方式實現的,當然,你也可以使用面向對象的方式編寫
下面是經過封裝后的程序代碼
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# coding by 秋葉夏風# 導入系統模塊,用于保證程序結束后不退出終端
import osclass Chess():def __init__(self):'''初始化魔術方法用于設定初始的狀態值'''# 定義兩個數組self.user1 = [] # 用于記錄用戶1的下子信息self.user2 = [] # 用于記錄用戶2的下子信息print("-------歡迎使用連珠五子棋程序-------")print("本游戲需要兩名玩家一起玩")self.player1 = '1'self.player2 = '2'print("%s:o" % self.player1)print("%s:e" % self.player2)self.display(self.user1, self.user2) # 先顯示一下原始狀態# 調用主邏輯函數self.main_logic()def display(self,user1,user2):'''更新顯示的方法:param user1: 用戶1的數組:param user2: 用戶2的數組:return: 無返回值'''print("\t1 2 3 4 5 6 7 8 9 101112131415")for i in range(15):print(i+1,end="")print("\t",end="")for j in range(15):# 遍歷所有位置,判斷是否有下過子if [i+1,j+1] in user1:print("o ", end="")passelif [i+1,j+1] in user2:print("e ", end="")passelse:print("+ ",end="")passprint()passdef input_check(self):'''定義輸入校正方法用于驗證輸入的數據的規范性:return: 無返回值'''while True:hang = input("行數:")lie = input("列數:")if hang.isdigit() and lie.isdigit():hang = int(hang)lie = int(lie) # 判斷輸入的字符是不是數字# 判斷輸入的點位置有沒有之前下過if [hang,lie] in self.user1 or [hang,lie] in self.user2:print("這個點已經下過了,請重新輸入")else:# 判斷輸入的數字范圍在不在 棋盤空間內if hang in range(1,16) and lie in range(1,16):return hang,lieelse:print("你輸入的數值不再棋盤范圍內,重新輸入")passelse:print("你這輸入的也不是數字啊,逗我玩呢啊")print("趕緊的,重新輸入")passdef choose_winner(self,user):'''# 定義判斷方法,用于驗證玩家的獲勝一方:param user: 當前用戶:return: bool'''# 遍歷所有位置坐標for hang in range(1,15):for lie in range(1,15):# 判斷 有沒有5連子的情況,要是有返回真# 豎著5個子連上的情況if [hang ,lie] in user and\[hang+1,lie] in user and\[hang+2,lie] in user and\[hang+3,lie] in user and\[hang+4,lie] in user :# print("恭喜用戶%s贏了,游戲結束"%yonghu)return Truepass# 橫著5個子連接的情況elif [hang ,lie] in user and\[hang,lie+1] in user and\[hang,lie+2] in user and\[hang,lie+3] in user and\[hang,lie+4] in user :# print("恭喜用戶%s贏了,游戲結束"%yonghu)return Truepass# 斜著\這么斜的情況elif [hang ,lie] in user and\[hang+1,lie+1] in user and\[hang+2,lie+2] in user and\[hang+3,lie+3] in user and\[hang+4,lie+4] in user :# print("恭喜用戶%s贏了,游戲結束"%yonghu)return Truepass# 斜著/這么斜的情況elif [hang ,lie] in user and\[hang-1,lie+1] in user and\[hang-2,lie+2] in user and\[hang-3,lie+3] in user and\[hang-4,lie+4] in user :# print("恭喜用戶%s贏了,游戲結束"%yonghu)return Truepasspassreturn Falsepassdef main_logic(self):'''主要執行邏輯包括循環調用輸入方法,顯示方法,判斷驗證方法更新用戶列表的數據:return: '''i = 0 # 用于記錄下子的次數,若超出這個范圍,即下滿棋盤,則和棋while i <= 225: # 死循環 輸入 其實用不著死循環,一共就那么多下i += 1 # 累加if i % 2: # 判斷出當前的用戶yonghu = self.player1else:yonghu = self.player2print("請玩家%s輸入" % yonghu) # 用于提示哪個用戶輸入posi = self.input_check() # 調用輸入校正方法,防止用戶下到已經下的位置上hang = posi[0] # 將輸入校正方法返回的返回值元祖拆開lie = posi[1]if yonghu == self.player1:self.user1.append([hang, lie]) # 將坐標信息添加到對應用戶的列表passelse:self.user2.append([hang, lie]) # 將坐標信息添加到對應用戶的列表pass# 調用顯示方法self.display(self.user1, self.user2)# 游戲勝負判斷if self.choose_winner(self.user1):print("五子連珠")print("恭喜玩家%s贏了,游戲結束" % yonghu)os.system("pause")break # 跳出循環終止程序if self.choose_winner(self.user2):print("五子連珠")print("恭喜玩家%s贏了,游戲結束" % yonghu)os.system("pause")break# print(user1) # 調試的時候用,游戲的時候可以隱藏了# print(user2)# 實例化對象
c = Chess()
還想看更多python相關練習,寶寶們可以關注小編:秋葉夏風的博客