利用Python寫個(gè)簡(jiǎn)易版星空大戰(zhàn)游戲
前言
通過辣條最近觀察,大家好像對(duì)劃水摸魚是情有獨(dú)鐘啊。于是乎我重操舊業(yè)又寫上了這么一個(gè)簡(jiǎn)單版的星空大戰(zhàn)小游戲。

當(dāng)然了辣條的初衷絕對(duì)不是讓你們劃水摸魚啊,是真想你們能從中學(xué)習(xí)那么一點(diǎn)點(diǎn)東西的,總而言之希望大家在Python這條路上少踩坑吧,因?yàn)樽蛱爝€有人在跟學(xué)長(zhǎng)說,以后增刪改查一樣拿高薪,我不信現(xiàn)在都?jí)櫬涑蛇@樣子了
就像問一下懂事理的兄弟姐妹們,你們覺得有可能嘛?
一.游戲畫面

二.游戲結(jié)束畫面

三.游戲素材


四.游戲代碼
星空飛碟大戰(zhàn).py
由于配音需要混音器,這里用到了pygame的混音器,
五、核心代碼
1.導(dǎo)入模塊
from sprites import * import pygame.mixer
2.動(dòng)態(tài)星空背景函數(shù)
def star_move():
"""動(dòng)態(tài)星空背景函數(shù)"""
for star in stars:
star.move(0,-20)
if star.ycor() < -height//2:
x = random.randint(-width//2,width//2)
y = random.randint(10+height//2,height*2)
star.reborn(x,y,0,-20)
3.不定時(shí)產(chǎn)生敵機(jī)函數(shù)
def spawn_enemy():
"""不定時(shí)產(chǎn)生敵機(jī)函數(shù)"""
if random.randint(1,10)==1 and len(enemys)<10:
x = random.randint(-200,200)
y = random.randint(100,300)
enemy = Sprite(shape='res/ufo.png',visible=False,pos=(x,y),tag='enemy')
enemy._rotatemode = 1
enemy.scale(0.5)
enemy.setheading(random.randint(1,360))
enemy.show()
4.飛碟的移動(dòng)
def enemymove():
"""飛碟的移動(dòng)"""
for e in enemys:
e.fd(3)
# 設(shè)定一定的機(jī)率讓ufo朝向player
if random.randint(10,100) == 10 and \
abs(e.xcor())<200 and abs(e.ycor()<250):
e.heading(player)
e.bounce_on_edge()
5.子彈的移動(dòng)
def bulletmove():
"""子彈的移動(dòng)"""
for b in list(bullets):
b.move(0,10)
if b.collide_edge():b.remove()
6.玩家射擊函數(shù)
def player_shoot():
"""玩家射擊函數(shù)"""
if player.alive == False : return
if m1.down() and framecounter % 5 == 0 :
b = Sprite(shape='circle',visible=False,tag='bullet')
b.scale(0.5)
b.color('yellow')
b.goto(player.pos()) # 移到player坐標(biāo)
b.show() # 顯示子彈
shoot.play() # 播放射擊聲
7.播放背景音樂與生成聲效對(duì)象
# 播放背景音樂與生成聲效對(duì)象
pygame.mixer.init()
pygame.mixer.music.load('audio/FrozenJam.ogg')
pygame.mixer.music.play(-1,0)
explosion = pygame.mixer.Sound('audio/expl3.wav')
shoot = pygame.mixer.Sound('audio/pew.wav')
8.新建屏幕
width,height = 480,640
screen = Screen() # 新建屏幕
screen.bgcolor('black') # 屏幕背景色為黑
screen.setup(width,height)
screen.title("星空飛碟大戰(zhàn)by大海老師")
screen.addshape('res/fighter.png')
screen.addshape('res/ufo.png')
frames = ['res/explosion0.png','res/explosion1.png']
[screen.addshape(frame) for frame in frames]
9.移動(dòng)圖章實(shí)現(xiàn)星星
# 星星,用來做向下滾動(dòng)背景,星星的移動(dòng)也可以通過移動(dòng)圖章實(shí)現(xiàn)
# 這樣可以有更多的星星。如果用克隆的話有數(shù)量限制,根據(jù)計(jì)算機(jī)配置不同而不同。
star = Sprite(shape='circle')
star.color('white')
star.scale(0.1)
stars = [star]
stars.extend([star.clone() for _ in range(20)])
for star in stars:
x = random.randint(-width//2,width//2)
y = random.randint(10+height//2,height*2)
star.goto(x,y)
10.哭臉
cry = Sprite(shape='cry.png',visible=False,pos=(0,100))
11.玩家
player = Sprite(shape='res/fighter.png',pos=(0,-200))
player.scale(0.65)
player.alive = True ? ? ? ? ? ? # 表示player是活的
m1 = Mouse() ? ? ? ? ? ? ? ? ? ?# 鼠標(biāo)左鍵檢測(cè)實(shí)例
clock = Clock() ? ? ? ? ? ? ? ? # 實(shí)鐘對(duì)象,用來控制fps
framecounter = 0
counter = 0 ? ? ? ? ? ? ? ? ? ? # 統(tǒng)計(jì)擊中的ufo數(shù)量
bullets = Group('bullet') ? ? ? # 子彈組
enemys = Group('enemy') ? ? ? ? # ufo敵人組12.飛碟移動(dòng)與子彈移動(dòng)
while counter<100:
framecounter += 1 # 幀計(jì)數(shù)器
spawn_enemy() # 不定時(shí)產(chǎn)生敵機(jī)UFO
player_shoot() # 單擊鼠標(biāo)左鍵,射擊子彈
enemymove() # 飛碟們的移動(dòng)
bulletmove() # 子彈的移動(dòng)
if player.alive:
player.goto(mousepos())
else:
cry.show() # 顯示哭臉,表示失敗
star_move() # 星空滾動(dòng)背景
13.敵機(jī)的碰撞檢測(cè)
for e in list(enemys): ? ? ? ?# 對(duì)每架敵機(jī)進(jìn)行碰撞檢測(cè)
? if e.collide(player,scale=0.6): ? ? ? ? ? ?
? ? ? explode(e.position(),frames)
? ? ? e.remove()
? ? ? explode(player.pos(),frames)
? ? ? player.remove()
? ? ? player.alive = False
? ? ? explosion.play() ? ? ? ? # 爆炸聲
? ? ? break
? # 敵機(jī)是否碰到任意一顆子彈
? for b in list(bullets):
? ? if b.collide(e,scale=0.6): # 如果子彈碰到UFO ? ? ? ?
? ? ? explode(e.position(),frames)
? ? ? e.remove()
? ? ? b.remove()
? ? ? explosion.play() ? ? ? ? # 爆炸聲
? ? ? counter +=1 ? ? ? ? ? ? ?# 進(jìn)行統(tǒng)計(jì) ? ? ? ??
? ? ? break ? ? ? ? ? ?
screen.title('星空飛碟大戰(zhàn),當(dāng)前擊斃:' + ?str(counter) + " 架UFO") ?
clock.tick(60)14.闖關(guān)成功把子彈刪除
[b.remove() for b in list(bullets)] # 闖關(guān)成功把子彈刪除
for e in list(enemys): ? ? ? ? ? ? ?# 每架飛碟都爆炸
? explode(e.position(),frames)
? e.remove() ?
? clock.tick(10)
? ??
t = Turtle(visible=False)
t.color('yellow')
t.write('成功闖關(guān)!',align='center',font=('黑體',32,'normal'))
while True:
? player.goto(mousepos())?
? star_move() ? ? ? ? ? ? ? ? ? # 星空滾動(dòng)背景 ?
? clock.tick(60)六、總結(jié)
看到這里的都是妥妥的鐵粉無疑了,既然是鐵粉那就給你們一次親密接觸機(jī)會(huì),底下是我的個(gè)人ming片找到我的可是有大把源碼,學(xué)習(xí)路線啥的,多的我就不透露,看大家自己的積極性了啊~
其次呢再次重申辣條我真的不是想讓你們摸魚的,雖然說是個(gè)很簡(jiǎn)單的東西,但是對(duì)于初學(xué)者,或者基礎(chǔ)不扎實(shí)的弟弟妹妹們而言估計(jì)也很難實(shí)現(xiàn)出來的,所以最后大家加油吧~
以上就是利用Python寫個(gè)簡(jiǎn)易版星空大戰(zhàn)游戲的詳細(xì)內(nèi)容,更多關(guān)于Python星空大戰(zhàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)多條件篩選Excel數(shù)據(jù)并批量繪制直方圖
這篇文章主要為大家介紹了如何Python對(duì)Excel數(shù)據(jù)進(jìn)行多條件篩選和去除并批量繪制直方圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2023-09-09
100 個(gè) Python 小例子(練習(xí)題三)
這篇文章主要給大家分享的是100 個(gè) Python 小例子,前期已經(jīng)給大家分過100個(gè)小例子的(一)和(二),今天小編繼續(xù)和大家分享(三),希望歲正在學(xué)習(xí)的你有所幫助2022-01-01

