蟒蛇龟太空入侵者的子弹没有击中入侵者

2024-03-08

一般来说,我对海龟和Python都很陌生,所以如果我的代码看起来很混乱,我深表歉意。

我目前正在编写海龟版本的太空入侵者,我不明白为什么我的入侵者在击中海龟时没有死亡。该代码似乎与我能找到的所有其他太空入侵者海龟程序相同。任何帮助将不胜感激。

import turtle
import random
import math

#### Player ####
player1 = turtle.Turtle()
player1.shape("arrow")
player1.color("white")
player1.speed(0)
player1.penup()
player1.setheading(90)
player1.setposition(0, -175)
player1.speed(4)


def move_right():
    x = player1.xcor()
    x += playerspeed
    if x > 210:
        x = 210
    player1.setx(x)


def move_left():
    x = player1.xcor()
    x -= playerspeed
    if x < -210:
        x = -210
    player1.setx(x)


bulletlist = []


def fire():
    if len(bulletlist) < 5:
        bulletlist.append(Bullet())


#### Window ####
win = turtle.Screen()
win.bgcolor("black")
win.tracer(2)

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


### Invader ###
class Invader(turtle.Turtle):
    def __init__(self, xcor, ycor):
        turtle.Turtle.__init__(self)
        self.color("red")
        self.shape("turtle")
        self.penup()
        self.speed(0)
        self.setposition(xcor, ycor)
        self.setheading(270)
        self.speed(1)
        self.hit = 0


### Bullet ###
bulletstate = 1


class Bullet(turtle.Turtle):
    def __init__(self):
        turtle.Turtle.__init__(self)
        self.color("yellow")
        self.shape("arrow")
        self.shapesize(.5, 1)
        self.penup()
        self.speed(0)
        self.setheading(90)
        self.hideturtle()
        self.bulletspeed = 20


fire()


def bullet_movement():
    global firedb
    firedb = bulletlist[-1]
    firedb.speed(0)
    ybul = firedb.ycor()
    ybul += 10
    firedb.sety(ybul)
    if ybul > 195:
        firedb.hideturtle()


def fire_bullet():
    print("fire!")
    firedb = bulletlist[-1]
    firedb.hideturtle()
    x = player1.xcor()
    y = player1.ycor() + 20
    firedb.setpos(x, y)
    firedb.showturtle()
    if firedb.ycor() > 200:
        firedb.hideturtle()
        bulletlist.remove(firedb)


def bulletmake():
    bulletfire = Bullet()


def bulletmechanics():
    fire()
    fire_bullet()


win.listen()
win.onkey(move_left, "Left")
win.onkey(move_right, "Right")
win.onkey(fire_bullet, "space")

enemies = []
xx = -175
xxxx = -175
for invader in range(19):
    if invader <= 9:
        enemies.append(Invader(xx, 200))
        xx += 30
    if invader >= 9:
        enemies.append(Invader(xxxx, 175))
        xxxx += 30

playerspeed = 7
enemyspeed = 8

def isCollision(t1, t2):
    distance = math.sqrt(math.pow(t1.xcor()-t2.xcor(),2)+math.pow(t1.ycor()-t2.ycor(),2))
    if distance < 15:
        return True
    else:
        return False

dead = []
while True:
    global firedb
    firedb = bulletlist[-1]
    fire()
    bullet_movement()
    for Invader in enemies:
        bullet_movement()

        # if Invader.distance(firedb.xcor()+200, firedb.ycor()+200) < 1:
        if isCollision(bulletlist[-1], Invader) == True:
            print("AAAAAAAAGH")
            isCollision(firedb, Invader)
            Invader.hit += 1
        if Invader.hit == 1:
            Invader.color("orange")
        if Invader.hit == 2:
            Invader.color("yellow")
        if Invader.hit == 3:
            Invader.speed(0)
            Invader.setpos(1000, 1000)
            dead.append(Invader)
            Invader.hideturtle()
        for invader in enemies:
            bullet_movement()
            xpos = invader.xcor()
            invader.speed(0)
            xpos += enemyspeed
            invader.setx(xpos)
            if invader.xcor() > 200:
                for invader in enemies:
                    ypos = invader.ycor()
                    ypos -= 40
                    invader.sety(ypos)
                enemyspeed *= -1
            if invader.xcor() < -200:
                for invader in enemies:
                    y = invader.ycor()
                    y -= 40
                    invader.sety(y)
                enemyspeed *= -1

我相信你的问题在于你将子弹运动与入侵者运动交织在一起的方式。在你的while True:循环(它不应该存在于像海龟这样的事件驱动的世界中)你调用bullet_movement()在顶层,然后在for在嵌套中循环并再次for环形。所以你看到子弹的位置和它相对于入侵者的位置不一定是相同的。

