在开始讲解之前先来感受下游戏
好了废话不多说上代码
1.初始化游戏界面和一些必要的全局变量
# 游戏窗口的长和宽
X = 640
Y = 480
def __init__(self):
# 初始化Pygame库
pygame.init()
# 初始化一个游戏界面窗口
self.DISPLAY = pygame.display.set_mode((self.X,self.Y))
# 设置游戏窗口的标题
pygame.display.set_caption('Snake Game')
# 定义一个变量来控制游戏速度
self.FPSCLOCK = pygame.time.Clock()
# 初始化游戏界面内使用的字体
self.BASICFONT = pygame.font.SysFont("SIMYOU.TTF", 80)
# 定义颜色变量
self.BLACK = pygame.Color(0, 0, 0)
self.WHITE = pygame.Color(255, 255, 255)
self.RED = pygame.Color(255, 0, 0)
self.GREY = pygame.Color(150, 150, 150)
# 蛇的初始方向
self.direction = "right"
# 食物标记:0代表食物已被吃掉;1代表未被吃掉。
self.food_flag = 1
self.UP = 'up'
self.DOWN = 'down'
self.LEFT = 'left'
self.RIGHT = 'right'
2.定义随机产生位置的函数
def random_position(self):
"""
蛇或者食物产生随机的位置,但是不能超过窗口的大小
:return:
"""
x = random.randint(20,self.X-20)
y = random.randint(20,self.Y-20)
return [x,y]
3.画出蛇的函数
def drawSnake(self,snake_Body):
"""
画出蛇的位置 蛇的默认大小设为20,20
:return:
"""
# 画出贪吃蛇
for i in snake_Body:
pygame.draw.rect(self.DISPLAY, self.WHITE, Rect(i[0], i[1], 20, 20))
4.画出食物
# 画出食物的位置
def drawFood(self,food_Position):
pygame.draw.rect(self.DISPLAY, self.RED, Rect(food_Position[0], food_Position[1], 20, 20))
5.定义键盘事件
def press(self):
# 检测按键等Pygame事件
for event in pygame.event.get():
if event.type == QUIT:
# 接收到退出事件后,退出程序
pygame.quit()
sys.exit()
# 判断键盘事件,用 方向键 或 wsad 来表示上下左右
elif event.type == KEYDOWN:
if (event.key == K_UP or event.key == K_w) and self.direction != self.DOWN:
self.direction = self.UP
print(1111111111111111111111111)
if (event.key == K_DOWN or event.key == K_s) and self.direction != self.UP:
self.direction = self.DOWN
if (event.key == K_LEFT or event.key == K_a) and self.direction != self.RIGHT:
self.direction = self.LEFT
if (event.key == K_RIGHT or event.key == K_d) and self.direction != self.LEFT:
self.direction = self.RIGHT
5.改变方向
def change_head(self,snake_Head):
# 根据键盘的输入,改变蛇的头部,进行转弯操作
if self.direction == self.LEFT:
snake_Head[0] -= 20
if self.direction == self.RIGHT:
snake_Head[0] += 20
if self.direction == self.UP:
snake_Head[1] -= 20
if self.direction == self.DOWN:
snake_Head[1] += 20
6.判断是否被吃
def is_eaten(self,snake_Head,food_Position,snake_Body):
# 判断是否吃掉食物
if snake_Head[0] == food_Position[0] and snake_Head[1] == food_Position[1]:
self.food_flag = 0
else:
# 因为每一次循环会加入一个头部,所以需要删除一个
snake_Body.pop()
7.定义打印当前得分
def drawScore(self,score):
# 设置分数的显示颜色
score_Surf = self.BASICFONT.render('%s' % (score), True, self.GREY)
# 设置分数的位置
score_Rect = score_Surf.get_rect()
score_Rect.midtop = (320, 240)
# 绑定以上设置到句柄
self.DISPLAY.blit(score_Surf, score_Rect)
8.游戏结束
def GameOver(self):
# 设置GameOver的显示颜色
GameOver_Surf = self.BASICFONT.render('Game Over!', True, self.GREY)
# 设置GameOver的位置
GameOver_Rect = GameOver_Surf.get_rect()
GameOver_Rect.midtop = (320, 10)
# 绑定以上设置到句柄
self.DISPLAY.blit(GameOver_Surf, GameOver_Rect)
pygame.display.flip()
# 等待3秒
time.sleep(3)
# 退出游戏
pygame.quit()
# 退出程序
sys.exit()
所有代码如下:
import random
import sys
import time
import pygame
from pygame.locals import *
class TanGame(object):
# 游戏窗口的长和宽
X = 640
Y = 480
def __init__(self):
# 初始化Pygame库
pygame.init()
# 初始化一个游戏界面窗口
self.DISPLAY = pygame.display.set_mode((self.X,self.Y))
# 设置游戏窗口的标题
pygame.display.set_caption('Snake Game')
# 定义一个变量来控制游戏速度
self.FPSCLOCK = pygame.time.Clock()
# 初始化游戏界面内使用的字体
self.BASICFONT = pygame.font.SysFont("SIMYOU.TTF", 80)
# 定义颜色变量
self.BLACK = pygame.Color(0, 0, 0)
self.WHITE = pygame.Color(255, 255, 255)
self.RED = pygame.Color(255, 0, 0)
self.GREY = pygame.Color(150, 150, 150)
# 蛇的初始方向
self.direction = "right"
# 食物标记:0代表食物已被吃掉;1代表未被吃掉。
self.food_flag = 1
self.UP = 'up'
self.DOWN = 'down'
self.LEFT = 'left'
self.RIGHT = 'right'
def random_position(self):
"""
蛇或者食物产生随机的位置,但是不能超过窗口的大小
:return:
"""
x = random.randint(20,self.X-20)
y = random.randint(20,self.Y-20)
return [x,y]
def drawSnake(self,snake_Body):
"""
画出蛇的位置 蛇的默认大小设为20,20
:return:
"""
# 画出贪吃蛇
for i in snake_Body:
pygame.draw.rect(self.DISPLAY, self.WHITE, Rect(i[0], i[1], 20, 20))
# 画出食物的位置
def drawFood(self,food_Position):
pygame.draw.rect(self.DISPLAY, self.RED, Rect(food_Position[0], food_Position[1], 20, 20))
# 打印出当前得分
def drawScore(self,score):
# 设置分数的显示颜色
score_Surf = self.BASICFONT.render('%s' % (score), True, self.GREY)
# 设置分数的位置
score_Rect = score_Surf.get_rect()
score_Rect.midtop = (320, 240)
# 绑定以上设置到句柄
self.DISPLAY.blit(score_Surf, score_Rect)
def press(self):
# 检测按键等Pygame事件
for event in pygame.event.get():
if event.type == QUIT:
# 接收到退出事件后,退出程序
pygame.quit()
sys.exit()
# 判断键盘事件,用 方向键 或 wsad 来表示上下左右
elif event.type == KEYDOWN:
if (event.key == K_UP or event.key == K_w) and self.direction != self.DOWN:
self.direction = self.UP
print(1111111111111111111111111)
if (event.key == K_DOWN or event.key == K_s) and self.direction != self.UP:
self.direction = self.DOWN
if (event.key == K_LEFT or event.key == K_a) and self.direction != self.RIGHT:
self.direction = self.LEFT
if (event.key == K_RIGHT or event.key == K_d) and self.direction != self.LEFT:
self.direction = self.RIGHT
def change_head(self,snake_Head):
# 根据键盘的输入,改变蛇的头部,进行转弯操作
if self.direction == self.LEFT:
snake_Head[0] -= 20
if self.direction == self.RIGHT:
snake_Head[0] += 20
if self.direction == self.UP:
snake_Head[1] -= 20
if self.direction == self.DOWN:
snake_Head[1] += 20
def is_eaten(self,snake_Head,food_Position,snake_Body):
# 判断是否吃掉食物
if snake_Head[0] == food_Position[0] and snake_Head[1] == food_Position[1]:
self.food_flag = 0
else:
# 因为每一次循环会加入一个头部,所以需要删除一个
snake_Body.pop()
def GameOver(self):
# 设置GameOver的显示颜色
GameOver_Surf = self.BASICFONT.render('Game Over!', True, self.GREY)
# 设置GameOver的位置
GameOver_Rect = GameOver_Surf.get_rect()
GameOver_Rect.midtop = (320, 10)
# 绑定以上设置到句柄
self.DISPLAY.blit(GameOver_Surf, GameOver_Rect)
pygame.display.flip()
# 等待3秒
time.sleep(3)
# 退出游戏
pygame.quit()
# 退出程序
sys.exit()
def run(self):
# 贪吃蛇的初始位置
snake_Head = self.random_position()
# 贪吃蛇的身体
snake_Body = [[snake_Head[0],snake_Head[1]],[snake_Head[0]-20,snake_Head[1]]]
# 食物的位置
food_Position = self.random_position()
while True:
# 定义按键
self.press()
self.change_head(snake_Head)
# 将蛇的头部当前的位置加入到蛇身的列表中
snake_Body.insert(0, list(snake_Head))
# 判断蛇是否被吃掉
self.is_eaten(snake_Head, food_Position, snake_Body)
# 生成新的食物
if self.food_flag == 0:
food_Position = self.random_position()
self.food_flag = 1
self.DISPLAY.fill(self.BLACK)
# 画出贪吃蛇
self.drawSnake(snake_Body)
# 画出食物的位置
self.drawFood(food_Position)
# 打印出玩家的分数
self.drawScore(len(snake_Body) - 1)
# 刷新Pygame的显示层
pygame.display.flip()
# 控制游戏速度
self.FPSCLOCK.tick(7)
'''游戏结束的判断'''
# 贪吃蛇触碰到边界
if snake_Head[0] < 0 or snake_Head[0] > 620:
self.GameOver()
if snake_Head[1] < 0 or snake_Head[1] > 460:
self.GameOver()
# 贪吃蛇触碰到自己
for i in snake_Body[1:]:
if snake_Head[0] == i[0] and snake_Head[1] == i[1]:
self.GameOver()
if __name__ == '__main__':
# 创建游戏对象
tangame = TanGame()
tangame.run()