如何在这个python 3.0游戏中添加生命

如何在这个python 3.0游戏中添加生命,python,python-3.x,pygame,Python,Python 3.x,Pygame,我对python很陌生,只是想学习一下。我已经跟随了一个关于如何制作这个游戏的教程,并添加了我自己的东西,但我似乎无法添加生命。我已经尝试了我所知道的一切(不是很多)。不管怎么说,我看过的所有教程都不管用,我已经花了2天的时间在上面了,所以如果有人能帮忙,我将不胜感激 import math import random import pygame from pygame import mixer # Intialize the pygame pygame.init( ) # create

我对python很陌生,只是想学习一下。我已经跟随了一个关于如何制作这个游戏的教程,并添加了我自己的东西,但我似乎无法添加生命。我已经尝试了我所知道的一切(不是很多)。不管怎么说,我看过的所有教程都不管用,我已经花了2天的时间在上面了,所以如果有人能帮忙,我将不胜感激

import math
import random

import pygame
from pygame import mixer

# Intialize the pygame
pygame.init( )

# create the screen
screen = pygame.display.set_mode((800, 600))

# Background
background = pygame.image.load('editor.jpg')
opensound = mixer.Sound("ftw.wav")
opensound.play( )

# Sound
mixer.music.load("bg noise.wav")
mixer.music.play(-1)

# Caption and Icon
pygame.display.set_caption("Virus Invader")
icon = pygame.image.load('virus.png')
pygame.display.set_icon(icon)

# Player
playerImg = pygame.image.load('people.png')
playerX = 370
playerY = 480
playerX_change = 0

# Enemy
enemyImg = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies = 6

for i in range(num_of_enemies):
    enemyImg.append(pygame.image.load('virus.png'))
    enemyX.append(random.randint(0, 736))
    enemyY.append(random.randint(50, 150))
    enemyX_change.append(1)
    enemyY_change.append(40)

# Bullet

# Ready - You can't see the bullet on the screen
# Fire - The bullet is currently moving

bulletImg = pygame.image.load('ligature.png')
bulletX = 0
bulletY = 480
bulletX_change = 0
bulletY_change = 2
bullet_state = "ready"

# Score

score_value = 0
font = pygame.font.Font('freesansbold.ttf', 32)

textX = 10
testY = 10

# Game Over
over_font = pygame.font.Font('freesansbold.ttf', 64)

def Game_start_text():
    over_text = over_font.render("Let the games begin!", True, (64, 64, 64))
    screen.blit(over_text, (200, 250))


def show_score(x, y):
    score = font.render("Score : " + str(score_value), True, (255, 255, 255))
    screen.blit(score, (x, y))


def game_over_text():
    over_text = over_font.render("GAME OVER", True, (255, 255, 255))
    screen.blit(over_text, (200, 250))


def player(x, y):
    screen.blit(playerImg, (x, y))


def enemy(x, y, i):
    screen.blit(enemyImg[i], (x, y))


def fire_bullet(x, y):
    global bullet_state
    bullet_state = "fire"
    screen.blit(bulletImg, (x + 16, y + 10))


def isCollision(enemyX, enemyY, bulletX, bulletY):
    distance = math.sqrt(math.pow(enemyX - bulletX, 2) + (math.pow(enemyY - bulletY, 2)))
    if distance < 27:
        return True
    else:
        return False


