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