pygame 写个简易贪吃蛇——pygame初次尝试

欢迎关注我的公众号【次烦】
(这个程序注释很少,不要问为什么,问就是忘了写,当我想起来后又懒得写了)

import pygame
import sys
from pygame.sprite import Group
from snake import Snake, Body
from fruit import Fruit
import game_functions as gf
from time import sleep

def run_game():
	pygame.init()
	screen = pygame.display.set_mode((700,400))
	pygame.display.set_caption("贪吃蛇")

	bg_color = (230,230,230)

	snake = Snake(screen)
	bodys = Group()

	body = Body(screen)
	body.create(snake)

	bodys.add(body)
	fruits = Group()

	gf.create_fruit(screen,fruits,snake)
	

	while True:
		gf.check_events(snake)
		gf.update_screen(screen,snake, fruits, body,bodys)

		sleep(0.01/snake.speed_factor)
		


run_game()

蛇头与蛇身

import pygame
from pygame.sprite import Sprite

class Snake(Sprite):
	"""蛇头"""

	def __init__(self, screen):
		#屏幕中央创建一个蛇头
		super(Snake, self).__init__()
		self.screen = screen

		#中央创建
		self.rect = pygame.Rect(0,0,10,10)
		self.rect.centerx = screen.get_rect().centerx
		self.rect.centery = screen.get_rect().centery

		self.color = (255,44,0)

		#表示移动方向,1234上右下左
		self.change = 2

		self.x = float(self.rect.centerx)
		self.y = float(self.rect.centery)

		self.foot = []
		self.length = 1
		self.score = 0

		# self.image =  pygame.image.load('image\\head.png')

		self.sleep = 0
		self.speed_factor = 1

	# def blitme(self):
	# 	"""在指定的位置绘制head"""							#此方法根据self.rect指定的位置将图像绘制到屏幕上
	# 	self.screen.blit(self.image,self.rect)

	def draw_snake(self):
		pygame.draw.rect(self.screen,self.color,self.rect)

class Body(Sprite):
	"""docstring for Body"""
	def __init__(self, screen):
		super(Body, self).__init__()
		self.screen = screen
		self.rect = pygame.Rect(0,0,10,10)
		self.color = (255,88,44)
		self.change = 2

		#图像
		# self.image =  pygame.image.load('image\\body.png')


	# def blitme(self):
	# 	"""在指定的位置绘制body"""							#此方法根据self.rect指定的位置将图像绘制到屏幕上
	# 	self.screen.blit(self.image,self.rect)

	def create(self,snake):
		if snake.change == 1:
			self.rect.top = snake.rect.bottom
			self.rect.centerx = snake.rect.centerx
			self.change = 1
		elif snake.change == 2:
			self.rect.right = snake.rect.left
			self.rect.centery = snake.rect.centery
			self.change = 2
		elif snake.change == 3:
			self.rect.bottom = snake.rect.top
			self.rect.centerx = snake.rect.centerx
			self.change = 3
		elif snake.change == 4:
			self.rect.left = snake.rect.right
			self.rect.centery = snake.rect.centery
			self.change = 4

		# self.rect.right = snake.rect.left
		# self.rect.centery = snake.rect.centery
		
		self.x = float(self.rect.centerx)
		self.y = float(self.rect.centery)

		
		

	def draw_body(self):
		pygame.draw.rect(self.screen,self.color,self.rect)
		pass

食物/水果

import pygame
from pygame.sprite import Sprite
import random

class Fruit(Sprite):
	"""果实"""
	def __init__(self, screen):
		super(Fruit, self).__init__()
		self.screen = screen
		self.color = (44,255,12)
		self.rect = pygame.Rect(0,0,10,10)

	

	def draw_fruit(self):
		pygame.draw.rect(self.screen,self.color,self.rect)
		pass

用到的函数

import sys
import pygame
import random
from pygame.sprite import Group
from snake import Snake, Body
from fruit import Fruit
from time import sleep


def update_screen(screen,snake,fruits,body,bodys):
	screen.fill((230,230,230))
	snake.draw_snake()
	#snake.blitme()
	
	update_fruit(screen,fruits, snake, bodys)
	for body in bodys:
		snake_go(body)
		body.draw_body()
		# body.blitme()
	check_body(bodys, snake)
	for fruit in fruits:
		fruit.draw_fruit()
	head_body(snake, bodys)
	check_bdry(snake, bodys)
	check_sleep(snake)
	pygame.display.flip()
	pass