# Game Loop
running = True
while running:

    # RGB = Red, Green, Blue
    screen.fill((0, 0, 0))
    # Background Image
    screen.blit(background, (0, 0))
    for event in pygame.event.get( ):
        if event.type == pygame.QUIT:
            running = False

        # if keystroke is pressed check if its right or left
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerX_change = -2
            if event.key == pygame.K_RIGHT:
                playerX_change = 2
            if event.key == pygame.K_SPACE:
                if bullet_state is "ready":
                    bulletSound = mixer.Sound("stab.wav")
                    bulletSound.play( )
                    # Get the current x cordinate of the charctar
                    bulletX = playerX
                    fire_bullet(bulletX, bulletY)

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change = 0

    # 5 = 5 + -0.1 -> 5 = 5 - 0.1
    # 5 = 5 + 0.1

    playerX += playerX_change
    if playerX <= 0:
        playerX = 0
    elif playerX >= 736:
        playerX = 736

    # Enemy Movement
    for i in range(num_of_enemies):

        # Game Over
        if enemyY[i] > 440:
            for j in range(num_of_enemies):
                enemyY[j] = 2000
            game_over_text( )
            break

        enemyX[i] += enemyX_change[i]
        if enemyX[i] <= 0:
            enemyX_change[i] = 1
            enemyY[i] += enemyY_change[i]
        elif enemyX[i] >= 736:
            enemyX_change[i] = -1
            enemyY[i] += enemyY_change[i]

        # Collision
        collision = isCollision(enemyX[i], enemyY[i], bulletX, bulletY)
        if collision:
            explosionSound = mixer.Sound("street fighter die.wav")
            explosionSound.play( )
            bulletY = 480
            bullet_state = "ready"
            score_value += 1
            enemyX[i] = random.randint(0, 736)
            enemyY[i] = random.randint(50, 150)

        enemy(enemyX[i], enemyY[i], i)

    # Bullet Movement
    if bulletY <= 0:
        bulletY = 480
        bullet_state = "ready"

    if bullet_state is "fire":
        fire_bullet(bulletX, bulletY)
        bulletY -= bulletY_change

    player(playerX, playerY)
    show_score(textX, testY)
    pygame.display.update( )
导入数学
随机输入
导入pygame
从pygame导入混合器
#初始化游戏
pygame.init()
#创建屏幕
screen=pygame.display.set_模式((800600))
#背景
background=pygame.image.load('editor.jpg')
opensound=混音器声音(“ftw.wav”)
opensound.play()
#声音
混音器。音乐。加载(“bg noise.wav”)
混音器。音乐。播放(-1)
#标题和图标
pygame.display.set_标题(“病毒入侵者”)
icon=pygame.image.load('virus.png')
pygame.display.set_图标(图标)
#玩家
playerImg=pygame.image.load('people.png')
playerX=370
playerY=480
playerX_change=0
#敌人
enemyImg=[]
灌肠剂=[]
Enemy=[]
enemyX_change=[]
Enemy_change=[]
敌人的数量=6
对于范围内的i(敌人的数量):
enemyImg.append(pygame.image.load('virus.png'))
enemyX.append(random.randint(0736))
Enemy.append(random.randint(50150))
enemyX_变更追加(1)
Enemy_变更追加(40)
#子弹头
#准备好-你在屏幕上看不到子弹
#开火-子弹正在移动
Bulleting=pygame.image.load('ligature.png')
bulletX=0
bulletY=480
bulletX_变化=0
bulletY_变化=2
bullet_state=“就绪”
#得分
分值=0
font=pygame.font.font('freesansbold.ttf',32)
textX=10
暴躁=10
#游戏结束
over_font=pygame.font.font('freesansbold.ttf',64)
def Game_start_text():
over_text=over_font.render(“让游戏开始吧!”,True,(64,64,64))
屏幕。blit(超过文本(200250))
def显示_分数(x,y):
score=font.render(“score:+str(score_值),True,(255,255,255))
屏幕blit(分数,(x,y))
def game_over_text():
over_text=over_font.render(“游戏结束”,True,(255,255,255))
屏幕。blit(超过文本(200250))
def播放器(x,y):
屏幕光点(playerImg,(x,y))
def敌人(x,y,i):
screen.blit(enemyImg[i],(x,y))
def火焰弹(x,y):
全球子弹头状态
bullet_state=“火灾”
屏幕光点(项目符号,(x+16,y+10))
def isCollision(灌肠剂、灌肠剂、子弹剂、子弹剂):
距离=math.sqrt(math.pow(enemyX-bulletX,2)+(math.pow(enemyY-bulletY,2)))
如果距离小于27:
返回真值
其他:
返回错误
#游戏循环
运行=真
运行时:
#RGB=红色、绿色、蓝色
屏幕填充((0,0,0))
#背景图像
屏幕光点(背景,(0,0))
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
#如果按下了击键,则检查其是否为右击键或左击键
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_左:
playerX_change=-2
如果event.key==pygame.K_RIGHT:
playerX_change=2
如果event.key==pygame.K_空间:
如果bullet_状态为“就绪”:
bulletSound=混音器声音(“刺波”)
播放()
#获取charctar的当前x坐标
bulletX=playerX
子弹射击(子弹,子弹)
如果event.type==pygame.KEYUP:
如果event.key==pygame.K_左或event.key==pygame.K_右:
playerX_change=0
# 5 = 5 + -0.1 -> 5 = 5 - 0.1
# 5 = 5 + 0.1
playerX+=playerX\u更改
如果playerX=736:
playerX=736
#敌军运动
对于范围内的i(敌人的数量):
#游戏结束
如果Enemy[i]>440:
对于范围内的j(敌人的数量):
Enemy[j]=2000
游戏超过文本()
打破
enemyX[i]+=enemyX_变化[i]
如果enemyX[i]=736:
enemyX_变化[i]=-1
Enemy[i]+=Enemy_变化[i]
#碰撞
冲突=isCollision(enemyX[i],enemyY[i],Bullett,bulletY)
如果发生碰撞:
explosionSound=混音器声音(“街头斗士die.wav”)
爆炸声。播放()
bulletY=480
bullet_state=“就绪”
得分值+=1
enemyX[i]=random.randint(0736)
enemyY[i]=random.randint(50150)
敌人(enemyX[i],enemyY[i],i)
#子弹运动

