利用python3的pygame模塊基本實現塔防游戲的基本功能,包括血量和分數顯示,bgm,防御塔建造,防御塔攻擊范圍內的敵軍,暫停和加速功能。由于實在沒有素材,用的都是自己截圖P的,所以美化不好。但基本保證功能,其中有一個BUG,但不影響游戲效果。

1.運行主類
"""主程序"""
from pygame.locals import *
from TowerDefend.enemy import *
from TowerDefend.towerposSet import *
from TowerDefend.tower import *
import pygame
def run():
"""運行函數"""
pygame.init()
size = width, height = 1200, 600
screen = pygame.display.set_mode(size)
background_img = pygame.image.load(r'image/background.png').convert_alpha()
background_img = pygame.transform.scale(background_img, (width, height))
# 創建分數和血量
health_count = 5
score_count = 0
score = pygame.font.Font('font/score_health.ttf', 30)
health = pygame.font.Font('font/score_health.ttf', 30)
# 創建背景音樂
bg_music = pygame.mixer.music
bg_music.load('media/bg.mp3')
bg_music.set_volume(2)
# 創建敵軍類
enemies = pygame.sprite.Group()
ENEMY_NUM = 5
position = [[258, 600], [258, 670], [258, 740], [258, 810], [258, 880]]
for i in range(ENEMY_NUM):
enemies.add(Enemy(position[i]))
# 創建炮塔
towers = pygame.sprite.Group()
# 加載暫停鍵
pause_img = pygame.image.load('image/pause.png').convert_alpha()
pause_rect = pause_img.get_rect()
pause_rect.left, pause_rect.top = 1145, 0
# 加載血量和金幣顯示
health_money_img = pygame.image.load('image/health_money.png').convert_alpha()
health_money_rect = health_money_img.get_rect()
health_money_rect.left, health_money_rect.top = 0, 0
# 加載加速鍵
speed_img = pygame.image.load('image/speed.png').convert_alpha()
speed_rect = speed_img.get_rect()
speed_rect.left, speed_rect.top = 1090, 0
# 設置炮塔位置
towers_pos = pygame.sprite.Group()
position_list = [[225, 495], [264, 428], [312, 428], [362, 428], [410, 428], [460, 428], [508, 428], [561, 428],
[561, 373], [377, 373]]
for i in range(len(position_list)):
towers_pos.add(Position(position_list[i]))
# 設置循環條件
running = True
clock = pygame.time.Clock()
paused = False
# 播放音樂
if not bg_music.get_busy():
bg_music.play(-1)
while running:
clock.tick(100)
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == MOUSEBUTTONDOWN:
if event.button == 1:
if speed_rect.collidepoint(event.pos):
for each in enemies:
each.accelerate *= 2
if pause_rect.collidepoint(event.pos):
paused = not paused
for each in towers_pos:
if each.rect.collidepoint(event.pos):
tower = Tower([each.rect.left, each.rect.top])
towers.add(tower)
towers_pos.remove(each)
if not paused:
for enemy in enemies:
if enemy.active:
enemy.move()
else:
if enemy.rect.top <= 180:
health_count -= 1
if enemy.rect.top > 180:
score_count += 20
enemies.remove(enemy)
# 繪制界面設置
screen.blit(background_img, (0, 0))
screen.blit(health.render(str(health_count), True, (255, 255, 255)), (60, 0.3))
screen.blit(score.render(str(score_count), True, (255, 255, 255)), (130, 0.5))
screen.blit(health_money_img, health_money_rect)
screen.blit(pause_img, pause_rect)
screen.blit(speed_img, speed_rect)
# 繪制炮塔
for each in towers:
each.draw(screen, enemies)
each.hit(enemies)
# 繪制炮塔位置
towers_pos.draw(screen)
# 敵軍若存活則繪制其和血量
for enemy in enemies:
if enemy.active:
screen.blit(enemy.img, enemy.rect)
enemy.drawhealth(screen)
pygame.display.flip()
pygame.quit()
if __name__ == "__main__":
run()
2.炮塔類
"""TOWER"""
import pygame
import math
class Tower(pygame.sprite.Sprite):
"""tower"""
def __init__(self, pos):
pygame.sprite.Sprite.__init__(self)
self.img0 = pygame.image.load('image/tower0.png')
self.img1 = pygame.image.load('image/tower1.png')
self.img2 = pygame.image.load('image/tower2.png')
self.rect = self.img0.get_rect()
self.rect.left, self.rect.top = pos
self.count = 1
def draw(self, screen, enemies):
"""繪制"""
if self.count > 90:
self.count = 1
if 1 <= self.count < 30:
screen.blit(self.img0, self.rect)
elif 30 <= self.count < 60:
screen.blit(self.img1, self.rect)
else:
screen.blit(self.img2, self.rect)
for enemy in enemies:
distance = math.sqrt(
math.pow((self.rect.left - enemy.rect.left), 2) + math.pow((self.rect.top - enemy.rect.top), 2))
if distance < 50 and enemy.active is True:
self.count += 1
def hit(self, enemies):
"""攻擊"""
for enemy in enemies:
distance = math.sqrt(
math.pow((self.rect.left - enemy.rect.left), 2) + math.pow((self.rect.top - enemy.rect.top), 2))
if distance < 50:
enemy.health -= 1
if enemy.health == 0:
enemy.active = False另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
名稱欄目:利用python3的pygame模塊實現塔防游戲-創新互聯
分享URL:http://www.yijiale78.com/article16/dehcgg.html
成都網站建設公司_創新互聯,為您提供全網營銷推廣、網站導航、網站設計公司、Google、微信小程序、定制開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