python

超轻量级php框架startmvc

使用pygame模块编写贪吃蛇的实例讲解

更新时间:2020-05-21 00:24:01 作者:startmvc
python###刚学了python不久,发现了一个好玩的库pygame使用pygame模块利用面向对象的思想编写贪

python ### 刚学了python不久,发现了一个好玩的库pygame

使用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

关于这次demo

我发现自己并没有弄懂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()

以上这篇使用pygame模块编写贪吃蛇的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

pygame 贪吃蛇