侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 5年前   283

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

使用pygame模块 利用面向对象的思想编写贪吃蛇,主要用到pygame.sprite:

游戏主类

import pygame,sysfrom snake_sprite import Game_sprite,Snake,FoodSCREEN_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 pygameimport randomSNAKE_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.speedyclass 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 pygameimport timeimport randomx = pygame.init()white = (255,255,255)black = (0,0,0)red = (255,0,0)green = (0,155,0)display_width = 800display_height = 600gameDisplay = pygame.display.set_mode((display_width,display_height))pygame.display.set_caption('Slither')gameDisplay.fill(white)pygame.display.update()block_size = 20applethickness = 30FPS = 10icon = 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, randAppleYdef 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模块编写贪吃蛇的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    pyqt5简介及安装方法介绍
    下一条:
    NumPy 如何生成多维数组的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客