def check_events(snake):
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			sys.exit()
		elif event.type == pygame.KEYDOWN:
			# if snake.change  == 1:
			# 	snake.y = snake.y-snake.y%10
			# elif snake.change  == 2:
			# 	snake.x = 10-snake.x%10+snake.x
			# elif snake.change  == 3:
			# 	snake.y = 10-snake.y%10+snake.y
			# elif snake.change  == 4:
			# 	snake.x = snake.x-snake.x%10

			if event.key == pygame.K_UP and snake.change != 3:
				snake.change = 1
			elif event.key == pygame.K_RIGHT and snake.change != 4:
				snake.change = 2
			elif event.key == pygame.K_DOWN and snake.change != 1:
				snake.change = 3
			elif event.key == pygame.K_LEFT and snake.change != 2:
				snake.change = 4 
			elif event.key == pygame.K_q:
				sys.exit()
			elif event.key == pygame.K_p:
				snake.sleep = 1
			snake.foot.append((snake.rect.centerx,snake.rect.centery,snake.change))
	snake_go(snake)

def snake_go(snake):
	if snake.change == 1:
		snake.y -= 1#0
		snake.rect.centery = snake.y
	elif snake.change == 2:
		snake.x += 1#0
		snake.rect.centerx = snake.x
	elif snake.change == 3:
		snake.y += 1#0
		snake.rect.centery = snake.y
	elif snake.change == 4:
		snake.x -= 1#0
		snake.rect.centerx = snake.x

	pass

def create_fruit(screen,fruits,snake):
	new_fruit = Fruit(screen)
	if snake.score > 170:
		new_fruit.color = (255,0,0)
		snake.speed_factor = 15
	elif snake.score > 140:
		new_fruit.color = (255,100,0)
		snake.speed_factor = 10
	elif snake.score > 110:
		new_fruit.color = (255,200,0)
		snake.speed_factor = 8
	elif snake.score > 90:
		new_fruit.color = (255,255,0)
		snake.speed_factor = 5
	elif snake.score > 60:
		new_fruit.color = (200,255,0)
		snake.speed_factor = 4
	elif snake.score > 30:
		new_fruit.color = (100,255,0)
		snake.speed_factor = 2



	new_fruit.rect.centerx = random.randint(5,695)#//10*10
	new_fruit.rect.centery = random.randint(5,395)#//10*10
	fruits.add(new_fruit)


def update_fruit(screen,fruits,snake,bodys):
	boom = pygame.sprite.spritecollideany(snake,fruits)

	if boom:
		fruits.empty()
		snake.score += 1
		create_fruit(screen,fruits,snake)

		num = 0
		for bd in bodys:
			num += 1
			# print("you got",snake.length)
			if num == snake.length :
				body = Body(screen)
				body.create(bd)
				snake.length += 1
				bodys.add(body)
				# print(snake.length)
				break

def check_body(bodys,snake):
	num = 0
	for bd in bodys:
		num += 1
		for i in snake.foot:
			if (bd.rect.centerx == i[0]) and (bd.rect.centery == i[1]):
				bd.change = i[2]

				if num == snake.length :
					if snake.foot:
						snake.foot.pop(0)
	pass

def head_body(snake,bodys):
	check_bodys = Group()
	num = 0
	for body in bodys:
		num += 1
		if num == 1:
			continue
		check_bodys.add(body)
	boom = pygame.sprite.spritecollideany(snake,check_bodys)
	
	if boom:
		print("Game Over!")
		print("Your Score:",snake.score)
		sys.exit()

def check_bdry(snake,bodys):
	if snake.x > 700:
		snake.x = 0
		print(snake.x)
	elif snake.x < 0:
		snake.x = 700
	snake.rect.centerx = snake.x

	if snake.y > 400:
		snake.y = 0
	elif snake.y < 0:
		snake.y = 400
	snake.rect.centery = snake.y

	for body in bodys:
		if body.x > 700:
			body.x = 0
		elif body.x < 0:
			body.x = 700
		body.rect.centerx = body.x

		if body.y > 400:
			body.y = 0
		elif body.y < 0:
			body.y = 400
		body.rect.centery = body.y

def check_sleep(snake):
	while snake.sleep == 1:
		sleep(1)
		for event in pygame.event.get():
			if event.key == pygame.K_p:
				snake.sleep = 0
				break

求解决

有个小问题,就是如果蛇头刚刚到边界正好转向,蛇身就会与蛇头分离…
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CI_FAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值