1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Python+Pgzrun制作打飞机游戏(附源码)

Python+Pgzrun制作打飞机游戏(附源码)

时间:2021-01-05 15:50:23

相关推荐

Python+Pgzrun制作打飞机游戏(附源码)

目录

基本框架

创建滚动背景

创建飞机

让plane移动

发射子弹

创建敌机

敌机移动

金币制度

关卡制度

设置

创建更高级飞机(SRplane和SSRplane)

开始

炸弹

介绍

源码

基本框架

import pgzrunWIDTH, HEIGHT = 500, 700TITLE = '打飞机'pgzrun.go()

创建滚动背景

bg1.png和bg2.png

bg1 = Actor('bg1.png')# 保存在images文件中,下同bg1.x = 250bg1.y = 350bg2 = Actor('bg2.png')bg2.x = bg1.xbg2.y = bg1.y - 700def draw():bg1.draw()bg2.draw()def update():bg1.y += 2# 滚动起来bg2.y += 2if bg1.y > 700 + 350:bg1.y = bg2.y - 700if bg2.y > 700 + 350:bg2.y = bg1.y - 700

创建飞机

plane = Actor('plane.png')plane.x = 250plane.y = 600

注:上边的代码写在框架中

plane.png

让plane移动

def update():#--省略-- if keyboard.left:plane.x += 5elif keyboard.right:plane.x -= 5if plane.x < 0:plane.x += 10elif plane.x > 500:plane.x -= 10

发射子弹

bullets = []

def on_key_down(key):if key == keys.SPACE:bullet = Actor('bullet1.png')bullet.x = plane.xbullet.y = plane.y - 30bullets.append(bullet)

bullet1.png

def draw():--省略--for b in bullets:b.draw()

def update():--省略--for b in bullets:b.y -= 5if b.y < 0:bullets.remove(b)

创建敌机

enemys = []for i in range(6):enemy = Actor('enemy.png')enemy.x = 70 * (i + 1)enemy.y = 20enemys.append(enemy)

enemy.png

敌机移动

def update():# --省略--speed = 2for e in enemys:e.y += speedif e.bottom >= 700:e.y = 0e.x = randint(50, WIDTH - 50)if e.colliderect(plane):plane.image = 'plane2.png'enemys.remove(e)for b in bullets:if e.colliderect(b):bullets.remove(b)e.y = 0e.x = randint(50, WIDTH - 50)

plane2.png

def draw():# --省略--if plane.image != 'plane2.png': #重构for b in bullets:b.draw()for i in enemys:i.draw()

到此为止,《打飞机》游戏已经可以玩了,以下部分都是其他功能,让游戏更有可玩性

金币制度

在主文件夹中创建data文件夹,存放数据

在data文件夹创建金币.txt,写入0

with open('data/金币.txt', 'r') as f: # 获取金币信息coin = int(f.read())f.close()

def draw():# --省略--text1 = 'coin:' + str(coin)screen.draw.text(text1, (50, 10), fontsize=50, color='black')

def update():# --省略--for e in enemys:--省略--for b in bullets:# --省略--if e.colliderect(b)# --省略--coin += 1f3 = open('data/金币.txt', 'w')f3.write(str(coin))f3.close()

关卡制度

在data文件夹中创建level.txt

f = open('data/level.txt', 'r') # 获取关卡数据level = int(f.read())f.close()

kill = 0 # 关卡中击杀敌机数量

def draw():# --省略--text = 'level' + str(level)screen.draw.text(text, (350, 10), fontsize=50, color='black')text2 = str(kill) + '/' + str((level + 1) * 10)screen.draw.text(text2, (230, 10), fontsize=50, color='black')

def update():--省略--standard = (level + 1) * 10if kill > standard:kill = 0level += 1f = open('data/level.txt', 'w')f.write(str(level))f.close()

def update():# --省略--speed = 2 + level*0.1 # 重构

设置

创建settings.py