我重新编写了您的代码,并且出于示例目的,在某些地方简化了它。除了上述问题之外,我还修改了代码以使用turtletilt这对于海龟面向一个方向但向另一个方向移动的此类游戏来说是完美的。我已经彻底毁了你isCollision()因为海龟已经知道如何计算它们与另一只海龟的距离。

from turtle import Screen, Turtle

class Invader(Turtle):
    def __init__(self, xcor, ycor):
        super().__init__(shape="turtle")
        self.color("red")
        self.penup()
        self.setposition(xcor, ycor)
        self.tilt(-90)
        self.speed('slow')

        self.hit = 0

class Bullet(Turtle):
    def __init__(self):
        super().__init__(shape="arrow", visible=False)
        self.shapesize(.5, 1)
        self.color("yellow")
        self.penup()
        self.setheading(90)
        self.speed('fastest')

        self.bulletspeed = 20

def move_right():
    if player.xcor() + playerspeed < 210:

        player.forward(playerspeed)

def move_left():
    if player.xcor() - playerspeed > -210:

        player.backward(playerspeed)

def bullet_movement():
    firedb.forward(10)

    if firedb.ycor() > 195:
        firedb.hideturtle()

def fire_bullet():
    if not firedb.isvisible():
        x, y = player.position()
        firedb.setposition(x, y + 20)
        firedb.showturtle()

def isCollision(t1, t2):
    return t1.distance(t2) < 20

def move():
    global enemyspeed

    if firedb.isvisible():
        bullet_movement()

    for invader in enemies:
        if firedb.isvisible() and isCollision(firedb, invader):
                invader.hit += 1

                if invader.hit == 1:
                    invader.color("orange")
                elif invader.hit == 2:
                    invader.color("yellow")
                elif invader.hit == 3:
                    invader.hideturtle()
                    enemies.remove(invader)

                firedb.hideturtle()  # only one hit per bullet!

        invader.forward(enemyspeed)

        if invader.xcor() < -200 or invader.xcor() > 200:
            for invader in enemies:
                y = invader.ycor() - 40
                invader.sety(y)
            enemyspeed *= -1

    win.update()
    win.ontimer(move, 50)

#### Player ####

player = Turtle("arrow")
player.color("white")
player.penup()
player.tilt(90)
player.sety(-175)
player.speed('fast')

#### Window ####

win = Screen()
win.bgcolor("black")
win.tracer(False)

border_pen = Turtle(visible=False)
border_pen.speed('fastest')
border_pen.color("white")
border_pen.pensize(3)

border_pen.penup()
border_pen.setposition(-225, -225)
border_pen.pendown()

for _ in range(4):
    border_pen.forward(450)
    border_pen.left(90)

### Bullet ###

firedb = Bullet()

enemies = []

xx = -175
xxxx = -190
for invader_count in range(19):
    if invader_count < 9:
        enemies.append(Invader(xx, 200))
        xx += 30
    else:
        enemies.append(Invader(xxxx, 175))
        xxxx += 30

playerspeed = 7
enemyspeed = 2

win.onkey(move_left, "Left")
win.onkey(move_right, "Right")
win.onkey(fire_bullet, "space")
win.listen()

move()

win.mainloop()

最后,使用Python要小心global和乌龟tracer()这些经常被误解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蟒蛇龟太空入侵者的子弹没有击中入侵者 的相关文章

