基于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