Python 贪吃蛇游戏

设计内容:

贪吃蛇小游戏

使用工具:

Geany编辑器,Python中的pygame模块

游戏预览图:

Python 贪吃蛇游戏

详细代码:

 

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.总结

游戏做的比较简单,有不足之处可以留言。