python小游戏——散刺修罗场
這是一個為了給逍遙散人慶生做的python小游戲!
- 前言
- 正文
- 動畫演示
- 動畫的實現(假)
- 規范參數
- 實現附加功能
- 多種怪獸類型隨機出現
- 按R重來
- 彩蛋部分——boss出場
- 源代碼
- 這是沒有彩蛋部分的代碼
- 這是有boss彩蛋的代碼
前言
用的大佬的源代碼,用了三天時間稍加改動。之前博主沒有接觸過任何pygame做游戲的方面,python也只會用海龜畫圖,其他只會一些c和java,是真的小白!!
在這里放出原大佬的鏈接,陳澤光的回答:乞丐子大戰騎士
上面已經對代碼進行了詳細的講解,下面我就只記錄我改動的部分和一些收獲
正文
動畫演示
【散人生賀】我做了一個小游戲給散老師!
動畫的實現(假)
很抱歉我最后還是沒有實現動畫,原主說乞丐子是用的三個一樣的圖片,只要換掉另外兩張就能實現動畫效果。類似精靈序列?但是我沒有原主的素材自己也不知道具體是什么樣的所以就把乞丐子的動圖效果改掉了,用的是就是注釋了Begger類中的如下兩行,換成了一張單獨的圖片,而不是序列圖片
之后我也嘗試了用精靈序列,但是基礎還是太差了,時間上也來不及(因為從開始做游戲到使用只有3天時間)
class Begger(object):#類初始化def __init__(self, img, rect, speed):# self.ful_img = img# self.imgs = [self.ful_img.subsurface(Rect((i*83, 0), (begger_width/3, begger_height)))# for i in range(3)]self.imgs = imgself.rect = rectself.speed = speedself.num = 0規范參數
在原主的代碼里有部分參數直接寫在了代碼核心區,設置成了定值,我基本都在基礎設置的初始化區或者是新一局游戲的開局設置區做了起名
# 1.2 - 基礎設置區---------------------------------------------pygame.init()# 初始化 # 2.2 - 游戲進行區---------------------------------------------while 1:# 2.2.0游戲開局設置區---------------------------------# 初始化kid的移動速度和初始位置實現附加功能
多種怪獸類型隨機出現
這里先用了一個暫時的怪獸矩形,先判斷暫時怪獸所在矩形范圍是否與前面生成的所有怪獸矩形重合,如果重合則不添加到怪獸列表中,不重合則添加到列表中
這里我給怪獸做了很多屬性設定:img、ret、type、width、height。其實后來寫完了回過頭發現是可以用怪獸類解決的,就不用這里這么麻煩的從這個列表跳到另一個列表
按R重來
之前的游戲勝利或失敗了就只能退出游戲重新進,這里將游戲進行區和游戲結束區寫進了一個while循環實現R重來
# 2.2 - 游戲進行區---------------------------------------------while 1:在原代碼最后加上
# 按r重來for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == K_r:start = 1running = 1start_time = datetime.datetime.now()彩蛋部分——boss出場
這一段在原游戲勝利的基礎上增加了幾秒鐘出現了一個moster_boss,這個boss是打不死的,只是運動到墻的位置就直接跳轉到勝利界面。
這一段代碼寫的有點糟糕,大部分都是之前重復的代碼,直接在游戲成功的部分寫了一遍人物運動、怪獸運動、子彈命中、游戲操作這些部分。這個功能的實現在游戲層面上基本沒有意義,只是作為散人生賀視頻的彩蛋環節
因為代碼重復過多,這里只放了彩蛋部分的開頭和結尾
——————————————————————————————————————————————————————
源代碼
這是沒有彩蛋部分的代碼
# 0 - 模塊區 import os import sys import math import random import pygame import datetime from pygame.locals import * import timeclass Begger(object):#類初始化def __init__(self, img, rect, speed):# self.ful_img = img# self.imgs = [self.ful_img.subsurface(Rect((i*83, 0), (begger_width/3, begger_height)))# for i in range(3)]self.imgs = imgself.rect = rectself.speed = speedself.num = 0# 用wasd控制kid移動def update(self, screen, press_keys):if press_keys[K_a]:self.rect.left -= self.speed# 限制左邊界if self.rect.left <= 0:self.rect.left = 0if press_keys[K_d]:self.rect.left += self.speed# 限制右邊界if self.rect.right >= 200:self.rect.right = 200if press_keys[K_w]:self.rect.top -= self.speed# 限制上邊界if self.rect.top <= 0:self.rect.top = 0if press_keys[K_s]:self.rect.top += self.speed# 限制下邊界if self.rect.bottom >= 640:self.rect.bottom = 640#??# self.num += 1# if self.num % 3 == 0:# self.num = 0return [(self.rect.left + self.rect.right)/2, (self.rect.top + self.rect.bottom)/2], self.imgs# 主要的工作區域 if __name__ == '__main__':# 1 - 設置區-------------------------------------------------------------# 1.1 - 窗口設置區---------------------------------------------white = (255, 255, 255)screen_width, screen_height = 1024, 600os.environ['SDL_VIDEO_CENTERED'] = '1'screen = pygame.display.set_mode((screen_width, screen_height))pygame.display.set_caption("Pas_Game")# 1.2 - 基礎設置區---------------------------------------------pygame.init()start = 0win = 0running = 0# 200里外建造城墻distance = 200# 健康值初始化,設置健康值最大值health_value_max = 194# 設置結束時間,獲取當前時間fin_time = 20start_time = datetime.datetime.now()# 初始化kid的移動速度和初始位置bg_speed = 2# 初始化怪獸的前進速度、產生速度monster_speed = 1monster_pro_speed = 150# 子彈速度為1.5,限制最多存在4個子彈wave_speed = 1.5wave_max = 7# 1.3游戲圖片加載---------------------------------------------# 游戲素材地址fig_path = r'D:\PycharmProjects\untitled1\resources\images/'# 讀背景圖片paper = pygame.image.load(fig_path + 'paper.png').convert_alpha()# 完整的刺兒wall = pygame.image.load(fig_path + 'wall.png').convert_alpha()wall_width = wall.get_width()wall_height = wall.get_height()# 受傷的刺兒wall_cry = pygame.image.load(fig_path + 'walls.png').convert_alpha()wall_cry_width = wall_cry.get_width()wall_cry_height = wall_cry.get_height()# kidbegger = pygame.image.load(fig_path + 'kid.png').convert_alpha()begger_width = begger.get_width()begger_height = begger.get_height()# 子彈sub_wave = pygame.image.load(fig_path + 'waves.png').convert_alpha()# 能量波隨時間漸弱# sub_wave = waves.subsurface(Rect((0, 0), (waves.get_width() / 5, waves.get_height())))sub_wave_width = sub_wave.get_width()sub_wave_height = sub_wave.get_height()# 怪獸monster1_img = pygame.image.load(fig_path + 'monster1.png').convert_alpha()monster1_width = monster1_img.get_width()monster1_height = monster1_img.get_height()monster2_img = pygame.image.load(fig_path + 'monster2.png').convert_alpha()monster2_width = monster2_img.get_width()monster2_height = monster2_img.get_height()monster3_img = pygame.image.load(fig_path + 'monster3.png').convert_alpha()monster3_width = monster3_img.get_width()monster3_height = monster3_img.get_height()monster4_img = pygame.image.load(fig_path + 'monster4.png').convert_alpha()monster4_width = monster4_img.get_width()monster4_height = monster4_img.get_height()monster5_img = pygame.image.load(fig_path + 'monster5.png').convert_alpha()monster5_width = monster5_img.get_width()monster5_height = monster5_img.get_height()monster6_img = pygame.image.load(fig_path + 'monster6.png').convert_alpha()monster6_width = monster6_img.get_width()monster6_height = monster6_img.get_height()monsters_img = [monster1_img, monster2_img, monster3_img, monster4_img, monster5_img, monster6_img]monsters_width = [monster1_width, monster2_width, monster3_width, monster4_width, monster5_width, monster6_width]monsters_height =[monster1_height, monster2_height, monster3_height, monster4_height, monster5_height, monster6_height]monster_type_num = len(monsters_img)# 血條health_bar_img = pygame.image.load(fig_path + "health_bar.png")health_bar_height = health_bar_img.get_height()health_imgs = pygame.image.load(fig_path + "health.png")health_img = health_imgshealth_height = health_img.get_height()# 游戲勝利與游戲結束圖片victory = pygame.image.load(fig_path + 'victory.png')game_over = pygame.image.load(fig_path + 'game_over.png')game_over_width = game_over.get_width()game_over_height = game_over.get_height()# 游戲開始封面start_img = pygame.image.load(fig_path + 'start.png').convert_alpha()# 2 - 游戲區--------------------------------------------------------------# 游戲開始while not start:screen.fill(white)screen.blit(start_img, (0, 0))pygame.font.init()# pygame.font.Font選擇字體樣式和大小font = pygame.font.Font(None, 40)# font.render顯示文本內容,是否開啟抗鋸齒(即是否光滑),文本顏色text = font.render("Press Space to Start !",True, (255,251,240)) # 乳白色text_Rect = text.get_rect()text_Rect.centerx = screen.get_rect().centerxtext_Rect.centery = screen.get_rect().centery + 250screen.blit(text, text_Rect)pygame.display.flip()# 獲取鍵盤事件for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == K_SPACE:start = 1running = 1# 背景音樂# pygame.mixer.music.load(fig_path + "Checkpoint.mp3")# pygame.mixer.music.play(1, 0.0)# pygame.mixer.music.set_volume(0.15)start_time = datetime.datetime.now()# 2.2 - 游戲進行區---------------------------------------------while 1:# 2.2.0游戲開局設置區---------------------------------# 初始化kid的移動速度和初始位置rect_bg = Rect(50, 50, 133, 142)begger_pos = []# 建立一個新的Begger類對象bg = Begger(begger, rect_bg, bg_speed)# 初始化怪獸的位置monsters = []list_monster_type = []# 這里的type列表用來存放新生成怪獸的類型,我覺得其實可以和位置合并為同一個變量,類似c的結構體但是我不會# 初始化子彈位置wave_set = []# 初始化血量health_value = health_value_maxhealth_img = health_imgswhile running:# 2.2.1 - 游戲顯示區-------------------------------screen.fill(white)screen.blit(paper, (0, 0))# 顯示城墻# 判斷血量少于75則刺兒受傷if health_value <= 75:for height in range(0, screen_height, wall_cry_height):screen.blit(wall_cry, (distance, height))else:for height in range(0, screen_height, wall_height):screen.blit(wall, (distance, height))# kid隨鼠標移動而旋轉press_keys = pygame.key.get_pressed()begger_pos, begger_img = bg.update(screen, press_keys)position = pygame.mouse.get_pos()angle = math.atan2(position[1] - (begger_pos[1] + begger_height),position[0] - (begger_pos[0] + begger_width))begger_rot = pygame.transform.rotate(begger_img, 360 - angle * 57.29)begger_pos1 = (begger_pos[0] - begger_rot.get_rect().width / 2,begger_pos[1] - begger_rot.get_rect().height / 2)screen.blit(begger_rot, begger_pos1)# 設置子彈for wave in wave_set:index = 0vel_x = math.cos(wave[0]) * wave_speedvel_y = math.sin(wave[0]) * wave_speedwave[1] += vel_xwave[2] += vel_yif wave[1] < - sub_wave_width or wave[1] > screen_width \or wave[2] < - sub_wave_height or wave[2] > screen_height:wave_set.pop(index) # pop移除列表index位置的對象index += 1for projectile in wave_set:# wave1 = pygame.transform.rotate(sub_wave, 360 - projectile[0] * 57.29)# .rotate(surface, angle)返回一個旋轉后的surface對象,默認逆時針旋轉,angle小于0時則順時針, 此處子彈素材為中心對稱可不旋轉screen.blit(sub_wave, (projectile[1], projectile[2]))# 設置怪獸# 此處生成0~monster_pro_speed-1的隨機數,若生成0則產生一個新的monster,用以控制monster的生成速度monster_timer = random.choice(range(monster_pro_speed))if monster_timer < 1:# 確定怪獸種類monster_type_temp = random.randint(0, monster_type_num-1)monster_img_temp = monsters_img[monster_type_temp]monster_width_temp = monsters_width[monster_type_temp]monster_height_temp = monsters_height[monster_type_temp]monster_temp = [screen_width,random.randint(monster_height_temp, screen_height - monster_height_temp)]# random.randint產生區間范圍內的隨機整數monster_temp_rect = pygame.Rect(monsters_img[monster_type_temp].get_rect())monster_temp_rect.left = monster_temp[0]monster_temp_rect.top = monster_temp[1]# 第一只怪獸直接顯示if len(monsters) == 0:monster_type = monster_type_tempmonster_img = monster_img_tempmonster_width = monster_width_tempmonster_height = monster_height_tempmonsters.append(monster_temp)list_monster_type.append(monster_type)else:for monster in monsters:monster_type = list_monster_type[monsters.index(monster)]monster_rect = pygame.Rect(monsters_img[monster_type].get_rect())monster_rect.left = monster[0]monster_rect.top = monster[1]# 如果兩個monster交叉,則臨時的怪獸不存入monsters列表if monster_temp_rect.colliderect(monster_rect):breakelse:# 如果到達了最后一個monsterif monsters.index(monster) == len(monsters)-1:monster_type = monster_type_tempmonster_img = monster_img_tempmonster_width = monster_width_tempmonster_height = monster_height_temp# 將有效的臨時怪獸添加至monsters列表monsters.append(monster_temp)list_monster_type.append(monster_type)# 顯示怪獸for monster in monsters:monsters_type = list_monster_type[monsters.index(monster)]screen.blit(monsters_img[monsters_type], monster)index = 0# 如果子彈碰到蘋果則打擊成功,如果蘋果接觸到刺兒測扣除自身20-40健康值for monster in monsters:monsters_type = list_monster_type[monsters.index(monster)]if monster[0] < - monsters_width[monsters_type]:monsters.pop(index)list_monster_type.pop(index)# 怪獸移動monster[0] -= monster_speedmonster_rect = pygame.Rect(monsters_img[monsters_type].get_rect())monster_rect.top = monster[1]monster_rect.left = monster[0]# 怪獸到達刺兒位置則扣除血條20-40if monster_rect.left < wall_width + distance:health_value -= random.randint(20, 40)monsters.pop(index)list_monster_type.pop(index)index1 = 0for wave in wave_set:wave_rect = pygame.Rect(sub_wave.get_rect())wave_rect.left = wave[1]wave_rect.top = wave[2]# 檢查怪獸和子彈兩個矩形塊是否交叉,交叉則移除兩個矩形塊if monster_rect.colliderect(wave_rect):wave_set.pop(index1)try:monsters.pop(index)list_monster_type.pop(index)except IndexError as error:print("IndexError: " + str(error))index1 += 1index += 1# 血條和時間顯示font = pygame.font.Font(None, 42)cur_time = datetime.datetime.now()play_time = (cur_time - start_time).seconds# 時間顯示if play_time % 60 < 10:time_str = ":0"else:time_str = ":"survived_text = font.render(str(play_time // 60) +time_str +str(play_time % 60),True, (0, 0, 0))text_Rect = survived_text.get_rect()text_Rect.topright = [screen_width - 5, 5]screen.blit(survived_text, text_Rect)# 設置血條框的位置health_bar_img = pygame.transform.scale(health_bar_img,(health_value_max+2, health_bar_height))screen.blit(health_bar_img, [0, 5])# 設置血條的位置if health_value < 0:health_value = 0health_img = pygame.transform.scale(health_img,(health_value, health_height))screen.blit(health_img, [1, 7])pygame.display.flip()## 2.2.2 - 游戲操作區---------------------------for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()# 發射子彈if event.type == pygame.MOUSEBUTTONDOWN and len(wave_set) < wave_max:position = pygame.mouse.get_pos()wave_set.append([math.atan2(position[1] - (begger_pos1[1] + begger_height/2 + begger_height),position[0] - (begger_pos1[0] + begger_width + begger_width)),begger_pos1[0] + begger_width, begger_pos1[1] + begger_height/2])# if pygame.time.get_ticks() >= fin_time * 1000:if play_time >= fin_time:running = 0win = 1if health_value == 0:running = 0win = 0# 游戲結束成功或失敗while not running and start:pygame.mixer.music.stop()if win:screen.blit(victory, (0, 0))pygame.font.init()font = pygame.font.Font(None, 84)text = font.render("Victory !",True, (250, 50, 200))text_Rect = text.get_rect()text_Rect.centerx = screen.get_rect().centerx + 20text_Rect.centery = screen.get_rect().centery - 250screen.blit(text, text_Rect)if not win:screen.blit(game_over, ((screen_width-game_over_width)/2, (screen_height-game_over_height)/2))pygame.display.flip()# 按r重來for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == K_r:start = 1running = 1start_time = datetime.datetime.now()這是有boss彩蛋的代碼
# 0 - 模塊區 import os import sys import math import random import pygame import datetime from pygame.locals import * import timeclass Begger(object):#類初始化def __init__(self, img, rect, speed):# self.ful_img = img# self.imgs = [self.ful_img.subsurface(Rect((i*83, 0), (begger_width/3, begger_height)))# for i in range(3)]self.imgs = imgself.rect = rectself.speed = speedself.num = 0# 用wasd控制kid移動def update(self, screen, press_keys):if press_keys[K_a]:self.rect.left -= self.speed# 限制左邊界if self.rect.left <= 0:self.rect.left = 0if press_keys[K_d]:self.rect.left += self.speed# 限制右邊界if self.rect.right >= 200:self.rect.right = 200if press_keys[K_w]:self.rect.top -= self.speed# 限制上邊界if self.rect.top <= 0:self.rect.top = 0if press_keys[K_s]:self.rect.top += self.speed# 限制下邊界if self.rect.bottom >= 640:self.rect.bottom = 640#??# self.num += 1# if self.num % 3 == 0:# self.num = 0return [(self.rect.left + self.rect.right)/2, (self.rect.top + self.rect.bottom)/2], self.imgs# 主要的工作區域 if __name__ == '__main__':# 1 - 設置區-------------------------------------------------------------# 1.1 - 窗口設置區---------------------------------------------white = (255, 255, 255)screen_width, screen_height = 1024, 600os.environ['SDL_VIDEO_CENTERED'] = '1'screen = pygame.display.set_mode((screen_width, screen_height))pygame.display.set_caption("Pas_Game")# 1.2 - 基礎設置區---------------------------------------------pygame.init()# 初始化start = 0win = 0running = 0# 200里外建造城墻distance = 200# 健康值初始化,設置健康值最大值health_value_max = 194# 設置結束時間,獲取當前時間fin_time = 20start_time = datetime.datetime.now()# 初始化kid的移動速度和初始位置bg_speed = 2# 初始化怪獸的前進速度、產生速度(越小越快)monster_speed = 1.3monster_pro_speed = 120# 子彈速度為1.5,限制最多存在7個子彈wave_speed = 1.5wave_max = 7# 1.3游戲圖片加載---------------------------------------------# 游戲素材地址fig_path = r'D:\PycharmProjects\untitled1\resources\images/'# 讀背景圖片paper = pygame.image.load(fig_path + 'paper.png').convert_alpha()# 完整的刺兒wall = pygame.image.load(fig_path + 'wall.png').convert_alpha()wall_width = wall.get_width()wall_height = wall.get_height()# 受傷的刺兒wall_cry = pygame.image.load(fig_path + 'walls.png').convert_alpha()wall_cry_width = wall_cry.get_width()wall_cry_height = wall_cry.get_height()# kidbegger = pygame.image.load(fig_path + 'kid.png').convert_alpha()begger_width = begger.get_width()begger_height = begger.get_height()# 子彈sub_wave = pygame.image.load(fig_path + 'waves.png').convert_alpha()# 能量波隨時間漸弱# sub_wave = waves.subsurface(Rect((0, 0), (waves.get_width() / 5, waves.get_height())))sub_wave_width = sub_wave.get_width()sub_wave_height = sub_wave.get_height()# 怪獸monster1_img = pygame.image.load(fig_path + 'monster1.png').convert_alpha()monster1_width = monster1_img.get_width()monster1_height = monster1_img.get_height()monster2_img = pygame.image.load(fig_path + 'monster2.png').convert_alpha()monster2_width = monster2_img.get_width()monster2_height = monster2_img.get_height()monster3_img = pygame.image.load(fig_path + 'monster3.png').convert_alpha()monster3_width = monster3_img.get_width()monster3_height = monster3_img.get_height()monster4_img = pygame.image.load(fig_path + 'monster4.png').convert_alpha()monster4_width = monster4_img.get_width()monster4_height = monster4_img.get_height()monster5_img = pygame.image.load(fig_path + 'monster5.png').convert_alpha()monster5_width = monster5_img.get_width()monster5_height = monster5_img.get_height()monster6_img = pygame.image.load(fig_path + 'monster6.png').convert_alpha()monster6_width = monster6_img.get_width()monster6_height = monster6_img.get_height()# 彩蛋bossmonster_boss_img = pygame.image.load(fig_path + 'monster_boss.png').convert_alpha()monster_boss_width = monster_boss_img.get_width()monster_boss_height = monster_boss_img.get_height()monsters_img = [monster1_img, monster2_img, monster3_img, monster4_img, monster5_img, monster6_img]monsters_width = [monster1_width, monster2_width, monster3_width, monster4_width, monster5_width, monster6_width]monsters_height =[monster1_height, monster2_height, monster3_height, monster4_height, monster5_height, monster6_height]monster_type_num = len(monsters_img)# 血條health_bar_img = pygame.image.load(fig_path + "health_bar.png")health_bar_height = health_bar_img.get_height()health_imgs = pygame.image.load(fig_path + "health.png")health_img = health_imgshealth_height = health_img.get_height()# 游戲操作提示operate_img = pygame.image.load(fig_path + 'operate.png').convert_alpha()# 游戲勝利與游戲結束圖片victory = pygame.image.load(fig_path + 'victory.png')victory_width = victory.get_width()victory_height = victory.get_height()game_over = pygame.image.load(fig_path + 'game_over.png')game_over_width = game_over.get_width()game_over_height = game_over.get_height()# 游戲開始封面start_img = pygame.image.load(fig_path + 'start.png').convert_alpha()# 2 - 游戲區--------------------------------------------------------------# 游戲開始while not start:screen.fill(white)screen.blit(start_img, (0, 0))pygame.font.init()# pygame.font.Font選擇字體樣式和大小font = pygame.font.Font(None, 40)# font.render顯示文本內容,是否開啟抗鋸齒(即是否光滑),文本顏色text = font.render("Press Space to Start !",True, (255,251,240)) # 乳白色text_Rect = text.get_rect()text_Rect.centerx = screen.get_rect().centerxtext_Rect.centery = screen.get_rect().centery + 250screen.blit(text, text_Rect)pygame.display.flip()# 獲取鍵盤事件for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == K_SPACE:start = 1running = 1# 背景音樂# pygame.mixer.music.load(fig_path + "Checkpoint.mp3")# pygame.mixer.music.play(1, 0.0)# pygame.mixer.music.set_volume(0.15)start_time = datetime.datetime.now()# 2.2 - 游戲進行區---------------------------------------------while 1:# 2.2.0游戲開局設置區---------------------------------# 初始化kid的移動速度和初始位置rect_bg = Rect(50, 50, 133, 142)begger_pos = []# 建立一個新的Begger類對象bg = Begger(begger, rect_bg, bg_speed)# 初始化怪獸的位置monsters = []list_monster_type = []# 這里的type列表用來存放新生成怪獸的類型,我覺得其實寫一個怪獸類,但我也是后來才知道的了# 初始化boss位置monster_boss = [screen_width, screen_height - monster_boss_height]# 初始化子彈位置wave_set = []# 初始化血量health_value = health_value_maxhealth_img = health_imgswhile running:# 2.2.1 - 游戲顯示區-------------------------------screen.fill(white)screen.blit(paper, (0, 0))# 血條和時間顯示font = pygame.font.Font(None, 42)cur_time = datetime.datetime.now()play_time = (cur_time - start_time).seconds# 時間顯示if play_time % 60 < 10:time_str = ":0"else:time_str = ":"survived_text = font.render(str(play_time // 60) +time_str +str(play_time % 60),True, (0, 0, 0))text_Rect = survived_text.get_rect()text_Rect.topright = [screen_width - 5, 5]screen.blit(survived_text, text_Rect)# 設置血條框的位置health_bar_img = pygame.transform.scale(health_bar_img,(health_value_max + 2, health_bar_height))screen.blit(health_bar_img, [0, 5])# 設置血條的位置if health_value < 0:health_value = 0health_img = pygame.transform.scale(health_img,(health_value, health_height))screen.blit(health_img, [1, 7])if play_time < 3:screen.blit(operate_img, [300, 7])# 顯示城墻# 判斷血量少于75則刺兒受傷if health_value <= 75:for height in range(0, screen_height, wall_cry_height):screen.blit(wall_cry, (distance, height))else:for height in range(0, screen_height, wall_height):screen.blit(wall, (distance, height))# kid隨鼠標移動而旋轉press_keys = pygame.key.get_pressed()begger_pos, begger_img = bg.update(screen, press_keys)position = pygame.mouse.get_pos()angle = math.atan2(position[1] - (begger_pos[1] + begger_height),position[0] - (begger_pos[0] + begger_width))begger_rot = pygame.transform.rotate(begger_img, 360 - angle * 57.29)begger_pos1 = (begger_pos[0] - begger_rot.get_rect().width / 2,begger_pos[1] - begger_rot.get_rect().height / 2)screen.blit(begger_rot, begger_pos1)# 設置子彈for wave in wave_set:index = 0vel_x = math.cos(wave[0]) * wave_speedvel_y = math.sin(wave[0]) * wave_speedwave[1] += vel_xwave[2] += vel_yif wave[1] < - sub_wave_width or wave[1] > screen_width \or wave[2] < - sub_wave_height or wave[2] > screen_height:wave_set.pop(index) # pop移除列表index位置的對象index += 1for projectile in wave_set:# wave1 = pygame.transform.rotate(sub_wave, 360 - projectile[0] * 57.29)# .rotate(surface, angle)返回一個旋轉后的surface對象,默認逆時針旋轉,angle小于0時則順時針, 此處子彈素材為中心對稱可不旋轉screen.blit(sub_wave, (projectile[1], projectile[2]))# 設置怪獸# 此處生成0~monster_pro_speed-1的隨機數,若生成0則產生一個新的monster,用以控制monster的生成速度monster_timer = random.choice(range(monster_pro_speed))if play_time > 2 and monster_timer < 1:# 確定怪獸種類monster_type_temp = random.randint(0, monster_type_num-1)monster_img_temp = monsters_img[monster_type_temp]monster_width_temp = monsters_width[monster_type_temp]monster_height_temp = monsters_height[monster_type_temp]monster_temp = [screen_width,random.randint(monster_height_temp, screen_height - monster_height_temp)]# random.randint產生區間范圍內的隨機整數monster_temp_rect = pygame.Rect(monsters_img[monster_type_temp].get_rect())monster_temp_rect.left = monster_temp[0]monster_temp_rect.top = monster_temp[1]# 第一只怪獸直接顯示if len(monsters) == 0:monster_type = monster_type_tempmonster_img = monster_img_tempmonster_width = monster_width_tempmonster_height = monster_height_tempmonsters.append(monster_temp)list_monster_type.append(monster_type)else:for monster in monsters:monster_type = list_monster_type[monsters.index(monster)]monster_rect = pygame.Rect(monsters_img[monster_type].get_rect())monster_rect.left = monster[0]monster_rect.top = monster[1]# 如果兩個monster交叉,則臨時的怪獸不存入monsters列表if monster_temp_rect.colliderect(monster_rect):breakelse:# 如果到達了最后一個monsterif monsters.index(monster) == len(monsters)-1:monster_type = monster_type_tempmonster_img = monster_img_tempmonster_width = monster_width_tempmonster_height = monster_height_temp# 將有效的臨時怪獸添加至monsters列表monsters.append(monster_temp)list_monster_type.append(monster_type)# 顯示怪獸for monster in monsters:monsters_type = list_monster_type[monsters.index(monster)]screen.blit(monsters_img[monsters_type], monster)index = 0# 如果子彈碰到蘋果則打擊成功,如果蘋果接觸到刺兒測扣除自身20-40健康值for monster in monsters:monsters_type = list_monster_type[monsters.index(monster)]if monster[0] < - monsters_width[monsters_type]:monsters.pop(index)list_monster_type.pop(index)# 怪獸移動monster[0] -= monster_speedmonster_rect = pygame.Rect(monsters_img[monsters_type].get_rect())monster_rect.top = monster[1]monster_rect.left = monster[0]# 怪獸到達刺兒位置則扣除血條30-50if monster_rect.left < wall_width + distance:health_value -= random.randint(30, 50)monsters.pop(index)list_monster_type.pop(index)index1 = 0for wave in wave_set:wave_rect = pygame.Rect(sub_wave.get_rect())wave_rect.left = wave[1]wave_rect.top = wave[2]# 檢查蘋果和子彈兩個矩形塊是否交叉,交叉則移除兩個矩形塊if monster_rect.colliderect(wave_rect):wave_set.pop(index1)try:monsters.pop(index)list_monster_type.pop(index)except IndexError as error:print("IndexError: " + str(error))index1 += 1index += 1pygame.display.flip()## 2.2.2 - 游戲操作區---------------------------for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()# 發射子彈if event.type == pygame.MOUSEBUTTONDOWN and len(wave_set) < wave_max:position = pygame.mouse.get_pos()wave_set.append([math.atan2(position[1] - (begger_pos1[1] + begger_height/2 + begger_height),position[0] - (begger_pos1[0] + begger_width + begger_width)),begger_pos1[0] + begger_width, begger_pos1[1] + begger_height/2])# 血量為0,game_overif health_value == 0:running = 0win = 0# 堅持指定時間# if pygame.time.get_ticks() >= fin_time * 1000:if play_time >= fin_time:# running = 0win = 1# 3 monster_boss彩蛋部分---------------------------------------------while 1:# 3.1 - 彩蛋顯示區-----------------------------------screen.fill(white)screen.blit(paper, (0, 0))# 顯示城墻# 判斷血量少于75則刺兒受傷if health_value <= 75:for height in range(0, screen_height, wall_cry_height):screen.blit(wall_cry, (distance, height))else:for height in range(0, screen_height, wall_height):screen.blit(wall, (distance, height))# kid隨鼠標移動而旋轉press_keys = pygame.key.get_pressed()begger_pos, begger_img = bg.update(screen, press_keys)position = pygame.mouse.get_pos()angle = math.atan2(position[1] - (begger_pos[1] + begger_height),position[0] - (begger_pos[0] + begger_width))begger_rot = pygame.transform.rotate(begger_img, 360 - angle * 57.29)begger_pos1 = (begger_pos[0] - begger_rot.get_rect().width / 2,begger_pos[1] - begger_rot.get_rect().height / 2)screen.blit(begger_rot, begger_pos1)# 設置子彈for wave in wave_set:index = 0vel_x = math.cos(wave[0]) * wave_speedvel_y = math.sin(wave[0]) * wave_speedwave[1] += vel_xwave[2] += vel_yif wave[1] < - sub_wave_width or wave[1] > screen_width \or wave[2] < - sub_wave_height or wave[2] > screen_height:wave_set.pop(index) # pop移除列表index位置的對象index += 1for projectile in wave_set:# wave1 = pygame.transform.rotate(sub_wave, 360 - projectile[0] * 57.29)# .rotate(surface, angle)返回一個旋轉后的surface對象,默認逆時針旋轉,angle小于0時則順時針, 此處子彈素材為中心對稱可不旋轉screen.blit(sub_wave, (projectile[1], projectile[2]))# 怪獸移動monster_boss[0] -= monster_speedmonster_boss_rect = pygame.Rect(monster_boss_img.get_rect())monster_boss_rect.top = monster_boss[1]monster_boss_rect.left = monster_boss[0]index2 = 0for wave in wave_set:wave_rect = pygame.Rect(sub_wave.get_rect())wave_rect.left = wave[1]wave_rect.top = wave[2]# 檢查怪獸和子彈兩個矩形塊是否交叉,交叉則移除子彈if monster_boss_rect.colliderect(wave_rect):wave_set.pop(index2)index2 += 1# 顯示怪獸screen.blit(monster_boss_img, monster_boss)# 血條和時間顯示font = pygame.font.Font(None, 42)cur_time = datetime.datetime.now()play_time = (cur_time - start_time).seconds# 時間顯示if play_time % 60 < 10:time_str = ":0"else:time_str = ":"survived_text = font.render(str(play_time // 60) +time_str +str(play_time % 60),True, (0, 0, 0))text_Rect = survived_text.get_rect()text_Rect.topright = [screen_width - 5, 5]screen.blit(survived_text, text_Rect)# 設置血條框的位置health_bar_img = pygame.transform.scale(health_bar_img,(health_value_max + 2, health_bar_height))screen.blit(health_bar_img, [0, 5])# 設置血條的位置if health_value < 0:health_value = 0health_img = pygame.transform.scale(health_img,(health_value, health_height))screen.blit(health_img, [1, 7])pygame.display.flip()# 游戲操作for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()# 發射子彈if event.type == pygame.MOUSEBUTTONDOWN and len(wave_set) < wave_max:position = pygame.mouse.get_pos()wave_set.append([math.atan2(position[1] - (begger_pos1[1] + begger_height / 2 + begger_height),position[0] - (begger_pos1[0] + begger_width + begger_width)),begger_pos1[0] + begger_width, begger_pos1[1] + begger_height / 2])# boss到達刺兒位置則勝利if monster_boss_rect.left < (wall_width + distance):running = 0break# 游戲結束成功或失敗while not running and start:pygame.mixer.music.stop()if win:screen.fill(white)screen.blit(victory, (0, (screen_height - victory_height) / 2))# pygame.font.init()# font = pygame.font.Font(None, 84)# text = font.render("Victory !",# True, (250, 50, 200))# text_Rect = text.get_rect()# text_Rect.centerx = screen.get_rect().centerx + 20# text_Rect.centery = screen.get_rect().centery - 250# screen.blit(text, text_Rect)if not win:screen.blit(game_over, ((screen_width-game_over_width)/2, (screen_height-game_over_height)/2))pygame.display.flip()# 按r重來for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == K_r:start = 1running = 1start_time = datetime.datetime.now()總結
以上是生活随笔為你收集整理的python小游戏——散刺修罗场的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何提高抗压能力和适应能力
- 下一篇: 区分度评估指标-KS