我如何处理玩家的生活?

2024-03-28 10:28:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图给我的python游戏,一个玩家的生活系统。我想要3条生命,每死一次都可以被消灭。三人死亡后,游戏结束。你知道吗

我最终想要一个“生命”,即用心,来显示计数。你知道吗

我一直在尝试使用一个列表函数,以及一个类似于我用来评分的计算方法。你知道吗

import turtle
import os
import math
import random
import pygame
import pickle
import sys

FPS = 60
ANIMATION_SPEED = 0.18

pygame.init()

lasersound = pygame.mixer.Sound("laser.wav")
explosion = pygame.mixer.Sound("explosion.wav")
bombesound = pygame.mixer.Sound("Bomb+2.wav")
pygame.mixer.music.load("laserattack.wav")
pygame.mixer.music.play(-1)

#Screen
window = turtle.Screen()
window.bgcolor("black")
window.bgpic("lights.gif")
window.title("Spaced Invaders")
window.setup(width = 800, height = 800)

#register shapesize
turtle.register_shape("alienship.gif")
turtle.register_shape("ship1.gif")
turtle.register_shape("laser.gif")
turtle.register_shape("bomb.gif")
turtle.register_shape("life.gif")

#border
border_pen = turtle.Turtle()
border_pen.speed(0)
border_pen.color("white")
border_pen.penup()
border_pen.setposition(-360,-360)
border_pen.pendown()
border_pen.pensize(3)
for side in range (4):
    border_pen.fd(720)
    border_pen.lt(90)
border_pen.hideturtle()

#score
score = 0
score_pen = turtle.Turtle()
score_pen.speed(0)
score_pen.color("white")
score_pen.penup()
score_pen.setposition(-375, 375)
scorestring = "Score: %s" %score
score_pen.write(scorestring, False, align="left", font=("Arial", 14, "normal"))
score_pen.hideturtle()

#life
number_of_lives = 3
lives= []

for i in range(number_of_lives):
    lives.append(turtle.Turtle())

    life_pen = turtle.Turtle()
    life_pen.speed(0)
    life_pen.color("white")
    life_pen.penup()
    life_pen.setposition(360, 380)
    lifestring = "Lives: %l" %lives
    life_pen.write(lifetring, False, align="left", font=("Arial", 14, "normal"))
    life_pen.hideturtle()

#player
player = turtle.Turtle()
player.color("blue")
player.shape("ship1.gif")
player.penup()
player.speed(0)
player.setposition(0, -250)
player.setheading(90)

playerspeed = 60

#move left or right
def move_left():
    x = player.xcor()
    x -= playerspeed
    if x < -340:
        x = -340
    player.setx(x)

def move_right():
    x = player.xcor()
    x += playerspeed`enter code here`
    if x > +340:
        x = +340
    player.setx(x)

#def collision
def iscollision(t1, t2):
    distance = math.sqrt(math.pow(t1.xcor()-t2.xcor(),2)+math.pow(t1.ycor()-t2.ycor(),2))
    if distance < 50:
        return True

#make invaders
number_of_invaders = 5
invaders = []
for i in range(number_of_invaders):
    invaders.append(turtle.Turtle())

for invader in invaders:
    invader.color("red")
    invader.shape("alienship.gif")
    invader.penup()
    invader.speed(0)
    x = random.randint(-300, 300)
    y = random.randint(100, 300)
    invader.setposition(x, y)

invaderspeed = 5

#bombspeed
bombstate = "ready"

#for invader in invaders:
bomb = turtle.Turtle()
bomb.color("red")
bomb.shape("bomb.gif")
bomb.penup()
bomb.speed(0)
bomb.setheading(-90)
bomb.shapesize(1, 1)
bomb.hideturtle()

def drop_bomb():
    global bombstate
    if bombstate == "ready":
        x = invader.xcor()
        y = invader.ycor() - 15
        bomb.setposition(x,y)
        bomb.showturtle()
        bombstate = "fire"
        bombesound.play()
bombspeed = 25
bombstate = "ready"

#players laser
laser = turtle.Turtle()
laser.color("red")
laser.shape("laser.gif")
laser.penup()
laser.speed(0)
laser.setheading(90)
laser.shapesize(2, 2)
laser.hideturtle()