# coding=gbkimport wxdef set():class MyFrame(wx.Frame):def __init__(self):global beijingsuper().__init__(None, title='设置', size=(500, 250), pos=(400, 400))panel = wx.Panel(parent=self)statictext = wx.StaticBox(parent=panel, label="这里是《打飞机》游戏设置", pos=(10, 10))app = wx.App()frm = MyFrame()frm.Show()app.MainLoop()

set(1).jpg

set = Actor('set(1).jpg')set.x = 20set.y = 20def draw():# --省略--set.draw()

创建更高级飞机(SRplane和SSRplane)

srplane.png srplane2.pngssrplane.png ssrplane2.png

创建shop.py

在data文件夹中创建sr.txt和ssr.txt,写入0

创建plane.txt 写入plane.png

shop.py

import wxdef shopping():class MyFrame(wx.Frame):def __init__(self):super().__init__(None, title='商店', size=(500, 300), pos=(400, 400))panel = wx.Panel(parent=self)statictext = wx.StaticBox(parent=panel, label="这里是《打飞机》游戏商店", pos=(10, 10))statictext = wx.StaticBox(parent=panel, label="你可以在这购买英雄皮肤", pos=(10, 50))with open('data/sr.txt', 'r') as f:c = f.read()f.close()if c != '0':self.srtext = '已拥有SR级飞机'else:self.srtext = '购买SR级飞机(1000金币,两条命)'self.button = wx.Button(panel, -1, self.srtext, pos=(30, 150))self.Bind(wx.EVT_BUTTON, self.srshopping, self.button)self.button.SetDefault()with open('data/ssr.txt', 'r') as f:c2 = f.read()f.close()if c2 != '0':self.ssrtext = '已拥有SSR级飞机'else:self.ssrtext = '购买SSR级飞机(3000金币,两条命,一次发射两枚子弹)'self.button = wx.Button(panel, -1, self.ssrtext, pos=(30, 210))self.Bind(wx.EVT_BUTTON, self.ssrshopping, self.button)self.button.SetDefault()def srshopping(self, event):with open('data/金币.txt') as f:c = int(f.read())f.close()if self.srtext == '购买SR级飞机(两条命)' and c >= 1000:self.srtext = '已获得'self.button.SetLabel(self.srtext)with open('data/金币.txt', 'w') as f:f.write(str(c - 1000))f.close()with open('data/sr.txt', 'w') as f:f.write('1')f.close()def ssrshopping(self, event):with open('data/金币.txt') as f:c = int(f.read())f.close()if self.ssrtext == '购买SSR级飞机(3000金币,两条命,一次发射两枚子弹)' and c >= 3000:self.ssrtext = '已获得'self.button.SetLabel(self.ssrtext)with open('data/金币.txt', 'w') as f:f.write(str(c - 3000))f.close()with open('data/ssr.txt', 'w') as f:f.write('1')f.close()app = wx.App()frm = MyFrame()frm.Show()app.MainLoop()

settings.py

def set():# --省略--with open('data/sr.txt', 'r') as f:c = f.read()f.close()if c != '0':self.sr_go_out = '让SR飞机上场'else:self.sr_go_out = '未获得SR飞机'self.button = wx.Button(panel, -1, self.sr_go_out, pos=(60, 100))self.Bind(wx.EVT_BUTTON, self.srgoout, self.button)self.button.SetDefault()with open('data/ssr.txt', 'r') as f:c1 = f.read()f.close()if c1 != '0':self.ssr_go_out = '让SSR飞机上场'else:self.ssr_go_out = '未获得SSR飞机'self.button = wx.Button(panel, -1, self.ssr_go_out, pos=(60, 150))self.Bind(wx.EVT_BUTTON, self.ssrgoout, self.button)self.button.SetDefault()def srgoout(self, event):global planemodelif self.sr_go_out == '让SR飞机上场':with open('data/plane.txt', 'w') as f:f.write('srplane.png')planemodel = 'srplane'def ssrgoout(self, event):global planemodelif self.ssr_go_out == '让SSR飞机上场':with open('data/plane.txt', 'w') as f:f.write('ssrplane.png')planemodel = 'ssrplane'

