導語
??
??
??
??
?
??
??
??
??
?
不知道紅白機上的《魂斗羅》是不是小伙伴兒們小時候的經典回憶呢?反正木木子那時候貌似是有
的,BUT 女孩子一般是不玩兒這類游戲的!!
(哎呀,木木子是不是偷偷保住了我年齡的秘密......)??
?
魂斗羅是一款經典動作射擊闖關類游戲,在當時的游戲市場上,可以說是一款相當有挑戰難度的游戲,畢竟那時候訊息閉塞,壓根沒有攻略之說,更何況那時年少,玩游戲圖的是爽快,很多人也不會刻意去深度研究卡位、戰斗技巧等,就是最基礎的突突突、閃閃閃,于是就有了N種死亡經歷,
今天木木子帶大家來看看如何打造Python像素版本的經典游戲——魂斗羅叭!🌄
像素風游戲型別之前也有幾款的哈比如:《我的世界》、《坦克大戰》、《超級馬里奧》......可以
看文末的文章匯總哈!往期的資料素材等都在顧木子的主頁左側資訊獲取哈!
?
??
??
??
??
?
??
??
??
??
?
正文
🛕這邊是一個簡易版本的魂斗羅哈,有大佬自行優化一波!純分享給大家娛樂,
大家都知道Python版本的游戲撰寫基本上都是Pygame游戲模塊,今天就用的這個哈,
游戲規則:上下左右大家熟悉的——ASDW鍵,K跳躍,J放槍子兒,
打完一個小兵一個大boss就闖關成功了,嗯哼——超簡單,有手就玩的贏的游戲23333!🌞
一、準備中
1)素材準備
像素風格任務人物形象(區域分)

背景圖展示:

主要人物素材:
(部分圖)
?