随机推荐

  • 使用 gae 远程时发生错误:com.google.appengine.repackaged.com.google.api.client.http.HttpResponseException:302

    当我使用 gae 远程 api 连接到远程服务器时 发生错误 如下所示 com google appengine repackaged com google api client http HttpResponseException 302
  • 按值对字典排序

    我有一本字典 格式如下 honda 4 toyota 7 ford 3 chevy 10 我想按第二列 即值 降序对其进行排序 期望的输出 雪佛兰 10 丰田 7 本田 4 福特 3 感谢来自以下机构的卡里登 如何按值对字典进行排序 htt
  • 将 pandas 数据框中的行和上一行与数百万行进行比较的最快方法

    我正在寻找解决方案来加速我编写的函数 以循环遍历 pandas 数据帧并比较当前行和前一行之间的列值 例如 这是我的问题的简化版本 User Time Col1 newcol1 newcol2 newcol3 newcol4 0 1 6 c
  • Java图形布局算法

    在我的 Java 应用程序中 我需要某种布局算法 第一种方法如下 需要安装Graphviz包 创建点文件 从java应用程序调用graphviz并解析输出 布局 使用 graphviz 的布局显示图形 属性点 但这个解决方案需要在运行的机器
  • C#编译器验证对象时的空状态静态分析

    我在我的项目中启用了 Nullable 检查 并且在代码中的很多地方我检查输入对象及其属性 如果出现问题则抛出异常 但如果一切正常 那么我确信输入对象不为空 有没有办法告诉编译器 以某种方式使用 NotNullWhen 属性或类似的东西 我
  • 从共享组件库导出“react-router”重定向

    我正在构建一个共享 React 组件库 有一个PrivateRoute我想要包含的组件 但是 当我将组件从模块库导入另一个应用程序时 出现错误 错误 不变失败 您不应在 之外使用 The PrivateRoute组件包裹着react rou
  • Git 将“未更改”的文件添加到舞台

    对于我正在从事的项目 我想使用 git add A 将一些文件添加到舞台上 问题是 Git 认为这些文件自上次提交以来没有变化 因此它们被忽略 然而 我亲自更改了该文件 但 Git 仍然认为该文件未更改 如何 强制 将该单个文件添加到我的存
  • 使用另一个表的总和更新表中的列

    我对 SQL 比较陌生 无法解决以下问题 简而言之 我有两张桌子 我们可以调用第一个表people name Margaret Jim Lola 第二个是一个列表expenses与不同实体相关的不同类型 name type amount M
  • 插入时数据类型不匹配(代码 20)

    在我的项目中 我使用 sqlite 数据库来保存图片及其位置 我在尝试将数据插入数据库时 收到此错误 E SQLiteLog 20 statement aborts at 5 INSERT INTO PHOTO VALUES NULL da
  • 如何在emr上重启hadoop集群

    我在 Amazon Elastic MapReduce 上安装了 hadoop 每当我尝试重新启动集群时 都会收到以下错误 stop all sh no jobtracker to stop The authenticity of host
  • React-Native是单线程执行还是多线程执行?

    我想通过示例了解 React Native 是否支持单线程或多线程方法 它是单线程的 请参考此链接 我想这会消除你所有的疑虑 https react native canny io feature requests p parallel m
  • 切换 Git 分支而不检出文件

    Git 是否可以在不检查所有文件的情况下切换到另一个分支 切换分支后 我需要删除所有文件 重新生成它们 提交并切换回来 所以检查文件只是浪费时间 大约有 14 000 个文件 这是一个很长的操作 为了让一切都清楚 我需要上传所有这些文档 h
  • Azure B2C Graph API - 强制用户在下次登录时更改密码[重复]

    这个问题在这里已经有答案了 我希望使用 graph api 来强制用户在下次登录时重置他 她的密码 如果我发送用户对象 ID 以及 forceChangePasswordNextLogin true我得到了成功的回复 但是 用户的帐户实际上
  • 如何在html5中浮动部分标签

    这可能是一个非常简单的问题 因此 如何漂浮 离开 section 标签 我尝试使用float left 但不起作用或者是否可以将标签与其内容垂直对齐 这是我的尝试 html div section h1 heyo h1 a href dro
  • as3 中的阿拉伯语文本

    如何使用as3从右到左显示阿拉伯文本 这段代码可以解决这个问题 import flash text AntiAliasType import flash text TextField import flash text TextFieldA
  • 总是在 Apache 中发送内容长度?

    我正在加载一个由 PHP 动态生成的特别大的 JSON 字符串 为了向用户提供一些反馈 我想显示下载进度 我已经弄清楚了代码 它对于静态内容 例如图像 JS 文件等 工作得很好 但是 它似乎不适用于动态文件 这是有道理的 因为动态文件没有可
  • 将 C# 委托转换为 f#

    如何将委托转换为 F 代表 delegate IntPtr HookProc int code IntPtr wParam IntPtr lParam Edited 我正在做的是使用 F 中的 C 托管 API 进行低级键盘挂钩 Code
  • 为什么 Spring Rest 服务在第一次请求时速度很慢?

    所以这个问题已经被问过几次了 但似乎没有人以可以帮助我的方式回答它 我目前正在为处理产品数据的简单应用程序制作后端 它甚至没有使用 JSP 只是一个普通的 Rest 后端 使用 Spring 的 RestController 问题 是 启动
  • 为什么在 C# 中经常看到“null!=variable”而不是“variable!=null”?

    在c 中 声明条件的顺序执行速度有什么区别吗 if null variable if variable null 最近以来 我经常看到第一个 因为我已经习惯了第二个 所以它引起了我的注意 如果没有区别 第一个的优点是什么 这是 C 语言的保
  • 蟒蛇龟太空入侵者的子弹没有击中入侵者

    一般来说 我对海龟和Python都很陌生 所以如果我的代码看起来很混乱 我深表歉意 我目前正在编写海龟版本的太空入侵者 我不明白为什么我的入侵者在击中海龟时没有死亡 该代码似乎与我能找到的所有其他太空入侵者海龟程序相同 任何帮助将不胜感激