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

本文介绍了使用Python的pygame模块来实现一个简单的贪吃蛇游戏的过程,涉及游戏主类、精灵类的创建以及游戏循环的运行。通过面向对象的方式组织代码,创建了Snake、Food和背景图片等游戏元素。虽然作者对于pygame的画面更新机制和精灵控制尚不完全理解,但已经实现了基本的游戏功能,包括蛇的移动、食物生成以及键盘事件监听。在后续的学习中,作者计划深入理解这些概念以完善游戏细节。
摘要由CSDN通过智能技术生成

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模块编写贪吃蛇的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持萬仟网。

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值