童年記憶第五彈?。?!用python簡簡單單開發(fā)一個五子棋

經(jīng)典復(fù)刻—用python做童年玩過的小游戲

童年記憶第一彈——俄羅斯方塊

童年記憶第二彈——植物大戰(zhàn)僵尸

童年記憶第三彈——天天酷跑

童年記憶第四彈——胖鳥先飛

前言

剛更新完第四彈,第五彈馬上就跟著發(fā)了,沒想到吧,我就是如此的高質(zhì)量且高產(chǎn),話不多說,第五彈分享的游戲是五子棋。

五子棋的規(guī)則大家都清楚,是大家在閑暇時間娛樂的一種方式。很多人都感覺做“游戲”這個詞匯聽著就很難,不知道怎么去實現(xiàn)。那么“接下來就是見證奇跡的時刻”。

思路:

(1)首先準(zhǔn)備棋盤的圖片和棋子圖片(白棋、黑棋),獲勝時的圖片共四張。想要圖片資源可以點擊此鏈接: https://pan.baidu.com/s/13Ajqv29YXL2zWlDNk63rxA 提取碼: rvh2 ;最好將圖片文件夾放在自己要創(chuàng)建的項目里。
(2)以下是編寫單機五子棋程序的幾個重要部分:
【1】創(chuàng)建初始化棋盤方法initChessSquare(x,y):根據(jù)棋盤圖片的交叉點個數(shù),遍歷其所有交叉點坐標(biāo)。
【2】創(chuàng)建監(jiān)聽各種事件的方法eventHander():如:鼠標(biāo)點擊退出位置,程序能實現(xiàn)退出響應(yīng)(退出很重要,因為游戲界面的顯示就是一個死循環(huán)whileTrue;一個不斷刷新界面(背景圖片)的過程,因此,不做退出操作,此窗口會進入死鎖狀態(tài),用戶將無法操作);鼠標(biāo)只有點擊棋盤的交叉點位置時,才通過pygame.mouse.get_pos()獲取鼠標(biāo)點擊的坐標(biāo)并給出相應(yīng)的棋子類型value。通過列表封裝后,再存入到全局列表initChessList中。
【3】創(chuàng)建判斷輸贏的規(guī)則方法judgeResult(i,j,value):創(chuàng)建標(biāo)志位flag為False,當(dāng)滿足贏的規(guī)則時,標(biāo)志位flag再為True;判斷橫向、縱向、左斜向、右斜向有沒有出現(xiàn)5連(在邊緣依次向內(nèi)逐一遍歷,是否五個棋子的類型一樣,一樣則為贏,即五子連珠)
【4】創(chuàng)建主方法main():其中包含初始化游戲環(huán)境pygame.init();繪制游戲窗口pygame.display.set_mode((600,600),0,0)(其中第一個參數(shù)(600,600)為設(shè)定窗口的大小,第二個參數(shù)為標(biāo)志位,如果不用什么特性就指定為0(指定為FULLSCREEN時,繪制的是一個全屏窗口,如果沒有相應(yīng)的退出機制,只有按 菜單鍵 才能跳回之前界面),第三個參數(shù)為色深);通過pygame.image.load(“圖片路徑”)的方法加載棋子以及判贏的圖片;遍歷全局列表initChessList中的子列表,再遍歷子列表中封裝的棋子類型value,通過之前的響應(yīng)值來繪制相應(yīng)棋子類型的圖片;當(dāng)其中一方為贏時,清空棋盤,重新初始化棋盤,繪制贏的圖片,再更新顯示的視圖;最后調(diào)用監(jiān)聽事件方法(函數(shù)),監(jiān)聽用戶的鼠標(biāo)操作。
【5】定義入口函數(shù),調(diào)用主方法main()。
至此,單機五子棋完成,當(dāng)然,有的地方還可進一步完善,但對于初學(xué)者來說,如上的大體概括已經(jīng)受用了。如上思路只作為下面具體的代碼參考。

具體實現(xiàn)代碼如下:
import pygame        #導(dǎo)入pygame游戲模塊
import time
import sys
from pygame.locals import *

initChessList = []          #保存的是棋盤坐標(biāo)
initRole = 1                #1:代表白棋; 2:代表黑棋
resultFlag = 0              #結(jié)果標(biāo)志

class StornPoint():
    def __init__(self,x,y,value):
        '''
        :param x: 代表x軸坐標(biāo)
        :param y: 代表y軸坐標(biāo)
        :param value: 當(dāng)前坐標(biāo)點的棋子:0:沒有棋子 1:白子 2:黑子
        '''
        self.x = x            #初始化成員變量
        self.y = y
        self.value = value

def initChessSquare(x,y):     #初始化棋盤
    for i in range(15):       # 每一行的交叉點坐標(biāo)
        rowlist = []
        for j in range(15):   # 每一列的交叉點坐標(biāo)
            pointX = x+ j*40
            pointY = y+ i*40
            sp = StornPoint(pointX,pointY,0)
            rowlist.append(sp)
        initChessList.append(rowlist)

