专栏首页叶子陪你玩编程python小游戏设计入门5-捡金币游戏(下)

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

前言

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

开始界面

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

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

游戏暂停

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

游戏结束

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

最终代码:

# 导入两个库
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() # 更新

总结:

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

(全文完)

本文分享自微信公众号 - 叶子陪你玩编程(gh_cd062460d25e),作者:青叶子

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【pygame系列 第一课 创建游戏窗口 】

    python我们可以做文字版的游戏,比如猜数字游戏,21点游戏。那python可以做图形界面的游戏吗?偷偷告诉你,用pygame库就可以实现了。pygame是p...

    用户7054460
  • 【pygame系列 第二课 狮子动画 】

    python我们可以做文字版的游戏,比如猜数字游戏,21点游戏。那python可以做图形界面的游戏吗?偷偷告诉你,用pygame库就可以实现了。pygame是p...

    用户7054460
  • python小游戏设计入门2-创建游戏窗口

    python我们可以做文字版的游戏,比如猜数字游戏,21点游戏。那python可以做图形界面的游戏吗?偷偷告诉你,用pygame库就可以实现了。pygame是p...

    用户7054460
  • 【pygame系列 第一课 创建游戏窗口 】

    python我们可以做文字版的游戏,比如猜数字游戏,21点游戏。那python可以做图形界面的游戏吗?偷偷告诉你,用pygame库就可以实现了。pygame是p...

    用户7054460
  • python---图形界面的2048

    之前做了控制台版的2048,那样子玩着不爽,玩着没那么随意,于是把他做成带ui的2048。大部分的逻辑都是一样的,做这种小游戏,最难的就是的逻辑实现过程,一旦...

    sjw1998
  • pygame系列_pygame的各模块叙述

    在pygame中,有很多模块,每个模块对应着不同的功能,如果我们知道这些模块是做什么的,那么,对我们的游戏开发会起到关键性的作用。

    Hongten
  • 【pygame系列 第二课 狮子动画 】

    python我们可以做文字版的游戏,比如猜数字游戏,21点游戏。那python可以做图形界面的游戏吗?偷偷告诉你,用pygame库就可以实现了。pygame是p...

    用户7054460
  • python学习之GUI(pygame)

    py3study
  • pygame-游戏开发学习笔记(二)–模块表与背景图样例。

    if pygame.font is None: print "The font module is not available!" exit()

    十四君
  • Python 使用 pygame 实现一个简单的动画

    一个会写诗的程序员

扫码关注云+社区

领取腾讯云代金券