打飞机.py

with open('data/plane.txt') as f5:p = f5.read()f5.close()live = 0if p == 'plane.png':live = 1elif p == 'srplane.png' or p == 'ssrplane.png':live = 2

def update():# --省略--if e.colliderect(plane): live -= 1

​def on_key_down(key):# --省略--if key == keys.SPACE:if plane.image == 'ssrplane.png' and len(bullets) < 12: # 重构bullet = Actor('bullet1.png')bullet1 = Actor('bullet1.png')bullet.x = plane.x + 40bullet.y = plane.y - 50bullet1.x = plane.x - 40bullet1.y = plane.y - 50bullets.append(bullet)bullets.append(bullet1)else:if plane.image == 'srplane.png' and len(bullets) < 10:bullet = Actor('bullet1.png')bullet.x = plane.xbullet.y = plane.y - 30bullets.append(bullet)if plane.image == 'plane.png' and len(bullets) < 6:bullet = Actor('bullet1.png')bullet.x = plane.xbullet.y = plane.y - 30bullets.append(bullet)​

def on_mouse_down(pos):global liveif set.collidepoint(pos):settings.set()plane.image = settings.planemodelif settings.planemodel == 'plane.png':live = 1elif settings.planemodel == 'srplane.png' or settings.planemodel == 'ssrplane.png':live = 2

开始

begin = False

def draw():# --省略--if begin:#重构plane.image = settings.planemodelplane.draw()if plane.image != 'plane2.png':for b in bullets:b.draw()for i in enemys:i.draw()else:set.draw() # 重构screen.draw.text('Press [b] to begin', (100, 350), fontsize=50, color='black')

def on_key_down(key):if begin:# 重构# --省略--else:if key == keys.B:begin = True

def update(): if begin:# --省略--if live == 0:begin = False

炸弹

创建bombs.txt,写入5

with open('data/bombs.txt') as f4: # 获取炸弹数量信息b = int(f4.read())f4.close()bomb = Actor('bomb.png')bomb.x = 32bomb.y = 550bombs = bdef draw():# --省略--if begin:# --省略--screen.draw.text(str(bombs), (32, 582), fontsize=30, color='black')bomb.draw()def on_key_down(key):if begin:# --省略--if key == keys.Z:if bombs > 0:for e in enemys:e.y = 0e.x = randint(50, WIDTH - 50)kill += 1bombs -= 1with open('data/bombs.txt', 'w') as f:f.write(str(bombs))f.close()

import wxdef shopping():class MyFrame(wx.Frame):def __init__(self):# --省略--self.button1 = wx.Button(panel, 1, '购买炸弹(100金币)', pos=(50, 100))self.Bind(wx.EVT_BUTTON, self.bombshopping, self.button1)self.button1.SetDefault()# --省略--def bombshopping(self, event):with open('data/金币.txt') as f:c = int(f.read())f.close()if c>=100:self.button1.SetLabel('购买成功')with open('data/bombs.txt') as f:b = int(f.read())f.close()with open('data/bombs.txt', 'w') as f:f.write((str(b + 1)))f.close()with open('data/金币.txt') as f:c = int(f.read())f.close()with open('data/金币.txt', 'w') as f:f.write(str(c - 100))f.close()# --省略--

打飞机.py

def draw():# --省略--if begin:# --省略--else:# --省略--screen.draw.text('Press [s] to go shopping', (50, 460), fontsize=50, color='black')

def on_key_down():if begin:# --省略--else:# --省略--if key == keys.S:shopping()

介绍

创建information.py

