Python+pgzero小游戏开发

基于python和pgzero模块的小游戏开发-----熊猫爬树

还记得小时候在按键翻盖手机上面玩的小游戏吗,一个熊猫不断改变在竹子的位置躲避各种昆虫,并且可以用屁股顶掉昆虫。

如图是游戏运行截图:

游戏界面:

运行界面:

以下是代码实现过程:

import pgzrun,os,random

#窗口设置
TITLE="熊猫爬树2.1"
WIDTH=500
HEIGHT=400

#变量定义
trees=[]
insects=[]#昆虫列表
mid=1
score=0
live=3
level_images=[]
live_flag=0
insect_num=3#虫子的每次出现个数
attack_count=0#闪烁计数器
insect_speed=-2#虫子上升速度

#游戏逻辑变量
lost=False
win=False
start=False#开始游戏按钮
level_btn=False#是否点击选择关卡按钮
level=1#关卡
runing=False#运行状态
attacked=False#没有被攻击
level_num_flag=False#选关窗口判定
level_key=False#关卡按钮开关
pause_flag=False#暂停键

#角色定义
panda=Actor("panda_left",(260,HEIGHT//2-100))
game_over_panda=Actor("panda_lost")

#gui界面
gui_background_image=Actor("gui_background",topleft=(0,0))
btn_start_game=Actor("开始游戏",(WIDTH//2,HEIGHT-100))
btn_exit_game=Actor("退出游戏",(WIDTH//2,HEIGHT-30))
btn_levvel=Actor("游戏关卡",(WIDTH//2,HEIGHT-160))
gui_level_rest=Actor("返回",topleft=(5,20))
rest_home=Actor("rest_home",(100,HEIGHT-100))
game_exit=Actor("over_image",(WIDTH-100,HEIGHT-100))
game_win=Actor("win")
pause=Actor("暂停",(WIDTH-15,20))
#关卡
level_image_bg=Actor("level_background")
level_background=Actor("level_num"+str(level))
#绘制关卡
for g in range(3):
    level_image = Actor("关卡层次" + str(g + 1), (0, HEIGHT // 8 + 70 * g))
    level_images.append(level_image)

#绘画竹子
for j in range(3):
    for i in range(4):
        tree = Actor("tree", topleft=(80+150*j,i * 100))
        trees.append(tree)
music.play("game_started")
#游戏初始化
def init_game():
    global mid,score,live,live_flag,insect_speed,insect_num,attacked,attack_count,\
    lost,win,start,level_btn,level,runing,level_num_flag,pause_flag
    mid = 1
    score = 0
    live = 3
    live_flag = 0
    insect_num = 3  # 虫子的每次出现个数
    attack_count = 0  # 闪烁计数器
    insect_speed = -2  # 虫子上升速度
    lost = False
    win = False
    start = False  # 开始游戏按钮
    level_btn = False  # 选择关卡按钮
    level = 1  # 关卡
    runing = False  # 运行状态
    attacked = False  # 没
    level_num_flag = False  # 选关窗口判定
    pause_flag=False
    music.play("game_started")


def draw():
    screen.fill((255,255,255))
    if not start and not level_btn:
        screen.clear()
        gui_background_image.draw()
        btn_start_game.draw()
        btn_exit_game.draw()
        btn_levvel.draw()
        return
    elif level_num_flag :
        level_draw()
        gui_level_rest.draw()
        for level_image in level_images:
            level_image.draw()
        return
    game_run_draw()
    gameover_draw()


def update():
    pause_update()
    if runing:
        if win or lost:
            return
        panda_move()
        insect_update()
       

#游戏运行绘制
def game_run_draw():
    if runing or pause_flag:
        level_background.draw()
        panda_draw()
        for tree in trees:
            tree.draw()
        for insect in insects:
            insect.draw()
        for k in range(live):
            screen.blit("panda_right",(k * 25, 5))
        screen.draw.text("分数:"+str(score), topleft=(5, 50),fontsize=30,fontname="abc.ttf",color="red")
        screen.draw.text("生命:"+str(live), topleft=(5, 80),fontsize=30,fontname="abc.ttf",color="red")
        screen.draw.text("第" + str(level)+"关", (WIDTH//2, 10), fontsize=30, fontname="simhei", color="green")
        pause.draw()
        rest_btn_draw()

def rest_btn_draw():
    global pause_flag
    if pause_flag:
        screen.draw.text("暂停", (WIDTH // 2 - 50, HEIGHT // 2 - 30), fontname="abc.ttf", fontsize=50, color="red")
        gui_level_rest.draw()


#游戏失败和胜利
def gameover_draw():
    global runing
    if lost:
        runing=False
        screen.fill((148,209,89))
        game_over_panda.draw()
        music.stop()
        rest_home.draw()
        game_exit.draw()
        return
    if win:
        music.stop()
        game_win.draw()
        runing=False
        screen.draw.text("胜利!", (WIDTH // 2 - 60, 20), fontname="simhei.ttf", fontsize=70, color="orange")
        return

def on_key_down(key):
    if runing:
        if key==keys.RIGHT:
            if 250>panda.x>=140 or 420>panda.x>=270 :
                panda.x+=120
                panda.image=("panda_left")
            else:
                panda.x+=30
                panda.image=("panda_right")

        if key==keys.LEFT:

            if 270 > panda.x > 150 or 420 > panda.x >= 300:
                panda.x -= 120
                panda.image = ("panda_right")
            else:
                panda.image = ("panda_left")
                panda.x -= 30
        if panda.x<110:
            panda.x=110
        elif panda.x>=440:
            panda.x=440
            panda.image=("panda_right")


#虫子向上逻辑
def insect_update():
    global mid,insect_num,insect_speed,pause_flag
    nub=random.randint(1,200)
    gs=random.randint(0,4)
    if not pause_flag:
        if (nub == 99 or nub == 120 ) and gs != mid:
            for m in range(insect_num):
                jk=random.randint(1,3)
                insect_direction=["_right","_left"]
                idn = random.randint(0,1) #虫子左右随机
                insect=Actor("insect"+str(jk)+str(insect_direction[idn]),(110+(idn * 30)+150*gs,HEIGHT+m*130))
                insect.flag=True#虫子存活标记
                insects.append(insect)
            mid = gs#解决重叠
        for insect in insects:
            if insect.flag:
                insect_speed= -2
            else:
                insect_speed = 5
            insect.y+=insect_speed
            if insect.y<0:
                insects.remove(insect)

#碰撞检测
def panda_collision():
    global score,live,live_flag,attacked
    for insect in insects:
        if panda.colliderect(insect) and insect.y-5>panda.bottom>insect.top and keyboard.space:
            
def level_up():
    global lost,win,level,runing
    if live<=0:
        lost=True
        sounds.lost.play()
    if score== 20 and level<3:
        level+=1
        if level==2:
            level_num2()
        if level==3:
            level_num3()
    if score==1 and level==3:
        runing=False
        sounds.win.play()
        win=True

#按钮点击
def on_mouse_down(pos):
    global start,runing,level_btn,btn_levvel,level_num_flag,level_key,pause_flag
    if btn_start_game.collidepoint(pos):
        init_game()
        start=True
        level_key=True
        runing=True
        sounds.btn.play()
    elif btn_exit_game.collidepoint(pos):
        sounds.btn.play()
        exit()

    elif btn_levvel.collidepoint(pos) :
        level_btn=True
        level_num_flag=True
        runing=False
        start=False
        sounds.btn.play()
    elif level_images[0].collidepoint(pos) and level_num_flag==True:
        init_game()
        pause_flag=False
        start=False
        level_btn=True
        runing=True
        level_key=True
        level_num1()
        sounds.btn.play()
    elif level_images[1].collidepoint(pos) and level_num_flag==True:
        init_game()
        start = False
        level_btn = True
        runing = True
        level_key = True
        level_num2()
        sounds.btn.play()
        level_background.image="level_num2"
    elif level_images[2].collidepoint(pos) and level_num_flag==True:
        init_game()
        start = False
        level_btn = True
        runing = True
        level_key = True
        level_num3()
        sounds.btn.play()
        level_background.image = "level_num3"
    #点击返回键
    elif gui_level_rest.collidepoint(pos) or rest_home.collidepoint(pos):
        runing=False
        pause_flag=True
        level_btn=False
        start=False
        level_key=False
        runing=False
        level_num_flag=False
        sounds.btn.play()
    if game_exit.collidepoint(pos):
        sounds.btn.play()
        exit()
    if pause.collidepoint(pos):
        pause_flag=not pause_flag

#熊猫闪烁
def panda_draw():
    global live_flag,attacked,attack_count
    if attacked==True:
        attack_count+=1
        if attack_count % 5 == 0:
            return
        if attack_count>70:
            attack_count=0
            attacked=False
    panda.draw()

#游戏关卡绘制
def level_draw():
    level_image_bg.draw()
#关卡1、2、3
def level_num1():
    global insect_num,level
    insect_num=3
    level=1

#解决乱点击
def menu_draw():
    if level_btn==True:
        gui_background_image.x=1000
        btn_start_game.x=1000
        btn_exit_game.x=1000
        btn_levvel.x=1000
    elif level_num_flag==False:
        gui_background_image.x =WIDTH//2
        btn_start_game.x = WIDTH//2
        btn_exit_game.x = WIDTH//2
        btn_levvel.x = WIDTH//2

def level_menu_draw():
    if level_num_flag:
        for level_image in level_images:
            level_image.x=WIDTH//2
    else:
        for level_image in level_images:
            level_image.x=-50

def over_pos():
    if not lost and level_btn:
        game_exit.x=WIDTH
        rest_home.x=WIDTH
        gui_level_rest.y=10
    else:

        game_exit.x = WIDTH-100
        rest_home.x = 100

def pause_update():
    global runing
    if pause_flag:
        runing=False
    else:
        runing=True


os.environ['SDL_VIDEO_CENTERED'] = '1'
pgzrun.go()

原创不易,白嫖不易,如需下载完整资源包(包括图
片以及音效和背景音乐)以及更多python小游戏开发和定制小游戏包括文档请加以下qq交流群:https://vip1.cyou/b8R

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Python是一种简单易学的编程语言,而PyQt5是Python的一个GUI库,用于创建图形用户界面(GUI)。PyQt5提供了丰富的功能和工具,使开发者能够轻松地创建各种类型的应用程序。 下面是Python+PyQt5界面开发的一般步骤: 1. 安装PyQt5:首先,你需要安装PyQt5库。你可以使用pip命令在命令行中安装它:`pip install pyqt5` 2. 导入必要的模块:在Python脚本中,你需要导入PyQt5模块以及其他必要的模块,例如QtCore、QtGui和QtWidgets。 3. 创建应用程序对象:使用`QApplication`类创建一个应用程序对象。这个对象管理整个应用程序的事件循环。 4. 创建主窗口:使用`QMainWindow`类创建一个主窗口对象。主窗口是应用程序的主要界面。 5. 设计界面:使用Qt Designer工具来设计界面。Qt Designer是一个可视化界面设计工具,可以帮助你快速创建界面。 6. 将设计好的界面转换为Python代码:使用`pyuic5`命令将Qt Designer生成的.ui文件转换为Python代码。例如,`pyuic5 mainwindow.ui -o mainwindow.py` 7. 编写业务逻辑:在主窗口类中编写业务逻辑代码,例如按钮点击事件、菜单操作等。 8. 运行应用程序:在主程序中创建主窗口对象,并调用`show()`方法显示窗口。最后,调用`exec_()`方法启动应用程序的事件循环。 这只是一个简单的介绍,Python+PyQt5界面开发还有很多其他的细节和功能。你可以通过阅读PyQt5的官方文档和教程来深入学习。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tutor Star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值