python之用循環實現五子棋小程序

在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相關練習,寶寶們可以關注小編:秋葉夏風的博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455762.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Principle of Computing (Python)學習筆記(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/principlescomputing-001/wiki/view?pagetrees 1.2 CODE無parent域的樹 http://www.codeskulptor.org/#poc_tree.py class Tree:"""Recursive definition for tree…

C#線程篇---Task(任務)和線程池不得不說的秘密

我們要知道的是&#xff0c;QueueUserWorkItem這個技術存在許多限制。其中最大的問題是沒有一個內建的機制讓你知道操作在什么時候完成&#xff0c;也沒有一個機制在操作完成是獲得一個返回值&#xff0c;這些問題使得我們都不敢啟用這個技術。 Microsoft為了克服這些限制&…

關于編譯FFMPEG的初級教程

關于編譯FFMPEG的初級教程1.首先我們要下載相關工具&#xff0c;這里不多說&#xff0c;大家按照我的地址去下載文件就好了 MINGW下載地址&#xff1a;http://prdownloads.sourceforge.net/mingw/MinGW-3.1.0-1.exe?download 然后在下載MSYS &#xff1a;http://prdownloads.…

電子科學與技術相關索引匯總

電子科學與技術相關索引匯總 關于安裝deepinwindow10雙系統有時沒有聲音的問題關于deepin系統安裝design compiler的問題解答基于51單片機的交通燈控制設計基于物聯網的智能垃圾桶設計基于FPGA 的8b10b編解碼電路前端電路設計金屬磁記憶傳感器封裝集成電路版圖與工藝課程設計之…

【百度面試】閘機測試場景

面試被問到這一題思路想法&#xff1a; 自己找了相關內容充實自我。內容分享如下&#xff1a; 隨著人臉識別技術的成熟&#xff0c;閘機行業大量應用人臉識別算法&#xff0c;只因現今的人臉識別算法也已經能夠保證識別率、識別速度、誤識率和拒識率等各項指標的優異性&#x…

前后端分離項目如何部署_前后端分離項目,如何解決跨域問題?

跨域資源共享(CORS)是前后端分離項目很常見的問題&#xff0c;本文主要介紹當SpringBoot應用整合SpringSecurity以后如何解決該問題。01 什么是跨域問題&#xff1f;CORS全稱Cross-Origin Resource Sharing&#xff0c;意為跨域資源共享。當一個資源去訪問另一個不同域名或者同…

使用模板引擎artTemplate的幾個問題總結

一、Template not found 有的時候模板寫的并沒有問題&#xff0c;可就是找不到。這時候可能是<script>加載順序問題&#xff0c;模板渲染在模板加載完成之前先執行了&#xff0c;調整<script>的順序。 二、模板中將字符串轉化成數字 利用html中的表單來轉化&#x…

Android報“android.content.res.Resources$NotFoundException: String resource ID #0x2”錯誤

Android報“android.content.res.Resources$NotFoundException: String resource ID #0x2”錯誤 當調用setText()方法時如果傳入int型是不會被當成內容而是resourceID來使用&#xff01; 所以報錯&#xff01; 解決方法&#xff1a;TextView.setText("" arg) 轉為St…

時間戳問題匯總

大家好 我剛接觸流媒體不久&#xff0c; 現在遇到一個非常奇怪的問題&#xff0c;向各位大俠請假&#xff0c;請你們指點。 問題是這樣的 用一個 VLC(流媒體客戶端) 去請求流媒體服務器上的數據&#xff0c; 但是獲得的數據播放速度明顯快于1倍速&#xff0c;大概是 timest…

如何實現 C/C++ 與 Python 的通信?

如何實現 C/C 與 Python 的通信&#xff1f; 想在 C 中用 Python 進行數值計算&#xff0c;Python 需要訪問 C 的變量并計算后返回數值。有什么好辦法呢&#xff1f; 參考https://www.zhihu.com/question/23003213

前端相關索引匯總

前端相關索引匯總 HTML相關 HTML概述和基本結構HTML中Head頭HTML標題 HTML段落,換行,字符實體HTML塊,含樣式的標簽HTML中的圖片HTML中的鏈接HTML中的列表HTML中的表格HTML中的表單 CSS相關 Css基本語法及頁面引用Css中的選擇器Css顏色和文本字體CSS邊框,背景,邊距,溢出CSS中的…

nginx反向代理配置 多個_實例分享:Nginx學習之反向代理WebSocket配置實例

寫在開始去年&#xff0c;做過一款競賽打分的APP。具體需求&#xff0c;同組教師之間可以相互通信&#xff0c;及時通知同組人員&#xff0c;其他組員做了那些操作(當然&#xff0c;這只是針對特定操作)。實現方案采用目前比較成熟的WebSocket技術&#xff0c;WebSocket協議為創…

性能測試總結(一)---基礎理論篇

隨著軟件行業的快速發展&#xff0c;現代的軟件系統越來越復雜&#xff0c;功能越來越多&#xff0c;測試人員除了需要保證基本的功能測試質量&#xff0c;性能也隨越來越受到人們的關注。但是一提到性能測試&#xff0c;很多人就直接連想到Loadrunner。認為LR就等于性能測試&a…

Makefile 7——自動生成依賴關系 三顆星

后面會介紹gcc獲得源文件依賴的方法&#xff0c;gcc這個功能就是為make而存在的。我們采用gcc的-MM選項結合sed命令。使用sed進行替換的目的是為了在目標名前加上“objs/”前綴。gcc的-E選項&#xff0c;預處理。在生成依賴關系時&#xff0c;其實并不需要gcc編譯源文件&#x…

JavaScript使用場景

JavaScript嵌入頁面的方式 1、行間事件&#xff08;主要用于事件&#xff09; <input type"button" name"" onclick"alert(ok&#xff01;);">2、頁面script標簽嵌入 <script type"text/javascript">var a 你好&#…

集合添加元素python_Python 集合(Set)

Python 集合&#xff08;Set&#xff09; 在本文中&#xff0c;您將學習關于Python集的所有內容;如何創建它們、添加或刪除其中的元素&#xff0c;以及在Python中對集合執行的所有操作。 Python中的集合是什么&#xff1f; 集合是項目的無序集合。每個元素都是唯一的&#xff0…

一個極其高效的虛擬機內存冗余消除機制:UKSM

Linux內核機制KSM(Kernel Samepage Merging)能合并KVM虛擬機之間相同內存的頁面&#xff0c;被CentOS, RHEL之類的服務器內核廣泛采用&#xff0c;但是其速度很慢。UKSM(Ultra KSM)是國人在此基礎上的極大改進。通過使用了更高級的算法&#xff0c;UKSM的新特性包括&#xff1a…

【分享】 codeReview 的重要性

研發都知道代碼 Review 的重要性&#xff0c;在代碼 Review 也越來越受大家重視&#xff0c;我參與了大量的代碼 Review&#xff0c;明顯地感受到有效的代碼 Review 不但能提高代碼的質量&#xff0c;更能促進團隊溝通協作&#xff0c;建立更高的工程質量標準&#xff0c;無論對…

FFMPEG功能

FFMPEG功能1&#xff0e; 視頻音頻格式轉換Ffmpeg能使用任何支持的格式和協議作為輸入&#xff1a;*比如你可以輸入YUV文件&#xff1a;ffmpeg -i /tmp/test%d.Y /tmp/out.mpg 它將要使用如下文件&#xff1a; /tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,/tmp/test1.Y, /tmp…