def eventHander():            #監(jiān)聽各種事件
    for event in pygame.event.get():
        global initRole
        if event.type == QUIT:#事件類型為退出時
            pygame.quit()
            sys.exit()
        if event.type == MOUSEBUTTONDOWN: #當(dāng)點擊鼠標(biāo)時
            x,y = pygame.mouse.get_pos()  #獲取點擊鼠標(biāo)的位置坐標(biāo)
            i=0
            j=0
            for temp in initChessList:
                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:   #當(dāng)棋盤位置為空;棋子類型為白棋
                            point.value = 1             #鼠標(biāo)點擊時,棋子為白棋
                            judgeResult(i,j,1)
                            initRole = 2                #切換角色
                        elif point.value == 0 and initRole ==2:  #當(dāng)棋盤位置為空;棋子類型為黑棋
                            point.value = 2             #鼠標(biāo)點擊時,棋子為黑棋
                            judgeResult(i,j,2)
                            initRole = 1                #切換角色
                        break
                    j+=1
                i+=1
                j=0

def judgeResult(i,j,value):   #橫向判斷
    global resultFlag
    flag = False
    for  x in  range(j - 4, j + 5):  # 橫向有沒有出現(xiàn)5連(在邊緣依次逐一遍歷,是否五個棋子的類型一樣)
        if x >= 0 and x + 4 < 15 :
            if initChessList[i][x].value == value and \
                initChessList[i][x + 1].value == value and \
                initChessList[i][x + 2].value == value and \
                initChessList[i][x + 3].value == value and \
                initChessList[i][x + 4].value == value :
                flag = True
                break
                pass
    for x in range(i - 4, i + 5):  # 縱向有沒有出現(xiàn)5連(在邊緣依次逐一遍歷,是否五個棋子的類型一樣)
        if x >= 0 and x + 4 < 15:
            if initChessList[x][j].value == value and \
                    initChessList[x + 1][j].value == value and \
                    initChessList[x + 2][j].value == value and \
                    initChessList[x + 3][j].value == value and \
                    initChessList[x + 4][j].value == value:
                flag = True
                break
                pass

    # 先判斷東北方向的對角下輸贏 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 initChessList[y][x].value == value and \
                    initChessList[y - 1][x + 1].value == value and \
                    initChessList[y - 2][x + 2].value == value and \
                    initChessList[y - 3][x + 3].value == value and \
                    initChessList[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 initChessList[y][x].value == value and \
                    initChessList[y + 1][x + 1].value == value and \
                    initChessList[y + 2][x + 2].value == value and \
                    initChessList[y + 3][x + 3].value == value and \
                    initChessList[y + 4][x + 4].value == value:
                flag = True

    if flag:               #如果條件成立,證明五子連珠
        resultFlag = value #獲取成立的棋子顏色
        print("白棋贏" if value ==1 else "黑棋贏")

# 加載素材
def main():
    global initChessList,resultFlag
    initChessSquare(27,27)
    pygame.init()     # 初始化游戲環(huán)境
    screen = pygame.display.set_mode((620,620),0,0)          # 創(chuàng)建游戲窗口 # 第一個參數(shù)是元組:窗口的長和寬
    pygame.display.set_caption("老手er五子棋")                # 添加游戲標(biāo)題
    background = pygame.image.load("images/bg.png")          #加載背景圖片
    whiteStorn = pygame.image.load("images/storn_white.png") #加載白棋圖片
    blackStorn = pygame.image.load("images/storn_black.png") #加載黑棋圖片
    resultStorn = pygame.image.load("images/resultStorn.jpg")#加載 贏 時的圖片
    rect = blackStorn.get_rect()

    while True:
        screen.blit(background,(0,0))
        for temp in initChessList:
            for point in temp:
                if point.value == 1:          #當(dāng)棋子類型為1時,繪制白棋
                    screen.blit(whiteStorn,(point.x-18,point.y-18))
                elif point.value == 2:        #當(dāng)棋子類型為2時,繪制黑棋
                    screen.blit(blackStorn,(point.x-18,point.y-18))

        if resultFlag >0:
            initChessList = []                 # 清空棋盤
            initChessSquare(27,27)             # 重新初始化棋盤
            screen.blit(resultStorn,(200,200)) #繪制獲勝時的圖片
        pygame.display.update()                #更新視圖

        if resultFlag >0:
            time.sleep(3)
            resultFlag = 0                     #置空之前的獲勝結(jié)果
        eventHander()                          #調(diào)用之前定義的事件函數(shù)
if __name__ == '__main__':
    main()        #調(diào)用主函數(shù)繪制窗口
    pass

總結(jié)

以上就是五子棋的源碼過程,大家可以寫一下玩一玩
我是白白,一個喜歡學(xué)習(xí)喜歡編程的年輕人
需要學(xué)習(xí)資料的請在評論區(qū)扣“1”
想學(xué)習(xí)python的可以關(guān)注私信我哦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容