用Python代码实现五子棋游戏
在做python實踐的時候突然對python寫游戲代碼產生興趣這,于是查了查資料,敲了敲代碼,這樣能夠熟悉pygame模塊,發現還挺好玩的
講解一下編寫單機五子棋程序的幾個重要部分:
①創建初始化棋盤方法initChessSquare(x,y):根據棋盤圖片的交叉點個數,遍歷其所有交叉點坐標。
②創建監聽各種事件的方法eventHander():如:鼠標點擊退出位置,程序能實現退出響應(退出很重要,因為游戲界面的顯示就是一個死循環whileTrue;一個不斷刷新界面(背景圖片)的過程,因此,不做退出操作,此窗口會進入死鎖狀態,用戶將無法操作);鼠標只有點擊棋盤的交叉點位置時,才通過pygame.mouse.get_pos()獲取鼠標點擊的坐標并給出相應的棋子類型value。通過列表封裝后,再存入到全局列表initChessList中。
③創建判斷輸贏的規則方法judgeResult(i,j,value):創建標志位flag為False,當滿足贏的規則時,標志位flag再為True;判斷橫向、縱向、左斜向、右斜向有沒有出現5連(在邊緣依次向內逐一遍歷,是否五個棋子的類型一樣,一樣則為贏,即五子連珠)
④創建主方法main():其中包含初始化游戲環境pygame.init();繪制游戲窗口pygame.display.set_mode((600,600),0,0)(其中第一個參數(600,600)為設定窗口的大小,第二個參數為標志位,如果不用什么特性就指定為0(指定為FULLSCREEN時,繪制的是一個全屏窗口,如果沒有相應的退出機制,只有按
菜單鍵
才能跳回之前界面),第三個參數為色深);通過pygame.image.load(“圖片路徑”)的方法加載棋子以及判贏的圖片;遍歷全局列表initChessList中的子列表,再遍歷子列表中封裝的棋子類型value,通過之前的響應值來繪制相應棋子類型的圖片;當其中一方為贏時,清空棋盤,重新初始化棋盤,繪制贏的圖片,再更新顯示的視圖;最后調用監聽事件方法(函數),監聽用戶的鼠標操作。
⑤定義入口函數,調用主方法main()。
代碼如下:
import sys import time import pygame #導入pygame游戲模塊 from pygame.locals import *Chessboardlist = [] #保存棋盤坐標 initRole = 1 #1:代表白棋; 2:代表黑棋 resultFlag = 0 #結果標志class Gobang():def __init__(self,x,y,value):'''x: 代表x軸坐標y: 代表y軸坐標value: 當前坐標點的棋子:0:沒有棋子 1:白子 2:黑子'''self.x = x #初始化成員變量self.y = yself.value = valuedef initChessboard(x,y): #初始化棋盤for i in range(15): # 每一行的交叉點坐標rowlist = []for j in range(15): # 每一列的交叉點坐標pointX = x+ j*40pointY = y+ i*40sp = Gobang(pointX,pointY,0)rowlist.append(sp)Chessboardlist.append(rowlist)def eventHander(): #監聽各種事件for event in pygame.event.get(): #pygame.event.get() 獲取事件的返回值global initRoleif event.type == QUIT: #事件類型為退出時pygame.quit() #令Pygame庫停止工作sys.exit() #終止程序,在調用sys.exit()終止程序之前,總是應該先調用pygame.quit()if event.type == MOUSEBUTTONDOWN: #當點擊鼠標時x,y = pygame.mouse.get_pos() #獲取點擊鼠標的位置坐標i=0j=0for temp in Chessboardlist:for point in temp:if x>=point.x-10 and x<=point.x+10 and y>=point.y-10 and y<=point.y+10:if point.value == 0 and initRole == 1: #當棋盤位置為空;棋子類型為白棋point.value = 1 #鼠標點擊時,棋子為白棋judgeResult(i,j,1)initRole = 2 #切換角色elif point.value == 0 and initRole ==2: #當棋盤位置為空;棋子類型為黑棋point.value = 2 #鼠標點擊時,棋子為黑棋judgeResult(i,j,2)initRole = 1 #切換角色breakj+=1i+=1j=0def judgeResult(i,j,value): #橫向判斷global resultFlagflag = Falsefor x in range(j - 4, j + 5): # 橫向有沒有出現5連(在邊緣依次逐一遍歷,是否五個棋子的類型一樣)if x >= 0 and x + 4 < 15 :if Chessboardlist[i][x].value == value and \Chessboardlist[i][x + 1].value == value and \Chessboardlist[i][x + 2].value == value and \Chessboardlist[i][x + 3].value == value and \Chessboardlist[i][x + 4].value == value :flag = Truebreakpassfor x in range(i - 4, i + 5): # 縱向有沒有出現5連(在邊緣依次逐一遍歷,是否五個棋子的類型一樣)if x >= 0 and x + 4 < 15:if Chessboardlist[x][j].value == value and \Chessboardlist[x + 1][j].value == value and \Chessboardlist[x + 2][j].value == value and \Chessboardlist[x + 3][j].value == value and \Chessboardlist[x + 4][j].value == value:flag = Truebreakpass# 先判斷東北方向的對角下輸贏 x 列軸, y是行軸 , i 是行 j 是列(右斜向)(在邊緣依次逐一遍歷,是否五個棋子的類型一樣)for x, y in zip(range(j + 4, j - 5, -1), range(i - 4, i + 5)):if x >= 0 and x + 4 < 15 and y + 4 >= 0 and y < 15:if Chessboardlist[y][x].value == value and \Chessboardlist[y - 1][x + 1].value == value and \Chessboardlist[y - 2][x + 2].value == value and \Chessboardlist[y - 3][x + 3].value == value and \Chessboardlist[y - 4][x + 4].value == value:flag = True# 2、判斷西北方向的對角下輸贏 x 列軸, y是行軸 , i 是行 j 是列(左斜向)(在邊緣依次逐一遍歷,是否五個棋子的類型一樣)for x, y in zip(range(j - 4, j + 5), range(i - 4, i + 5)):if x >= 0 and x + 4 < 15 and y >= 0 and y + 4 < 15:if Chessboardlist[y][x].value == value and \Chessboardlist[y + 1][x + 1].value == value and \Chessboardlist[y + 2][x + 2].value == value and \Chessboardlist[y + 3][x + 3].value == value and \Chessboardlist[y + 4][x + 4].value == value:flag = Trueif flag: #如果條件成立,證明五子連珠resultFlag = value #獲取成立的棋子顏色print("白棋贏" if value ==1 else "黑棋贏")# 加載素材 def main():global Chessboardlist,resultFlaginitChessboard(27,27)pygame.init() # 初始化游戲環境screen = pygame.display.set_mode((620,620),0,0) # 創建游戲窗口 # 第一個參數是元組:窗口的長和寬pygame.display.set_caption("大碗吃不下") # 添加游戲標題background = pygame.image.load("bg_20190825_083840.png") #加載背景圖片whiteStorn = pygame.image.load("storn_white_20190825_083840.png") #加載白棋圖片blackStorn = pygame.image.load("storn_black.png") #加載黑棋圖片resultStorn = pygame.image.load("resultStorn.jpg")#加載 贏 時的圖片rect = blackStorn.get_rect()while True:screen.blit(background,(0,0))for temp in Chessboardlist:for point in temp:if point.value == 1: #當棋子類型為1時,繪制白棋screen.blit(whiteStorn,(point.x-18,point.y-18))elif point.value == 2: #當棋子類型為2時,繪制黑棋screen.blit(blackStorn,(point.x-18,point.y-18))if resultFlag >0:Chessboardlist = [] # 清空棋盤initChessboard(27,27) # 重新初始化棋盤screen.blit(resultStorn,(200,200)) #繪制獲勝時的圖片pygame.display.update() #更新視圖if resultFlag >0:time.sleep(3)resultFlag = 0 #置空之前的獲勝結果eventHander() #調用之前定義的事件函數 if __name__ == '__main__':main() #調用主函數繪制窗口pass注意!!!
其中用到的圖片:黑棋、白棋、棋盤,可以通過百度網盤獲取,但一定記得要將圖片與代碼源文件保存在一個文件夾中才可以運行成功
鏈接:https://pan.baidu.com/s/1EXnVDuuSxYaI2HrmXhpHog
提取碼:eujv
| 加油加油 |
總結
以上是生活随笔為你收集整理的用Python代码实现五子棋游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【youcans 的 OpenCV 例程
- 下一篇: Mac下配置sublime实现LaTeX