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


Posted in Python onFebruary 05, 2018

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

Python 相关文章推荐
python3图片转换二进制存入mysql
Dec 06 Python
通过mod_python配置运行在Apache上的Django框架
Jul 22 Python
Python与Java间Socket通信实例代码
Mar 06 Python
详解用TensorFlow实现逻辑回归算法
May 02 Python
python对csv文件追加写入列的方法
Aug 01 Python
flask框架蓝图和子域名配置详解
Jan 25 Python
pandas分组聚合详解
Apr 10 Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 Python
python 常见的排序算法实现汇总
Aug 21 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 Python
python字典与json转换的方法总结
Dec 28 Python
OpenCV-Python实现油画效果的实例
Jun 08 Python
Python安装模块的常见问题及解决方法
Feb 05 #Python
Python实现的用户登录系统功能示例
Feb 05 #Python
python中numpy的矩阵、多维数组的用法
Feb 05 #Python
NumPy 如何生成多维数组的方法
Feb 05 #Python
python生成器,可迭代对象,迭代器区别和联系
Feb 04 #Python
python实现mysql的读写分离及负载均衡
Feb 04 #Python
python负载均衡的简单实现方法
Feb 04 #Python
You might like
php实现文件下载实例分享
2014/06/02 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
JavaScript代码复用模式实例分析
2012/12/02 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
JavaScript小技巧整理篇(非常全)
2016/01/26 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
jQuery操作css样式
2017/05/15 jQuery
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python设计模式之代理模式实例
2014/04/26 Python
Python切片用法实例教程
2014/09/08 Python
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
Python 文件管理实例详解
2015/11/10 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
Django REST framework视图的用法
2019/01/16 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
JOSEPH官网:英国奢侈时尚品牌
2018/01/31 全球购物
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
月度优秀员工获奖感言
2014/08/16 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
2014年村委会工作总结
2014/11/24 职场文书
2014年防汛工作总结
2014/12/08 职场文书
导游词之清晏园
2019/11/22 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
HTML基础详解(下)
2021/10/16 HTML / CSS