pygame贪吃蛇
之前也写过一个贪吃蛇,不过代码比较短(虽然这个也不长),页面也不好看,有些地方也不合理,,,,就又在原来的基础上改进了一下,之前那个在这里
可以看见之前的那个一点击运行就开始游戏了也没有提示啥的,这次其实主要就是加了一个欢迎页面。。。当然也加了背景音乐。先看看效果吧:
运行以后:
欢迎界面:
点击“begin”:
就到了游戏的主页面(按空格或者点击画面中的任一位置可暂停):
点击quit就直接退出了,页面也不多就不演示了直接上代码吧
class Point():
row = 0
col = 0
def __init__(self, row, col):
self.row = row
self.col = col
def copy(self):
return Point(self.row,self.col)
import pygame
import random
import traceback
# 初始化
pygame.init()
W = 1134 # 屏幕的宽
H = 627 # 屏幕的高
ROW = 30 # 几行
COL = 40 # 几列 每个格有多大
size = (W, H)
window = pygame.display.set_mode(size)
pygame.display.set_caption('wlx贪吃蛇')
bakc_ground = pygame.image.load("snake_background.png").convert()
bg_color = (128, 128, 128) # 背景颜色
snake_color = (150, 150, 150) # 蛇身颜色
head = Point(int(ROW / 2), int(COL / 2)) # 蛇头
head_color = (20, 100, 100)
snakes = [
Point(head.row, head.col + 1),
Point(head.row, head.col + 2)
]
# 生成食物
def get_food():
while True:
pos = Point(random.randint(0, ROW - 1), random.randint(0, COL - 1))
# 是否跟蛇碰上
is_col = False
if head.row == pos.row and head.col == pos.col:
is_col = True
for snake in snakes:
if snake.row == pos.row and snake.col == pos.col:
is_col = True
break
if not is_col:
break
return pos
# 设置帧频,根据游戏的进程逐渐变快
frequency = 5
score = 0
#标题颜色
greed_color = (128, 255, 128)
def rect(point, color):
cell_width = W / COL # 格子的宽度
cell_height = H / ROW # 格子的高度
left = point.col * cell_width
top = point.row * cell_height
pygame.draw.rect(window,color,(left,top,cell_width,cell_height))
# 游戏刚开始的页面加载的图片啥的
greed_snake_font = pygame.font.Font("font.ttf", 72)
greed_snake_begin_image = pygame.image.load("begin.png").convert()
greed_snake_begin_rect = greed_snake_begin_image.get_rect()
greed_snake_quit_image = pygame.image.load("quit.png").convert()
greed_snake_quit_rect = greed_snake_quit_image.get_rect()
# 游戏开始的音效
pygame.mixer.music.load("snake_playground.wav")
pygame.mixer.music.set_volume(0.2)
eat_sound = pygame.mixer.Sound("snake_eat.wav")
eat_sound.set_volume(0.2)
over_sound = pygame.mixer.Sound("snake_over.wav")
over_sound.set_volume(0.2)
def main():
head = Point(int(ROW / 2), int(COL / 2)) # 蛇头
head_color = (20, 100, 100)
snakes = [
Point(head.row, head.col + 1),
Point(head.row, head.col + 2)
]
pygame.mixer.music.play(-1)
direct = 'left' # 蛇移动方向 left, right, up, down
paused = False
# 游戏循环
quit = True
clock = pygame.time.Clock()
# 定义坐标
food = get_food()
food_color = (255, 255, 0)
while quit :
# 处理事件
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
pygame.mixer.music.stop()
pygame.mixer.stop()
quit = False
elif event.type == pygame.KEYDOWN: # 按键 上下左右 对应键值可以通过print(event)打出来
if event.key == 273 or event.key == 119:
if direct == 'left' or direct == 'right':
direct = 'up'
elif event.key == 274 or event.key == 115:
if direct == 'left' or direct == 'right':
direct = 'down'
elif event.key == 276 or event.key == 97:
if direct == 'up' or direct == 'down':
direct = 'left'
elif event.key == 275 or event.key == 100:
if direct == 'up' or direct == 'down':
direct = 'right'
elif event.key == pygame.K_SPACE:
paused = not paused
if paused:
pygame.mixer.music.pause()
pygame.mixer.pause()
else:
pygame.mixer.music.unpause()
pygame.mixer.unpause()
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1 :
paused = not paused
if paused:
pygame.mixer.music.pause()
pygame.mixer.pause()
else:
pygame.mixer.music.unpause()
pygame.mixer.unpause()
# 做自己的事
if not paused:
# 吃东西
eat = head.row == food.row and head.col == food.col
if eat:
eat_sound.play()
food = get_food()
# 处理身子
# 1、把原来的头插入到snakes的头上
snakes.insert(0, head.copy())
# 2、把snakes的最后一个格子删掉
if not eat:
snakes.pop()
# 移动
if direct == 'left':
head.col -= 1
elif direct == 'right':
head.col += 1
elif direct == 'up':
head.row -= 1
else:
head.row += 1
# 检测
dead = False
# 1、撞墙
if head.col < 0 or head.row < 0 or head.col >= COL or head.row >= ROW:
over_sound.play()
pygame.mixer.music.stop()
pygame.mixer.stop()
dead = True
# 2、撞自己
for snake in snakes:
if head.col == snake.col and head.row == snake.row:
over_sound.play()
pygame.mixer.music.stop()
pygame.mixer.stop()
dead = True
break
if dead:
print("游戏结束")
quit = False
window.blit(bakc_ground, (0, 0))
# 渲染--画出来
# 屏幕背景颜色绘制
# 画蛇头
for snake in snakes:
rect(snake, snake_color)
rect(head, head_color)
# 画食物
rect(food, food_color)
pygame.display.flip() # 更新整个待显示的Surface 对象到屏幕上
# 设置帧频
clock.tick(frequency) # sleep(1000/60)
def begin_snake():
colck = pygame.time.Clock()
quit = True
while quit:
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
quit = False;
# 背景
pygame.draw.rect(window, bg_color, (0, 0, W, H))
# 设置游戏标题
greed_snake_text = greed_snake_font.render("wlx_GreedySnake", True, greed_color)
# 标题位置
title_pos = (280, 40)
# 显示
window.blit(greed_snake_text, title_pos)
greed_snake_begin_rect.left = (W - greed_snake_begin_rect.width) //2
greed_snake_begin_rect.top = 250
window.blit(greed_snake_begin_image, greed_snake_begin_rect)
greed_snake_quit_rect.left = (W - greed_snake_quit_rect.width) // 2
greed_snake_quit_rect.top = 400
window.blit(greed_snake_quit_image, greed_snake_quit_rect)
# 检查用户的鼠标操作
# 如果用户按下了鼠标左键
if pygame.mouse.get_pressed()[0]:
# 获取鼠标坐标
pos = pygame.mouse.get_pos()
# 用户点击“begin”
if greed_snake_begin_rect.left < pos[0] < greed_snake_begin_rect.right and \
greed_snake_begin_rect.top < pos[1] < greed_snake_begin_rect.bottom:
main()
# 用户点击“quit”
elif greed_snake_quit_rect.left < pos[0] < greed_snake_quit_rect.right and \
greed_snake_quit_rect.top < pos[1] < greed_snake_quit_rect.bottom:
quit = False
pygame.quit()
pygame.display.flip()
colck.tick(frequency)
if __name__ == '__main__':
try:
begin_snake()
except SystemExit:
pass
except:
traceback.print_exc()
pygame.quit()
input()
其实和之前那个代码相比只是用函数封装了一下(太久没写pygame了,光改一下都弄了好久。。。还是要多练啊。。。),不过现在这个看起来舒服多啦哈哈哈