import wxdef check_information():class MyFrame(wx.Frame):def __init__(self):super().__init__(None, title='信息简介', size=(500, 200), pos=(400, 400))panel = wx.Panel(parent=self)statictext = wx.StaticBox(parent=panel, label="欢迎进入《打飞机》游戏", pos=(10, 10))statictext = wx.StaticBox(parent=panel, label="你可以按下左右方向键控制英雄移动", pos=(10, 50))statictext = wx.StaticBox(parent=panel, label="按空格键发射子弹,并击杀敌人", pos=(10, 90))statictext = wx.StaticBox(parent=panel, label="你拥有5个炸弹,按【z】试一试!", pos=(10, 120))app = wx.App()frm = MyFrame()frm.Show()app.MainLoop()

def draw():if begin:# --省略--else:# --省略--screen.draw.text('Press [i] to get information', (30, 410), fontsize=50, color='black')

def draw():if begin:# --省略--else:# --省略--if key == keys.S:shopping()f2 = open('data/金币.txt', 'r') # 获取金币信息coin = int(f2.read())f2.close()

到此为止,游戏正式编写结束了!

源码

打飞机.py

# coding=gbkfrom random import randintfrom pgzrun import goimport settingsfrom information import check_informationfrom shop import shopping# 打开文件,获取数据f = open('data/level.txt', 'r') # 获取关卡数据level = int(f.read())f.close()f2 = open('data/金币.txt', 'r') # 获取金币信息coin = int(f2.read())f2.close()with open('data/bombs.txt') as f4: # 获取炸弹数量信息b = int(f4.read())f4.close()with open('data/plane.txt') as f5:p = f5.read()f5.close()live = 0if p == 'plane.png':live = 1elif p == 'srplane.png' or p == 'ssrplane.png':live = 2with open('data/log.txt') as f:logged = f.read()f.close()# 窗口数据WIDTH, HEIGHT = 500, 700TITLE = '打飞机'# 创建角色bg1 = Actor('bg2.png')bg1.x = 250bg1.y = 350bg2 = Actor('bg1.png')bg2.x = bg1.xbg2.y = bg1.y - 700plane = Actor(settings.planemodel)plane.x = 250plane.y = 600set = Actor('set(1).jpg')set.x = 20set.y = 20bullets = []bomb = Actor('bomb.png')bomb.x = 32bomb.y = 550bombs = benemys = []kill = 0begin = Falsefor i in range(6):enemy = Actor('enemy.png')enemy.x = 70 * (i + 1)enemy.y = 20enemys.append(enemy)def draw():global bombsbg1.draw()bg2.draw()text = 'level' + str(level)text2 = str(kill) + '/' + str((level + 1) * 10)text3 = 'coin:' + str(coin)screen.draw.text(text2, (230, 10), fontsize=50, color='black')screen.draw.text(text, (350, 10), fontsize=50, color='black')screen.draw.text(text3, (50, 10), fontsize=50, color='black')if begin:screen.draw.text(str(bombs), (32, 582), fontsize=30, color='black')bomb.draw()plane.image = settings.planemodelplane.draw()if plane.image != 'plane2.png':for b in bullets:b.draw()for i in enemys:i.draw()else:set.draw()screen.draw.text('Press [b] to begin', (100, 350), fontsize=50, color='black')screen.draw.text('Press [i] to get information', (30, 410), fontsize=50, color='black')screen.draw.text('Press [s] to go shopping', (50, 460), fontsize=50, color='black')def on_key_down(key):global begin, bombs, kill, coin, p, liveif begin:if key == keys.SPACE:if plane.image == 'ssrplane.png' and len(bullets) < 6:bullet = Actor('bullet1.png')bullet1 = Actor('bullet1.png')bullet.x = plane.x + 40bullet.y = plane.y - 50bullet1.x = plane.x - 40bullet1.y = plane.y - 50bullets.append(bullet)bullets.append(bullet1)else:if plane.image == 'srplane.png' and len(bullets) < 6:bullet = Actor('bullet1.png')bullet.x = plane.xbullet.y = plane.y - 30bullets.append(bullet)if plane.image == 'plane.png' and len(bullets) < 6:bullet = Actor('bullet1.png')bullet.x = plane.xbullet.y = plane.y - 30bullets.append(bullet)if key == keys.Z:if bombs > 0:for e in enemys:if bombs > 0:e.y = 0e.x = randint(50, WIDTH - 50)kill += 1bombs -= 1with open('data/bombs.txt', 'w') as f:f.write(str(bombs))f.close()else:if key == keys.B:begin = Trueif key == keys.I:check_information()if key == keys.S:shopping()f2 = open('data/金币.txt', 'r') # 获取金币信息coin = int(f2.read())f2.close()def on_mouse_down(pos):global beijing, liveif set.collidepoint(pos):settings.set()beijing = settings.beijingplane.image = settings.planemodelif settings.planemodel == 'plane.png':live = 1elif settings.planemodel == 'srplane.png' or settings.planemodel == 'ssrplane.png':live = 2def update():global kill, level, begin, coin, beijing, p, livestandard = (level + 1) * 10bg1.y += 2bg2.y += 2if bg1.y > 700 + 350:bg1.y = bg2.y - 700if bg2.y > 700 + 350:bg2.y = bg1.y - 700if begin:if kill > standard:kill = 0level += 1f = open('data/level.txt', 'w')f.write(str(level))f.close()speed = 2 + level * 0.1if keyboard.left:plane.x -= 5elif keyboard.right:plane.x += 5if plane.x < 0:plane.x += 10elif plane.x > 500:plane.x -= 10for b in bullets:b.y -= 5if b.y < 0:bullets.remove(b)for e in enemys:e.y += speedif e.bottom >= 700:e.y = 0e.x = randint(50, WIDTH - 50)if e.colliderect(plane):live -= 1if live == 0:plane.image = 'plane2.png'enemys.remove(e)kill = 0live = 2begin = Falseenemys.clear()bullets.clear()for i in range(6):enemy = Actor('enemy.png')enemy.x = 70 * (i + 1)enemy.y = 20enemys.append(enemy)else:e.y = 0e.x = randint(50, WIDTH - 50)for b in bullets:if e.colliderect(b):bullets.remove(b)e.y = 0e.x = randint(50, WIDTH - 50)kill += 1coin += 1f3 = open('data/金币.txt', 'w')f3.write(str(coin))f3.close()go()