laserspeed = 120

laserstate = "ready"

def fire_laser():
    global laserstate
    if laserstate == "ready":
        x = player.xcor()
        y = player.ycor() + 15
        laser.setposition(x,y)
        laser.showturtle()
        laserstate = "fire"
        lasersound.play()

#keyboard bindings

turtle.listen()
turtle.onkey(move_left, "a")
turtle.onkey(move_right, "d")

turtle.onkey(move_left, "Left")
turtle.onkey(move_right, "Right")

turtle.onkey(fire_laser, "space")

turtle.onkey(drop_bomb,  "1")

#game loop
while True:

#move invader
    for invader in invaders:
        x = invader.xcor()
        x += invaderspeed
        invader.setx(x)

        if invader.xcor() > 340:
            for e in invaders:
                y = e.ycor()
                y -= 40
                invaderspeed *= -1
                e.sety(y)
        if invader.xcor() < -340:
            for e in invaders:
                y = e.ycor()
                y -= 40
                invaderspeed *= -1
                e.sety(y)

#collision check
        if iscollision(laser, invader):
            laser.hideturtle()
            laserstate = "ready"
            laser.setposition(0,-400)
            x = random.randint(-300, 300)
            y = random.randint(100, 300)
            invader.setposition(x, y)
            explosion.play()

            #update score
            score += 10
            scorestring = "Score: %s" %score
            score_pen.clear()
            score_pen.write(scorestring, False, align="left", font=("Arial", 14, "normal"))

        if iscollision(player, invader):
            player.hideturtle()
            invader.hideturtle()
            explosion.play()
            game_overpen = turtle.Turtle()
            game_overpen.speed(0)
            game_overpen.color("white")
            game_overpen.penup()
            game_overpen.setposition(-100, 100)

     #update life
            life -= 1
            lifestring = "Lives: %l" %lives
            life_pen.clear()
            life_pen.write(lifestring, False, align="left", font=("Arial", 14, "normal"))


            print ("Game Over")

        if iscollision(bomb, player):
            player.hideturtle()
            bomb.hideturtle()
            explosion.play()
            game_overpen = turtle.Turtle()
            game_overpen.speed(0)
            game_overpen.color("white")
            game_overpen.penup()
            game_overpen.setposition(-100, 100)
            game_overpen.write("GAME OVER", False, align="left", font=("Arial", 30, "bold"))
            game_overpen.hideturtle()
            pygame.mixer.music.stop()
            print ("Game Over")

#move laser
    if laserstate == "fire":
        y = laser.ycor()
        y += laserspeed
        laser.sety(y)

    if laser.ycor( ) > 340:
        laser.hideturtle()
        laserstate = "ready"
#move bomb
    if bombstate == "fire":
        y = bomb.ycor()
        y -= bombspeed
        bomb.sety(y)

    if bomb.ycor( ) < -340:
        bomb.hideturtle()
        bombstate = "ready"

#if invader gets past you
    if invader.ycor() < -340:
        explosion.play()
        game_overpen = turtle.Turtle()
        game_overpen.speed(0)
        game_overpen.color("white")
        game_overpen.penup()
        game_overpen.setposition(-100, 100)
        game_overpen.write("GAME OVER", False, align="left", font=("Arial", 30, "bold"))
        game_overpen.hideturtle()
        pygame.mixer.music.stop()
        print ("Game Over")


delay = input("Press Enter To Finish")

The error I recieve:

Traceback (most recent call last):
File "test.py", line 70, in <module>
lifestring = "Lives: %L" %lives
#ValueError: incomplete format

Tags: gameifscoreplayerlaserturtlelifeborder
1条回答
网友
1楼 · 发布于 2024-03-28 10:28:39

错误消息说明了问题:

lifestring = "Lives: %L" %lives
#ValueError: incomplete format

%l不是完整的转换类型,它是被忽略的长度说明符l,但缺少转换类型本身。你知道吗

既然您的问题被标记为[python-3.x],为什么要使用这种老式的字符串格式语法,而不是Python3和python2.7中较新的str.format()迷你语言?你知道吗

相关问题 更多 >