2)環境安裝
這款簡易版本的《魂斗羅游戲》木木子環境設定的是:Python3、Pycharm、Pygame部分自帶的不說了哈,
模塊安裝:
pip install -i https://pypi.douban.com/simple/ +模塊名
??
??
??
??
?
??
??
??
??
?
二、正式敲代碼
1)游戲敵方boss出場以及定義,
import pygame
import random
from pygame.sprite import Sprite
import datetime
class Game_Boss(Sprite):
def __init__(self,game_settings,screen,player):
super().__init__()
self.pos_i = 0.0
self.pos_j = 0.0
self.pos_k = 0.0
self.game_settings = game_settings
self.screen = screen
self.image = pygame.image.load('圖片/boss/left/move/bz1.png')
self.rect = self.image.get_rect()
self.rect.x = self.game_settings.screen_width-self.rect.width
self.rect.bottom = 370
self.x = float(self.rect.x)#敵人的位置
self.speed_factor = self.game_settings.enemy_speed_factor
self.boss_start_Y = 370#開始boss人物的高度
self.boss_Y = self.boss_start_Y
self.attack1_order = 0
self.player = player
self.mx = self.x
def blitme(self):
self.screen.blit(self.image,self.rect)
def update(self):
if self.game_settings.boss_alive:
self.direction()
self.rand_att()
if self.game_settings.attack_1:
if self.game_settings.boss_direction == 1:
self.attack_1('left')
else:
self.attack_1('right')
elif self.game_settings.attack_2:
if self.game_settings.boss_direction == 1:
self.attack_2('left')
else:
self.attack_2('right')
elif self.game_settings.boss_jump:
self.jump()
elif self.game_settings.boss_run:
if self.game_settings.boss_direction == 1:
self.run('left')
else:
self.run('right')
elif self.player.rect.centerx > self.rect.x:
self.x += self.speed_factor
self.rect.x = self.x
self.move('right')
elif self.player.rect.centerx < self.rect.x:
self.x -= self.speed_factor
self.rect.x = self.x
self.move('left')
else:
self.boom()
self.game_settings.game_win = True
def rand_att(self):
random.seed(datetime.datetime.now())
if self.game_settings.attack_1 == False and self.game_settings.attack_2 == False and self.game_settings.boss_jump == False and self.game_settings.boss_run == False:
self.rand_num = random.randint(1,70)
if self.rand_num == 1:
self.game_settings.attack_1 = True
elif self.rand_num == 2:
self.game_settings.attack_2 = True
elif self.rand_num == 3:
self.game_settings.boss_jump =True
elif self.rand_num == 4:
self.game_settings.boss_run = True
def attack_1(self,direction):
self.rect.bottom = 410#做此動作時人物的位置
self.names1 = locals()
self.players1 = []
for self.j in range(0,34):
self.names1['player_image%s' %self.j] = pygame.image.load('圖片/boss/'+direction+'/attack_1/%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.5
if self.pos_i >= 34.0 :#回圈完成后:
self.pos_i = 0.0
self.game_settings.attack_1 = False
def attack_2(self,direction):
self.rect.bottom = 355
self.names1 = locals()
self.players1 = []
for self.j in range(0,30):
self.names1['player_image%s' %self.j] = pygame.image.load('圖片/boss/'+direction+'/attack_2/%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.5
if self.pos_i >= 30:
self.pos_i = 0.0
self.game_settings.attack_2 = False
def move(self,direction):#回圈圖片
self.rect.bottom = 370
self.names1 = locals()
self.players1 = []
for self.j in range(1,7):
self.names1['player_image%s' %self.j] = pygame.image.load('圖片/boss/'+direction+'/move/bz%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.1#圖片變化速率
if self.pos_i > 6.0:#敵人bag有4個動作
self.pos_i = 0.0
def run(self,direction):
self.rect.bottom = 400
self.names1 = locals()
self.players1 = []
for self.j in range(0,6):
self.names1['player_image%s' %self.j] = pygame.image.load('圖片/boss/'+direction+'/run/%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.3
if self.pos_i >= 6:
self.pos_i = 0.0
self.game_settings.boss_run = False
if self.player.rect.centerx > self.rect.x :#or self.x < self.mx:
self.x += 6
self.rect.x = self.x
elif self.player.rect.centerx < self.rect.x :#or self.x > self.mx:
self.x -= 6
self.rect.x = self.x
def jump(self):
self.rect.bottom = self.boss_Y
if self.game_settings.boss_jump_vel < 0:
self.game_settings.boss_jump_vel += 0.6#跳躍上升的增加的速率
elif self.game_settings.boss_jump_vel > 0:
self.game_settings.boss_jump_vel += 0.8#跳躍下降增加的速率
self.boss_Y += self.game_settings.boss_jump_vel
if self.boss_Y > self.boss_start_Y:
self.game_settings.boss_jump = False#結束跳躍
self.boss_Y = self.boss_start_Y
self.game_settings.boss_jump_vel = -12.0#恢復跳躍開始的速度
if self.player.rect.centerx > self.rect.x :#or self.x < self.mx:
self.x += self.speed_factor
self.rect.x = self.x
elif self.player.rect.centerx < self.rect.x :#or self.x > self.mx:
self.x -= self.speed_factor
self.rect.x = self.x
self.names1 = locals()
self.players1 = []
for self.j in range(3,10):
self.names1['player_image%s' %self.j] = pygame.image.load('圖片/boss/left/jump/%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_j)]
self.pos_j += 0.4#跳躍旋轉速率
if self.pos_j >= 7:#跳躍有7個動作
self.pos_j = 0.0
def direction(self):
if self.player.rect.centerx > self.rect.x:
self.game_settings.boss_direction = -1
else:
self.game_settings.boss_direction = 1
def boom(self):
self.names1 = locals()
self.players1 = []
for self.j in range(1,4):
self.names1['player_image%s' %self.j] = pygame.image.load('圖片/boss/boom%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_k)]
self.pos_k += 0.05
if self.pos_k >= 3.0:
#self.game_settings.boom_end = True
self.game_settings.boss_boom_end = True
2)玩家定義的子彈設定
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
def __init__(self,game_settings,screen,player):
super().__init__()
self.game_settings = game_settings
self.player = player
self.screen = screen
self.image = pygame.image.load('圖片/bullet1.png')
self.rect = self.image.get_rect()
self.rect.left = player.rect.right-20#開始子彈默認往右射擊
if self.player.player_direction == -1:
self.rect.right = player.rect.left+20
self.rect.centery = player.rect.centery-15
if self.player.player_down:
self.rect.centery = player.rect.centery#調整子彈位置
if self.player.player_up:
self.rect.bottom = player.rect.top+20
self.x = float(self.rect.x)
self.y = float(self.rect.y)
self.mx = self.x#mx為保存初始x的坐標
self.my = self.y
self.speed_factor = game_settings.bullet_speed_factor
def update(self):
if self.y<self.my or self.y == self.my and self.x == self.mx and self.player.player_up:
self.y -= self.speed_factor
self.rect.y = self.y
elif self.x < self.mx or self.x == self.mx and self.player.player_direction == -1:
self.x -= self.speed_factor
self.rect.x = self.x
elif self.x>self.mx or self.x == self.mx:#默認為右方向
self.x += self.speed_factor
self.rect.x = self.x
def blit_bullet(self):
self.screen.blit(self.image,self.rect)
3)主程式
'''
csdn:顧木子吖
'''
import pygame
import sys
from pygame.locals import *
from settings import Settings
from game_player import Game_Player
import game_functions as gf
from pygame.sprite import Group
from game_stats import GameStats
from game_boss import Game_Boss
from button import Button
def run_game():
bg = pygame.image.load("圖片/map01.jpeg")
game_settings = Settings()
pos_x = 0#地圖移動o
pygame.init()
screen = pygame.display.set_mode(
(game_settings.screen_width,game_settings.screen_height))
pygame.display.set_caption("經典像素風游戲——魂斗羅")
stats = GameStats(game_settings)
player = Game_Player(game_settings,screen)
bullets = Group()
boss = Group()
enemys = Group()
win_button = Button(game_settings,screen,"YOU WIN")
gf.create_legion(game_settings,screen,enemys)
gf.create_boss(game_settings,screen,player,boss)
while True:
pygame.mouse.set_visible(False)
gf.check_events(game_settings,screen,player,bullets)
gf.update_player(game_settings,stats,player,enemys)
gf.update_bullet(game_settings,bullets,screen,enemys,boss)
gf.update_enemys(game_settings,enemys)
gf.update_boss(game_settings,boss)
gf.update_screen(game_settings,bg,pos_x,screen,player,bullets,enemys,boss,win_button)
if player.moving_right and player.center > player.screen_rect.centerx and game_settings.boss_appear == False:
game_settings.screen_rolling = True
pos_x -= 5#螢屏滾動速度
else:
game_settings.screen_rolling = False
run_game()
等等等等.......游戲代碼太多了,
??
??
??
??
?
??
??
??
??
?
?三、效果展示
我的速度調的比較快哈,自己調慢點兒,
1)Part 1 初始化界面🧛?♀?

2)Part 2 打BOSS🧛?♂?

3)Part 3 勝利👆

??
??
??
??
?
??
??
??
??
?
總結
嘿!新一輪的小游戲就寫到這里結束啦,如需完整的資料專案點下方鏈接哦~
我還得想想下一個寫什么內容呢——苦思冥想中,你們玩兒,我先撤了,
往期的資料素材等都在顧木子的主頁左側資訊獲取哈!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/348517.html
標籤:其他
上一篇:C語言五子棋進階版(增設玩家對戰,大棋盤,棋盤行列對應等)
下一篇:Jetson (Nano/NX/TX2)Jetpack4.*Cuda10.2 CuDNN8.0 Opencv4.安裝caffe