shop.py

import wxdef shopping():class MyFrame(wx.Frame):def __init__(self):super().__init__(None, title='商店', size=(500, 300), pos=(400, 400))panel = wx.Panel(parent=self)statictext = wx.StaticBox(parent=panel, label="这里是《打飞机》游戏商店", pos=(10, 10))statictext = wx.StaticBox(parent=panel, label="你可以在这购买英雄皮肤", pos=(10, 50))self.button1 = wx.Button(panel, 1, '购买炸弹(100金币)', pos=(50, 100))self.Bind(wx.EVT_BUTTON, self.bombshopping, self.button1)self.button1.SetDefault()with open('data/sr.txt', 'r') as f:c = f.read()f.close()if c != '0':self.srtext = '已拥有SR级飞机'else:self.srtext = '购买SR级飞机(1000金币,两条命)'self.button = wx.Button(panel, -1, self.srtext, pos=(30, 150))self.Bind(wx.EVT_BUTTON, self.srshopping, self.button)self.button.SetDefault()with open('data/ssr.txt', 'r') as f:c2 = f.read()f.close()if c2 != '0':self.ssrtext = '已拥有SSR级飞机'else:self.ssrtext = '购买SSR级飞机(3000金币,两条命,一次发射两枚子弹)'self.button = wx.Button(panel, -1, self.ssrtext, pos=(30, 210))self.Bind(wx.EVT_BUTTON, self.ssrshopping, self.button)self.button.SetDefault()def bombshopping(self, event):with open('data/金币.txt') as f:c = int(f.read())f.close()if c>=100:self.button1.SetLabel('购买成功')with open('data/bombs.txt') as f:b = int(f.read())f.close()with open('data/bombs.txt', 'w') as f:f.write((str(b + 1)))f.close()with open('data/金币.txt') as f:c = int(f.read())f.close()with open('data/金币.txt', 'w') as f:f.write(str(c - 100))f.close()def srshopping(self, event):with open('data/金币.txt') as f:c = int(f.read())f.close()if self.srtext == '购买SR级飞机(两条命)' and c >= 1000:self.srtext = '已获得'self.button.SetLabel(self.srtext)with open('data/金币.txt', 'w') as f:f.write(str(c - 1000))f.close()with open('data/sr.txt', 'w') as f:f.write('1')f.close()def ssrshopping(self, event):with open('data/金币.txt') as f:c = int(f.read())f.close()if self.ssrtext == '购买SSR级飞机(3000金币,两条命,一次发射两枚子弹)' and c >= 3000:self.ssrtext = '已获得'self.button.SetLabel(self.ssrtext)with open('data/金币.txt', 'w') as f:f.write(str(c - 3000))f.close()with open('data/ssr.txt', 'w') as f:f.write('1')f.close()app = wx.App()frm = MyFrame()frm.Show()app.MainLoop()

