Hello, 大家好,從本期開(kāi)始,我們就開(kāi)始開(kāi)發(fā)我們五子棋小游戲吟孙!
五子棋游戲,規(guī)則簡(jiǎn)單聚蝶,比較適合我這種新手~
我們將五子棋游戲的開(kāi)發(fā)大概分為一下幾個(gè)步驟
- 畫出棋盤和棋子
- 游戲的開(kāi)始和結(jié)束畫面
- 落子處理
- 背景音樂(lè)和落子聲音
- AI 對(duì)局
本期我們先畫出我們漂亮的棋盤吧杰妓。
棋盤
- 首先看一下我們的目錄結(jié)構(gòu)
> fiveinrow$ tree
.
├── fiveinrow.py
├── images
│ └── back.png
└── music
├── background.mp3
└── buw.wav
images 下有一張背景圖片, music 下面放了我們的背景音樂(lè)和落子的音效碘勉,fiveinrow.py 就是我們的代碼了巷挥。
- 正式開(kāi)工了,先搭一下pygame的游戲框架验靡,主要是導(dǎo)入包倍宾、初始化、加載圖片和主循環(huán)胜嗓。
這里需要解釋一下pygame的屏幕像素點(diǎn)的設(shè)置高职,左上角為起點(diǎn),向右寬度逐漸增加辞州,向下高度逐漸增加初厚。
# 導(dǎo)入我們需要用到的包
import pygame
import os
# 初始化我們的pygame
pygame.init()
# 初始化mixer (因?yàn)橄挛奈覀冃枰玫揭魳?lè))
pygame.mixer.init()
# 設(shè)置我們的屏幕大小和標(biāo)題
WIDTH = 720
HEIGHT = 720
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("五子棋")
# 設(shè)置一個(gè)定時(shí)器,用于固定時(shí)間刷新屏幕孙技,而不是一直不停的刷新,浪費(fèi)CPU資源
FPS = 30
clock = pygame.time.Clock()
# 加載背景圖片
base_folder = os.path.dirname(__file__)
img_folder = os.path.join(base_folder, 'images')
background_img = pygame.image.load(os.path.join(img_folder, 'back.png')).convert()
我們的主循環(huán)也很簡(jiǎn)單:
running = True
while running:
# 設(shè)置屏幕刷新頻率
clock.tick(FPS)
# 處理不同事件
for event in pygame.event.get():
# 檢查是否關(guān)閉窗口
if event.type == pygame.QUIT:
running = False
# 畫出棋盤
draw_background(screen)
# 刷新屏幕
pygame.display.flip()
- 棋盤的繪制
棋盤的繪制分為三個(gè)步驟- 畫背景圖片
- 畫出網(wǎng)格線
- 畫出五個(gè)小黑點(diǎn)(圍棋棋盤上有九個(gè))
接下來(lái)我們畫棋盤的函數(shù)主要用到了一下幾個(gè)函數(shù):
- screen.blit排作,這個(gè)函數(shù)就是復(fù)制像素點(diǎn)到指定位置牵啦,第一個(gè)參數(shù)是源,第二個(gè)是位置(左上角的坐標(biāo))
- pygame.draw.line妄痪,這個(gè)函數(shù)的作用是畫線哈雏,第一個(gè)參數(shù)為我們的屏幕 screen,第二個(gè)參數(shù)為顏色,第三個(gè)參數(shù)為起點(diǎn)裳瘪,第四個(gè)參數(shù)為終點(diǎn)土浸。
- pygame.draw.circle,畫圓形彭羹,第一二哥參數(shù)和和畫線的一樣黄伊,第三四個(gè)參數(shù)分別為圓心和半徑。
OK~ 進(jìn)入大菜~
# 畫出棋盤
def draw_background(surf):
# 加載背景圖片
surf.blit(background_img, (0, 0))
# 畫網(wǎng)格線派殷,棋盤為 19行 19列的
# 1. 畫出邊框还最,這里 GRID_WIDTH = WIDTH // 20
rect_lines = [
((GRID_WIDTH, GRID_WIDTH), (GRID_WIDTH, HEIGHT - GRID_WIDTH)),
((GRID_WIDTH, GRID_WIDTH), (WIDTH - GRID_WIDTH, GRID_WIDTH)),
((GRID_WIDTH, HEIGHT - GRID_WIDTH),
(WIDTH - GRID_WIDTH, HEIGHT - GRID_WIDTH)),
((WIDTH - GRID_WIDTH, GRID_WIDTH),
(WIDTH - GRID_WIDTH, HEIGHT - GRID_WIDTH)),
]
for line in rect_lines:
pygame.draw.line(surf, BLACK, line[0], line[1], 2)
# 畫出中間的網(wǎng)格線
for i in range(17):
pygame.draw.line(surf, BLACK,
(GRID_WIDTH * (2 + i), GRID_WIDTH),
(GRID_WIDTH * (2 + i), HEIGHT - GRID_WIDTH))
pygame.draw.line(surf, BLACK,
(GRID_WIDTH, GRID_WIDTH * (2 + i)),
(HEIGHT - GRID_WIDTH, GRID_WIDTH * (2 + i)))
# 畫出棋盤中的五個(gè)點(diǎn),圍棋棋盤上為9個(gè)點(diǎn)毡惜,這里我們只畫5個(gè)
circle_center = [
(GRID_WIDTH * 4, GRID_WIDTH * 4),
(WIDTH - GRID_WIDTH * 4, GRID_WIDTH * 4),
(WIDTH - GRID_WIDTH * 4, HEIGHT - GRID_WIDTH * 4),
(GRID_WIDTH * 4, HEIGHT - GRID_WIDTH * 4),
(GRID_WIDTH * 10, GRID_WIDTH * 10)
]
for cc in circle_center:
pygame.draw.circle(surf, BLACK, cc, 5)
最后看一下效果~~
five-in-row-back.png
完整的代碼可以去我的 github 看拓轻,點(diǎn)擊這里進(jìn)入GitHub。
如果這篇文章對(duì)您有幫助经伙,贊賞一下吧~
您的支持是我繼續(xù)創(chuàng)作的動(dòng)力~~~