前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python小游戏设计入门5-捡金币游戏(下)

python小游戏设计入门5-捡金币游戏(下)

作者头像
叶子陪你玩
发布2020-04-23 13:24:55
1.5K0
发布2020-04-23 13:24:55
举报

前言

本系列课程是针对无基础的,争取用简单明了的语言来讲解,学习前需要具备基本的电脑操作能力,准备一个已安装python环境的电脑。如果觉得好可以分享转发,有问题的地方也欢迎指出,在此先行谢过。

开始界面

创建一个开始界面函数,用来显示开始界面,因为要一直停在开始界面,在showstartscreen函数里需要有一个死循环,直到按下任意按键(除了ESC键或者退出游戏)进入游戏,在while循环里一直检测按键按下,按下后就return退出循环。

下面我们在添加一个提示信息文字,按下按键开始。

游戏暂停

添加一个游戏暂停界面,放在游戏主循环中的事件检测中,当按下s键后,游戏进入暂停界面,再按下s键回到游戏中。

游戏结束

新添加一个结束界面的方法 ,在游戏主循环中进行调用,收集完所有金币就进入游戏结束画面,按下任意按键就退出程序。

最终代码:

代码语言:javascript
复制
# 导入两个库
import sys,pygame
import random
from pygame.locals import *
# 使用前先需要初始化,初始化所有被导入的pygame子模块,固定用法
pygame.init() # 初始化pygame
# 游戏肯定是在一个窗口中,那我们先来创建一个窗口
size = width, height = 600, 480 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
pygame.display.set_caption("捡金币游戏") #设置游戏窗口标题
# 创建玩家角色类
class Player(pygame.sprite.Sprite):
 def __init__(self,player_image):
        pygame.sprite.Sprite.__init__(self)
 self.image=pygame.image.load(player_image)
 # 获得精灵对象矩形区域,为碰撞做准备
 self.rect=self.image.get_rect()
# 创建金币角色类
class Coin(pygame.sprite.Sprite):
 def __init__(self,gold_image):
        pygame.sprite.Sprite.__init__(self)
        origin_gold = pygame.image.load(gold_image)
 # 缩放大小
 self.image=pygame.transform.scale(origin_gold, (32, 32))
 # 获得精灵对象矩形区域,为碰撞做准备
 self.rect=self.image.get_rect()
def checkfor_keypress():
 if len(pygame.event.get(QUIT)) > 0:
        pygame.quit()
        sys.exit()
    keyUpEvents = pygame.event.get(KEYUP)
 if len(keyUpEvents) == 0:
 return None
 elif keyUpEvents[0].key == K_ESCAPE:
        pygame.quit()
        sys.exit()
 else:
 return keyUpEvents[0].key
def draw_press_key_msg():
    basicfont=pygame.font.Font("anna.ttf",30)
    pressKeySurf = basicfont.render('Press a key to play.', True,( 40, 40, 40)) 
    presstext_width,presstext_height = pressKeySurf.get_size() 
    screen.blit(pressKeySurf, ((width-presstext_width)/2,(height-presstext_height)/2+150))
def showstartscreen():
    font=pygame.font.Font("anna.ttf",100)
    start_text=font.render("捡金币游戏",True,(255,0,0))
    text_width,text_height=start_text.get_size()
 while True: 
        screen.fill((124,205,124)) # 绘制背景
        screen.blit(start_text,((width-text_width)/2,(height-text_height)/2))
        draw_press_key_msg()
 if checkfor_keypress():
            pygame.event.get() # clear event queue
 return
        pygame.display.update()
def showwaitscreen():
    font=pygame.font.Font("anna.ttf",100)
    wait_text=font.render("游戏暂停",True,(255,0,0))
    text_width,text_height=wait_text.get_size()
 while True: 
        screen.fill((124,205,124)) # 绘制背景
        screen.blit(wait_text,((width-text_width)/2,(height-text_height)/2))
 if checkfor_keypress()==K_s:
            pygame.event.get() # clear event queue
 return
        pygame.display.update()
def showgameoverscreen():
    font=pygame.font.Font("anna.ttf",100)
    over_text=font.render("game over",True,(255,0,0))
    text_width,text_height=over_text.get_size()
 while True: 
        screen.fill((124,205,124)) # 绘制背景
        screen.blit(over_text,((width-text_width)/2,(height-text_height)/2))
        draw_press_key_msg()
 if checkfor_keypress():
            pygame.event.get() # clear event queue
 return
        pygame.display.update()
# 创建精灵组,便于管理所有精灵类对象
allsprites=pygame.sprite.Group()
# 用于管理所有的金币精灵对象
coin_sprites=pygame.sprite.Group()
# 实例化游戏对象
player=Player('Person_walk1.png')
# 创建多个金币 20
for i in range(20):
    gold = Coin("gold_1.png")
 # 将金币的显示位置设置为一个随机范围
    gold.rect.x = random.randrange(32,600)
    gold.rect.y = random.randrange(32,400)
    coin_sprites.add(gold) # 添加进精灵组
# 添加玩家角色 和 所有金币角色
allsprites.add(player,coin_sprites)
# 添加分数变量
score = 0
# 字体设置
font=pygame.font.Font("anna.ttf",24) # 自己下载的字体,可以显示中文
showstartscreen()
while True: # 死循环确保窗口一直显示
 for event in pygame.event.get(): # 遍历所有事件
 if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
            sys.exit()
 elif event.type ==pygame.KEYUP:
 if event.key ==K_s:
                showwaitscreen()
    pos=pygame.mouse.get_pos()
 # 碰撞检测 一个是玩家 一个是金币精灵组 True表示碰撞就删除碰撞的角色金币
    coins=pygame.sprite.spritecollide(player, coin_sprites, True)
 # 统计返回的碰撞金币精灵列表数量
 for coin in coins:
        score=score+1 # 每次加 1
 if score==20:
        showgameoverscreen()
 break
 # 将玩家的坐标设置为鼠标的位置
    player.rect.x=pos[0]
    player.rect.y=pos[1]
    screen.fill((124,205,124)) # 绘制背景
    allsprites.draw(screen) # 将玩家和金币绘制到屏幕上
 # 显示计分
    text=font.render("分数:{}".format(score),True,(255,0,0))
    screen.blit(text,(10,10)) 
   pygame.display.flip() # 更新

总结:

捡金币游戏到这里就结束了,当然还有很多可以完善的地方,比如有很多重复的显示文本的代码,除了内容不一样,其它都一样;可以新建一个游戏类,会更方便管理代码,还有游戏音效,再来一轮,限时功能,关卡等也没有去深入,感兴趣的可以自己去研究。

(全文完)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开始界面
  • 游戏暂停
  • 游戏结束
  • 最终代码:
  • 总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档