设计内容:
贪吃蛇小游戏
使用工具:
Geany编辑器,Python中的pygame模块
游戏预览图:
详细代码:
1. 游戏主进程模块:
import sys
from threading import Timer
import time
import pygame
from snake import Snake
from food import Food
import function as fun
def run_game():
'''游戏主进程'''
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption('Snake Eat')
snake_color = (60,60,60)
bg_color = (230,230,230)
snake = Snake(snake_color,screen)
snakes = [snake]
food = Food(screen)
#游戏难度设置5~10
speed = 9
while True:
fun.check_events(snakes)
time.sleep(1-speed/11)
for value in range(0,len(snakes)):
snakes[value].update(snakes)
fun.check_snake_food_collisions(snakes,food,screen)
fun.update_screen(screen,snakes,food)
fun.check_die(snakes)
run_game()
2.蛇头类
import pygame
from pygame.sprite import Sprite
class Snake():
'''蛇头类'''
def __init__(self,color,screen):
self.screen = screen
self.color = color
self.speed = 20
self.screen_rect = screen.get_rect()
self.rect = pygame.Rect(0,0,20,20)
self.rect.centerx = self.screen_rect.centerx - 10
self.rect.centery = self.screen_rect.centery - 10
self.centerx = float(self.rect.centerx)
self.centery = float(self.rect.centery)
#控制方向的列表
self.direct = [True,False,False,False]
self.number = 0
self.last_x = 0
self.last_y = 0
def draw_snake(self):
pygame.draw.rect(self.screen,self.color,self.rect)
def update(self,snakes):
#记录蛇头的当前位置
snakes[0].last_x = self.centerx
snakes[0].last_y = self.centery
key = self.direct.index(True)
if key == 0:
self.centery -= self.speed
elif key == 1:
self.centery += self.speed
elif key == 2:
self.centerx -= self.speed
elif key == 3:
self.centerx += self.speed
#更新蛇头的位置
snakes[0].rect.centerx = self.centerx
snakes[0].rect.centery = self.centery
3. 果实类
import pygame
from random import randint
class Food():
'''果实类'''
def __init__(self,screen):
self.screen = screen
self.color = (255,0,0)
self.screen_rect = screen.get_rect()
self.rect = pygame.Rect(0,0,20,20)
self.rect.centerx = randint(0,29) * 20 + 10
self.rect.centery = randint(0,19) * 20 + 10
def draw_food(self):
pygame.draw.rect(self.screen,self.color,self.rect)
def update(self,snakes):
'''果实不会出现在蛇身体上'''
flag = True
while flag:
flag = False
self.rect.centerx = randint(0,29) * 20 + 10
self.rect.centery = randint(0,19) * 20 + 10
for value in range(0,len(snakes)):
if self.rect.centerx == snakes[value].rect.centerx and self.rect.centery == snakes[value].rect.centery:
flag = True
4. 蛇身类
import pygame
from pygame.sprite import Sprite
class Snake_Body():
'''蛇身类'''
def __init__(self,color,screen,snakes):
self.screen = screen
self.color = color
self.speed = 20
self.screen_rect = screen.get_rect()
self.rect = pygame.Rect(0,0,20,20)
#获取上一块蛇身的前一次位置
self.rect.centerx = snakes[-1].last_x
self.rect.centery = snakes[-1].last_y
self.last_x = 0
self.last_y = 0
#记录snakes列表中每块蛇身体的index
self.number = -1
def draw_snake(self):
pygame.draw.rect(self.screen,self.color,self.rect)
def update(self,snakes):
#记录蛇身体中某一块的当前位置
snakes[self.number].last_x = snakes[self.number].rect.centerx
snakes[self.number].last_y = snakes[self.number].rect.centery
#更新蛇身体中某一块的位置
snakes[self.number].rect.centerx = snakes[self.number-1].last_x
snakes[self.number].rect.centery = snakes[self.number-1].last_y
5. 游戏函数模块
import sys
import pygame
from food import Food
from snake import Snake
from snake_body import Snake_Body
'''游戏函数模块'''
def check_events(snakes):
'''检查键盘事件,控制方向'''
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.type == pygame.QUIT:
sys.exit()
elif event.key == pygame.K_RIGHT:
if snakes[0].direct[2]:
break
else:
snakes[0].direct=[False,False,False,True]
elif event.key == pygame.K_LEFT:
if snakes[0].direct[3]:
break
else:
snakes[0].direct=[False,False,True,False]
elif event.key == pygame.K_UP:
if snakes[0].direct[1]:
break
else:
snakes[0].direct=[True,False,False,False]
elif event.key == pygame.K_DOWN:
if snakes[0].direct[0]:
break
else:
snakes[0].direct=[False,True,False,False]
elif event.key == pygame.K_q:
sys.exit()
def update_screen(screen,snakes,food):
screen.fill((230,230,230))
for value in range(0,len(snakes)):
snakes[value].draw_snake()
food.draw_food()
pygame.display.flip()
def check_snake_food_collisions(snakes,food,screen):
'''检测碰撞'''
collision = pygame.sprite.collide_rect(snakes[0],food)
if collision:
for value in range(0,len(snakes)):
snakes[value].number -= 1
food.update(snakes)
eat_food(snakes,screen,food)
def eat_food(snakes,screen,food):
'''吃到果实'''
snake_body = Snake_Body((0,0,255),screen,snakes)
snakes.append(snake_body)
def check_die(snakes):
'''检测死亡'''
if snakes[0].rect.centerx < 0 or snakes[0].rect.centery < 0 or snakes[0].rect.centerx > 600 or snakes[0].rect.centery > 400:
sys.exit()
for value in range(1,len(snakes)):
collision = pygame.sprite.collide_rect(snakes[0],snakes[value])
if collision:
sys.exit()
6.总结
游戏做的比较简单,有不足之处可以留言。