使用pygame模块 利用面向对象的思想编写贪吃蛇,主要用到pygame.sprite:
import pygame,sys
from snake_sprite import Game_sprite,Snake,Food
SCREEN_RECT=pygame.Rect(0,0,828,600)
IMG_URL="./image/bg.jpg"
#主类
class Snakegame(object):
def __init__(self):
self.screen=pygame.display.set_mode(SCREEN_RECT.size)
self.clock=pygame.time.Clock()
self.__create_sprites()
def __create_sprites(self):
bg=Game_sprite(IMG_URL)
self.snake=Snake()
for pos in self.snake.snake_point:
self.screen.blit(self.snake.image,pos)
food=Food()
self.bg_group=pygame.sprite.Group(bg)
self.snake_group=pygame.sprite.Group(self.snake)
self.food_group = pygame.sprite.Group(food)
def start_game(self):
while True:
#1.时钟设置
self.clock.tick(30)
#2.事件监听
self.__event_handler()
#3.碰撞检测
self.__check_collide()
#4.精灵更新
self.__update_sprites()
#5.屏幕更新
pygame.display.update()
def __event_handler(self):
for event in pygame.event.get():
if event.type==pygame.QUIT:
Snakegame.__game_over()
elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT and \
self.snake.direction !='L':
self.snake.speedy = 0
self.snake.speedx = 1
self.snake.direction = 'R'
elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT and \
self.snake.direction !='R':
self.snake.speedy = 0
self.snake.speedx = -1
self.snake.direction = 'L'
elif event.type == pygame.KEYDOWN and event.key == pygame.K_UP and \
self.snake.direction !='D':
self.snake.speedx = 0
self.snake.speedy = -1
self.snake.direction = 'U'
elif event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN and \
self.snake.direction !='U':
self.snake.speedx=0
self.snake.speedy=1
self.snake.direction='D'
def __check_collide(self):
pass
def __update_sprites(self):
self.bg_group.update()
self.bg_group.draw(self.screen)
self.snake_group.update()
self.snake_group.draw(self.screen)
self.food_group.update()
self.food_group.draw(self.screen)
@staticmethod
def __game_over():
pygame.quit()
exit()
#游戏启动
if __name__ == '__main__':
snake=Snakegame()
snake.start_game()
import pygame
import random
SNAKE_IMG="./image/snake.png"
FOOD_IMG="./image/food.jpg"
class Game_sprite(pygame.sprite.Sprite):
def __init__(self,img_name,speedx=1,speedy=0):
#调用父类的初始化方法
super(Game_sprite, self).__init__()
#属性
self.image=pygame.image.load(img_name)
self.rect=self.image.get_rect()
self.speedx=speedx
self.speedy=speedy
def update(self):
pass
#蛇实物
class Snake(Game_sprite):
def __init__(self,direction='R',snakelist=[[40,40],[80,40]]):
self.direction=direction
self.snake_point=snakelist
super().__init__(SNAKE_IMG)
self.rect.x=self.snake_point[1][0]
self.rect.y=self.snake_point[1][1]
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
class Food(Game_sprite):
def __init__(self):
super(Food, self).__init__(FOOD_IMG)
self.rect.x = random.randint(50, 828)
self.rect.y = random.randint(38, 600)
def update(self):
pass
我发现自己并没有弄懂pygame的具体画面更新机制,以及精灵的控制,对于贪吃蛇头部及身体的画面更新并没有做出来,还有对身体和头的数据结构如何构建 并不是很了解。毕竟第一次,希望有大佬看到这篇博客能够指点下。
import pygame
import time
import random
x = pygame.init()
white = (255,255,255)
black = (0,0,0)
red = (255,0,0)
green = (0,155,0)
display_width = 800
display_height = 600
gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('Slither')
gameDisplay.fill(white)
pygame.display.update()
block_size = 20
applethickness = 30
FPS = 10
icon = pygame.image.load('appleimage.jpg')
pygame.display.set_icon(icon)
img = pygame.image.load('snakeimage.jpg')
appleimage = pygame.image.load('appleimage.jpg')
clock = pygame.time.Clock()
smallfont = pygame.font.SysFont(None,30)
midfont = pygame.font.SysFont(None,50)
largefont = pygame.font.SysFont("comicsansms",80)
direction = "right"
def pause():
paused = True
message_to_screen("暂停",black,-100,"large")
message_to_screen("空格暂停Q退出",black, 30)
pygame.display.update()
while paused:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
paused = False
elif event.key == pygame.K_q:
pygame.quit()
quit()
#gameDisplay.fill(white)
clock.tick(5)
def score(score):
text1 = smallfont.render("Score : " + str(score), True, black)
gameDisplay.blit(text1,(0,0))
def randApplegen():
randAppleX = round(random.randrange(0,display_width-applethickness))#/10.0)*10.0
randAppleY = round(random.randrange(0,display_height-applethickness))#/10.0)*10.0
return randAppleX, randAppleY
def intro():
intro = True
message_to_screen("按c开始游戏",red,150)
pygame.display.update()
while intro:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_c:
intro = False
if event.key == pygame.K_q:
pygame.quit()
quit()
clock.tick(15)
def snake(snakelist):
for xny in snakelist[:-1]:
pygame.draw.rect(gameDisplay,green,[xny[0],xny[1],block_size,block_size])
if(direction == "right"):
head = pygame.transform.rotate(img,270)
elif(direction == "left"):
head = pygame.transform.rotate(img,90)
elif(direction == "up"):
head = img
elif(direction == "down"):
head = pygame.transform.rotate(img,180)
gameDisplay.blit(head,(snakelist[-1][0],snakelist[-1][1]))
def text_objects(text,color,size):
if(size == "small"):
textsurface = smallfont.render(text,True,color)
elif(size == "middle"):
textsurface = midfont.render(text,True,color)
elif(size == "large"):
textsurface = largefont.render(text,True,color)
return textsurface, textsurface.get_rect()
def message_to_screen(msg,color,y_displace=0,size="small"):
textsurf, textsurf_rect = text_objects(msg,color,size)
textsurf_rect.center = (display_width/2), (display_height/2) + y_displace
gameDisplay.blit(textsurf,textsurf_rect)
def gameLoop():
global direction
direction = "right"
gameExit = False
gameOver = False
lead_x = display_width/2
lead_y = display_height/2
lead_x_change = 10
lead_y_change = 0
randAppleX, randAppleY = randApplegen()
snakelist = []
snakelength = 1
while not gameExit:
if gameOver == True:
message_to_screen("Game Over",red,-50,"large")
message_to_screen("Press C to play again or Q to quit the game",black,50,"small")
pygame.display.update()
while gameOver == True:
#gameDisplay.fill(white)
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
gameExit = True
gameOver = False
if event.key == pygame.K_c:
gameLoop()
pygame.quit()
quit()
if event.type == pygame.QUIT:
gameExit = True
gameOver = False
# pygame.quit()
# quit()
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameExit = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT and direction != "right":
direction = "left"
lead_x_change = -block_size
lead_y_change = 0
elif event.key == pygame.K_RIGHT and direction != "left":
direction = "right"
lead_x_change = block_size
lead_y_change = 0
elif event.key == pygame.K_UP and direction != "down":
direction = "up"
lead_y_change = -block_size
lead_x_change = 0
elif event.key == pygame.K_DOWN and direction != "up":
direction = "down"
lead_y_change = block_size
lead_x_change = 0
elif event.key == pygame.K_SPACE:
pause()
if lead_x + block_size/2 >= display_width or lead_x < 0 or lead_y + block_size/2 >= display_height or lead_y < 0:
gameOver = True
lead_x += lead_x_change
lead_y += lead_y_change
gameDisplay.fill(white)
gameDisplay.blit(appleimage,(randAppleX,randAppleY))
#pygame.draw.rect(gameDisplay,red,[350,350,100,10])
# gameDisplay.fill(red, rect=[200,200,50,50]) #good method
snakehead = []
snakehead.append(lead_x)
snakehead.append(lead_y)
snakelist.append(snakehead)
if len(snakelist) > snakelength:
del snakelist[0]
for each in snakelist[:-1]:
if each == snakehead:
gameOver = True
snake(snakelist)
score(snakelength-1)
pygame.display.update()
if lead_x >= randAppleX and lead_x <= randAppleX + applethickness or lead_x + block_size >= randAppleX and lead_x + block_size <= randAppleX + applethickness:
if lead_y >= randAppleY and lead_y <= randAppleY + applethickness or lead_y + block_size >= randAppleY and lead_y + block_size <= randAppleY + applethickness:
randAppleX, randAppleY = randApplegen()
snakelength += 1;
clock.tick(FPS)
intro()
gameLoop()
pygame.quit()
quit()