使用pygame进行游戏开发
Pygame是一个开源的Python模块,专门用于多媒体应用(如电子游戏)的开发,其中包含对图像、声音、视频、事件、碰撞等的支持。Pygame建立在SDL的基础上,SDL是一套跨平台的多媒体开发库,用C语言实现,被广泛的应用于游戏、模拟器、播放器等的开发。而Pygame让游戏开发者不再被底层语言束缚,可以更多的关注游戏的功能和逻辑。
具体功能可以查看pygame的官方网站
五子棋游戏制作
制作游戏窗口
可以通过pygame中draw模块的函数在窗口上绘图,可以绘制的图形包括:线条、矩形、多边形、圆、椭圆、圆弧等。需要说明的是,屏幕坐标系是将屏幕左上角设置为坐标原点(0, 0),向右是x轴的正向,向下是y轴的正向,在表示位置或者设置尺寸的时候,我们默认的单位都是像素。所谓像素就是屏幕上的一个点,你可以用浏览图片的软件试着将一张图片放大若干倍,就可以看到这些点。pygame中表示颜色用的是色光三原色表示法,即通过一个元组或列表来指定颜色的RGB值,每个值都在0~255之间,因为是每种原色都用一个8位(bit)的值来表示,三种颜色相当于一共由24位构成,这也就是常说的“24位颜色表示法”。
import pygame
def main():
# 初始化导入的pygame中的模块
pygame.init()
screen = pygame.display.set_mode([640, 640]) # 初始化用于显示的窗口并设置窗口尺寸
pygame.display.set_caption('五子棋') # 设置当前窗口的标题
screen.fill([218, 165, 105]) # 填充背景色 红绿蓝三原色
running = True
while running: # 开启一个事件循环处理发生的事件
for event in pygame.event.get(): # 从消息队列中获取事件并对事件进行处理
if event.type == pygame.QUIT:
running = False
if __name__ == '__main__':
main()
画棋盘
创建棋子类对象和棋盘类对象,棋盘类里面创建一个15*15的数组的属性,再写一个重置棋盘的方法,令这个棋盘数组全部等于空,还有画棋盘的方法,通过pygame的draw模块在窗口上绘画棋盘、天元、边框和棋子,还有一个判断该位置是否有棋子,可以下的方法
class Chess(object):
"""棋子类"""
def __init__(self, x, y, is_black):
self._is_black = is_black
self._row = x
self._col = y
@property
def is_black(self):
return self._is_black
@property
def row(self):
return self._row
@property
def col(self):
return self._col
class RenjuBoard(object):
"""棋盘类"""
def __init__(self):
self._board = [[]] * 15
self.reset()
def reset(self):
"""重置棋盘"""
for row in range(len(self._board)):
self._board[row] = [EMPTY] * 15
def move(self, row, col, is_black):
"""判断是否有棋子"""
if self._board[row][col] == EMPTY:
self._board[row][col] = BLACK if is_black else WHITE
return True
return False
def draw(self, screen):
"""画棋盘"""
for i in range(1, 16): # 画格子:窗口,颜色,起始位置,结束位置,粗细
pygame.draw.line(screen, black_color, [40, 40 * i], [600, 40 * i], 1)
pygame.draw.line(screen, black_color, [40 * i, 40], [40 * i, 600], 1)
pygame.draw.rect(screen, black_color, [36, 36, 568, 568], 4) # 画边框
# 画圆 窗口,颜色,位置,半径,0实心
pygame.draw.circle(screen, black_color, [320, 320], 4, 0)
pygame.draw.circle(screen, black_color, [160, 160], 3, 0)
pygame.draw.circle(screen, black_color, [160, 480], 3, 0)
pygame.draw.circle(screen, black_color, [480, 480], 3, 0)
pygame.draw.circle(screen, black_color, [480, 160], 3, 0)
for row in range(len(self._board)):
for col in range(len(self._board[row])):
if self._board[row][col] != EMPTY:
ccolor = black_color if self._board[row][col] == BLACK else white_color
pos = [40 * (col + 1), 40 * (row + 1)]
pygame.draw.circle(screen, ccolor, pos, 20, 0)
完善主函数 事件处理
判断输赢,绘画文字,获取鼠标点击事件,绘画棋盘等
def main():
board = RenjuBoard() # 创建棋盘对象
chess = [[EMPTY] * 16 for _ in range(16)] # 棋子位置
is_black = True # 黑白棋分辨变量
pygame.init() # 初始化pygame
screen = pygame.display.set_mode([640, 640]) # 初始化用于显示的窗口并设置窗口尺寸
pygame.display.set_caption('五子棋') # 设置当前窗口的标题
screen.fill([218, 165, 105]) # 填充背景色 红绿蓝三原色
board.draw(screen) # 画棋盘
pygame.display.flip() # 刷新窗口
runing = True # 是否退出游戏变量
gameover = True # 游戏是否结束变量
while runing: # 开启一个事件循环处理发生的事件
for event in pygame.event.get(): # 从消息队列中获取事件并对事件进行处理
if event.type == pygame.QUIT:
runing = False
elif event.type == pygame.KEYUP:
if event.key == pygame.K_F2:
board.reset()
gameover = True
is_black = True
pygame.display.flip()
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1 and gameover: # 鼠标点击事件
x, y = event.pos
if 20 < x <= 600 and 20 < y < 600:
row = round((y - 40) / 40)
col = round((x - 40) / 40)
if board.move(row, col, is_black):
screen.fill([218, 165, 105])
board.draw(screen)
chess[col][row] = 1 if is_black