如果bulletY那么将其添加到代码中之所以如此困难,是因为有一大堆额外的代码挡住了你的去路

当这种情况发生时,退后一步,试着写一个框架来做你需要的事情。当在一个大型系统上工作时,比如说跟踪一个复杂的bug,通常你会注释掉代码的部分,将问题空间与可管理的部分配对。你的代码很小,所以你可以忽略很多

在任何情况下,对代码进行备份,然后开始一点一点地添加更改,边测试边测试

首先添加一个生命计数器:

# Player
playerLives    = 3                                 # <<-- HERE
playerImg      = pygame.image.load('people.png')
playerX        = 370
playerY        = 480
playerX_change = 0
测试一下。屏幕上的分数有用吗?不做一些小改动,再次测试,不断调整,不断修正。如果这一切都变成了地狱般的手推车,你只需要小小的改变就可以撤销它

现在,失去生命的机制正在发挥作用,找到它应该在哪里真正夺走生命,并添加以下方面的更改:

    # Game Over
    if enemyY[i] > 440:
        for j in range(num_of_enemies):
            enemyY[j] = 2000
        playerLives -= 1           # <<-- lose a life
        #game_over_text( )
        reset_enemy_positions()    # <<-- move enemies back to top, TODO!
        break
#游戏结束
如果Enemy[i]>440:
对于范围内的j(敌人的数量):
Enemy[j]=2000

playerLives-=1#你需要进一步解释你的意思。你的意思是添加一个倒计时的变量,然后停止游戏吗?那你什么时候会失去生命?或者你的意思是在屏幕上添加图形生命/心脏?第一个选项不应该超过添加一个变量,比如
lifes=3
,每次你想失去一条生命,就从中减去1。这就是你试过的吗
# Has the player run out of lives?
if ( playerLives <= 0 ):
    game_over_text()
else:
    # Player still alive, allow controls, draw player
    playerX += playerX_change
    if playerX <= 0:
        playerX = 0
    elif playerX >= 736:
        playerX = 736
    player(playerX, playerY)
def show_score(x, y):
    score = font.render("Score : " + str(score_value), True, (255, 255, 255))
    screen.blit(score, (x, y))
    # Write the Lives-left to the right of the score
    lives = font.render("Lives : " + str(playerLives), True, (255, 255, 255))
    screen.blit(lives, (x+200, y))
    # Game Over
    if enemyY[i] > 440:
        for j in range(num_of_enemies):
            enemyY[j] = 2000
        playerLives -= 1           # <<-- lose a life
        #game_over_text( )
        reset_enemy_positions()    # <<-- move enemies back to top, TODO!
        break