settings.py

# coding=gbkimport wxf = open('data/plane.txt')planemodel = f.read()f.close()def set():class MyFrame(wx.Frame):def __init__(self):global beijingsuper().__init__(None, title='设置', size=(500, 250), pos=(400, 400))panel = wx.Panel(parent=self)statictext = wx.StaticBox(parent=panel, label="这里是《打飞机》游戏设置", pos=(10, 10))with open('data/sr.txt', 'r') as f:c = f.read()f.close()if c != '0':self.sr_go_out = '让SR飞机上场'else:self.sr_go_out = '未获得SR飞机'self.button = wx.Button(panel, -1, self.sr_go_out, pos=(60, 100))self.Bind(wx.EVT_BUTTON, self.srgoout, self.button)self.button.SetDefault()with open('data/ssr.txt', 'r') as f:c1 = f.read()f.close()if c1 != '0':self.ssr_go_out = '让SSR飞机上场'else:self.ssr_go_out = '未获得SSR飞机'self.button = wx.Button(panel, -1, self.ssr_go_out, pos=(60, 150))self.Bind(wx.EVT_BUTTON, self.ssrgoout, self.button)self.button.SetDefault()def srgoout(self, event):global planemodelif self.sr_go_out == '让SR飞机上场':with open('data/plane.txt', 'w') as f:f.write('srplane.png')planemodel = 'srplane'def ssrgoout(self, event):global planemodelif self.ssr_go_out == '让SSR飞机上场':with open('data/plane.txt', 'w') as f:f.write('ssrplane.png')planemodel = 'ssrplane'app = wx.App()frm = MyFrame()frm.Show()app.MainLoop()

information.py

import wxdef check_information():class MyFrame(wx.Frame):def __init__(self):super().__init__(None, title='信息简介', size=(500, 200), pos=(400, 400))panel = wx.Panel(parent=self)statictext = wx.StaticBox(parent=panel, label="欢迎进入《打飞机》游戏", pos=(10, 10))statictext = wx.StaticBox(parent=panel, label="你可以按下左右方向键控制英雄移动", pos=(10, 50))statictext = wx.StaticBox(parent=panel, label="按空格键发射子弹,并击杀敌人", pos=(10, 90))statictext = wx.StaticBox(parent=panel, label="你拥有一些炸弹,按【z】试一试!", pos=(10, 120))app = wx.App()frm = MyFrame()frm.Show()app.MainLoop()

bombs.txt

5

level.txt

1

plane.txt

plane.png

sr.txt

0

ssr.txt

0

金币.txt

0

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。