Моя игра продолжает падать после того, как я добавил код атаки - PullRequest
0 голосов
/ 15 февраля 2019

Итак, я делаю игру в битву, и она шла хорошо, пока я не добавил функциональность атаки.Теперь он падает, когда я запускаю его.Я не знаю, что я сделал неправильно!

Я пытался изменить переменные для атаки и переместить операторы if, но ничего не получалось.

первый добавленный раздел

def buttons(x,y):
    if y > -230 and y < -161 and x > 17 and x < 299:
        eHP -= pDMG
        textinput("","attack")
        TurnToken -= 1
    if x > 300 and x < 671 and y > -234 and y < -153:
        textinput("","Coming soon")
    if x > 300 and x < 671 and y < -235 and y > -356:
         textinput("","you can't run during the tutorial!")
    if x > 17 and x < 299 and y < -235 and y > -356:
        if eATK != 1:
            eDMG -= pDEF
            textinput("","defend")
            TurnToken -= 1
        else:
            textinput("","Whoops! looks like the enemy's attack has reached 1 or less! Try something else!")
    print(x,y)

второй добавленный раздел

while eHP != 0 or pHP != 0:
    if turnToken == 1:
        onscreenclick(buttons ,1)
        listen()
    else:
        turnToken += 1
        AtkDef = randint(1,2)
        if pATK == 1:
            AtkDef == 1
        if AtkDef == 1:
            pHP -= eATK
            textinput("","attack")
        else:
            pATK -= eDEF
            textinput("","defend")

Я ожидал, что игрок сможет атаковать и защищаться, а бот сможет делать то же самое, но вместо этого, когда нажимается кнопка «атака»,игра автоматически зависает.

вот полный код:

import turtle
from turtle import *
import time
import random
penup()
hideturtle()
window = Screen()
wn = window
wn.screensize()
wn.setup(width = 1.0, height = 1.0)
m1 = Turtle()
m1.speed(0)
m1.hideturtle()
m1.fillcolor("lime")
m2 = Turtle()
m2.speed(0)
m2.hideturtle()
m2.fillcolor("red")
txt = Turtle()
txt.speed(0)
txt.pensize(15)
txt.hideturtle()
txt.speed(0)
pHP = 100
pATK = 10
pDEF = 1
eHP = 50
eATK = 10
eDEF = 1
turnToken = 1
def pSlime ():
    m1.begin_poly()
    m1.penup()
    m1.goto(-300,200)
    m1.pendown()
    m1.begin_fill()
    m1.left(180)
    m1.forward(180)
    m1.circle(20,90)
    m1.forward(360)
    m1.circle(20,90)
    m1.forward(360)
    m1.circle(20,90)
    m1.forward(360)
    m1.circle(20,90)
    m1.forward(180)
    m1.end_fill()
    m1.fillcolor("black")
    m1.penup()
    m1.goto(-350,100)
    m1.pendown()
    m1.begin_fill()
    m1.forward(20)
    m1.right(90)
    m1.forward(20)
    m1.right(90)
    m1.forward(20)
    m1.right(90)
    m1.forward(20)
    m1.end_fill()
    m1.left(90)
    m1.penup()
    m1.goto(-250,120)
    m1.pendown()
    m1.begin_fill()
    m1.forward(20)
    m1.right(90)
    m1.forward(20)
    m1.right(90)
    m1.forward(20)
    m1.right(90)
    m1.forward(20)
    m1.end_fill()
    m1.penup()
    m1.goto(-400,0)
    m1.pendown()
    m1.begin_fill()
    m1.forward(20)
    m1.right(90)
    m1.forward(100)
    m1.right(90)
    m1.forward(20)
    m1.right(90)
    m1.forward(100)
    m1.end_fill()
    m1.end_poly()
def fireSlime ():
    m2.begin_poly()
    m2.penup()
    #m2.goto(-300,200)
    m2.pendown()
    m2.begin_fill()
    m2.left(180)
    m2.forward(180)
    m2.circle(20,90)
    m2.forward(360)
    m2.circle(20,90)
    m2.forward(360)
    m2.circle(20,90)
    m2.forward(360)
    m2.circle(20,90)
    m2.forward(180)
    m2.end_fill()
    m2.fillcolor("black")
    m2.penup()
    m2.goto(-350 +550,100 +150)
    m2.pendown()
    m2.begin_fill()
    m2.forward(20)
    m2.right(90)
    m2.forward(20)
    m2.right(90)
    m2.forward(20)
    m2.right(90)
    m2.forward(20)
    m2.end_fill()
    m2.left(90)
    m2.penup()
    m2.goto(-250 + 550,120 + 150)
    m2.pendown()
    m2.begin_fill()
    m2.forward(20)
    m2.right(90)
    m2.forward(20)
    m2.right(90)
    m2.forward(20)
    m2.right(90)
    m2.forward(20)
    m2.end_fill()
    m2.penup()
    m2.goto(-400 + 650,150)
    m2.pendown()
    m2.begin_fill()
    m2.forward(20)
    m2.right(90)
    m2.forward(100)
    m2.right(90)
    m2.forward(20)
    m2.right(90)
    m2.forward(100)
    m2.end_fill()
    m2.end_poly()
def buttons(x,y):
    if y > -230 and y < -161 and x > 17 and x < 299:
        eHP -= pDMG
        textinput("","attack")
        TurnToken -= 1
    if x > 300 and x < 671 and y > -234 and y < -153:
        textinput("","Coming soon")
    if x > 300 and x < 671 and y < -235 and y > -356:
         textinput("","you can't run during the tutorial!")
    if x > 17 and x < 299 and y < -235 and y > -356:
        if eATK != 1:
            eDMG -= pDEF
            textinput("","defend")
            TurnToken -= 1
        else:
            textinput("","Whoops! looks like the enemy's attack has reached 1 or less! Try something else!")
    print(x,y)
pSlime()
txt.penup()
txt.goto(-800, -230)
txt.pendown()
txt.forward(750)
txt.left(50)
txt.forward(100)
txt.right(50)
txt.forward(800)
txt.penup()
txt.goto(-800, 230)
txt.pendown()
txt.pensize(5)
txt.forward(700)
txt.left(90)
txt.forward(200)
txt.left(90)
txt.penup()
txt.forward(570)
txt.left(90)
txt.forward(105)
txt.write("\nWelcome to Evolve, a game of monsters, genetics, \nand battle. The slime on the left will be your first monster.\n Click the attack button to attack the fire slime on the right", align="left", font=("Agency FB", 15, "bold"))
txt.penup()
txt.forward(20)
txt.goto(300,300)
txt.pensize(3)
txt.forward(450)
txt.pendown()
txt.forward(85)
txt.left(90)
txt.forward(500)
txt.left(180)
txt.forward(900)
txt.left(90)
txt.forward(200)
txt.left(180)
txt.forward(200)
txt.left(90)
txt.right(180)
txt.forward(362)
txt.right(90)
txt.forward(200)
txt.up()
m2.up()
m2.goto(300,350)
m2.down()
fireSlime()
txt.goto(110,-220)
txt.write("Attack ", align="left", font=("Agency FB", 40, "bold"))
txt.forward(100)
txt.write("Defend ", align="left", font=("Agency FB", 40, "bold"))
txt.left(90)
txt.forward(200)
txt.write("Exit Battle ", align="left", font=("Agency FB", 40, "bold"))
txt.left(90)
txt.forward(100)
txt.write("Item ", align="left", font=("Agency FB", 40, "bold"))
while eHP != 0 or pHP != 0:
    if turnToken == 1:
        onscreenclick(buttons ,1)
        listen()
    else:
        turnToken += 1
        AtkDef = randint(1,2)
        if pATK == 1:
            AtkDef == 1
        if AtkDef == 1:
            pHP -= eATK
            textinput("","attack")
        else:
            pATK -= eDEF
            textinput("","defend")

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

все шло хорошо, пока я не добавил функциональность атаки.Теперь он падает, когда я запускаю его.Я не знаю, что я сделал не так!

У этого кода есть ряд проблем, некоторые из которых должны были предупреждать вас о хорошей проверке синтаксиса: использование randint() не квалифицированопо имени модуля:

import random
AtkDef = randint(1,2)

:

import random
AtkDef = random.randint(1,2)

или:

from random import randint
AtkDef = randint(1,2)

В этом назначении переменной имеется синтаксическая ошибка:

if pATK == 1:
    AtkDef == 1  # should be "=" not "=="

Переменные pDMG и eDMG никогда нигде не определены.

Переменная turnToken также идет под именем TurnToken в различных местах кода.

Глобальные переменные turnToken и eHP изменены в buttons() и поэтому должны быть объявлены:

def buttons(x, y):
    global turnToken, eHP

Эти вызовы ничего не делают для вас, поэтому вы можете удалить их:

m1.begin_poly()
m1.end_poly()
m2.begin_poly()
m2.end_poly()

Наконец, ваш основной цикл работает против природы события turtle и должен быть преобразован в событие таймера.

Ниже я исправил и переработал ваш код, как мог - явозможно, в процессе появились новые ошибки, но теперь он в основном работает:

from turtle import Screen, Turtle
from random import randint

LARGE_FONT = ("Agency FB", 40, "bold")
SMALL_FONT = ("Agency FB", 15, "bold")

def pSlime():
    m1.penup()
    m1.goto(-480, 200)
    m1.left(180)
    m1.pendown()

    m1.begin_fill()
    for _ in range(4):
        m1.circle(20, 90)
        m1.forward(360)
    m1.end_fill()

    m1.penup()
    m1.goto(-350, 100)
    m1.pendown()
    m1.fillcolor("black")

    m1.begin_fill()
    for _ in range(4):
        m1.forward(20)
        m1.right(90)
    m1.end_fill()

    m1.penup()
    m1.goto(-250, 120)
    m1.left(180)
    m1.pendown()

    m1.begin_fill()
    for _ in range(4):
        m1.forward(20)
        m1.right(90)
    m1.end_fill()

    m1.left(90)
    m1.penup()
    m1.goto(-400, 0)
    m1.pendown()

    m1.begin_fill()
    for _ in range(2):
        m1.forward(20)
        m1.right(90)
        m1.forward(100)
        m1.right(90)
    m1.end_fill()

def fireSlime():
    m2.penup()
    m2.goto(120, 350)
    m2.left(180)
    m2.pendown()

    m2.begin_fill()
    for _ in range(4):
        m2.circle(20, 90)
        m2.forward(360)
    m2.end_fill()

    m2.penup()
    m2.goto(550 - 350, 100 + 150)
    m2.pendown()
    m2.fillcolor("black")

    m2.begin_fill()
    for _ in range(4):
        m2.forward(20)
        m2.right(90)
    m2.end_fill()

    m2.penup()
    m2.goto(550 - 250, 120 + 150)
    m2.left(180)
    m2.pendown()

    m2.begin_fill()
    for _ in range(4):
        m2.forward(20)
        m2.right(90)
    m2.end_fill()

    m2.penup()
    m2.goto(650 - 400, 150)
    m2.left(90)
    m2.pendown()

    m2.begin_fill()
    for _ in range(2):
        m2.forward(20)
        m2.right(90)
        m2.forward(100)
        m2.right(90)
    m2.end_fill()

def buttons(x, y):
    global turnToken, eHP

    if 17 < x < 299 and y -230 < y < -161:
        eHP -= pDMG
        screen.textinput("", "attack")
        turnToken -= 1
    if 300 < x < 671 and -234 < y < -153:
        screen.textinput("", "Coming soon")
    if 300 < x < 671 and -356 < y < -235:
        screen.textinput("", "You can't run during the tutorial!")
    if 17 < x < 299 and -356 < y < -235:
        if eATK != 1:
            eDMG -= pDEF
            screen.textinput("", "defend")
            turnToken -= 1
        else:
            screen.textinput("", "Whoops! looks like the enemy's attack has reached 1 or less! Try something else!")

def play():
    global turnToken

    pHP = 100
    pATK = 10

    if eHP != 0 or pHP != 0:
        if turnToken == 1:
            screen.onscreenclick(buttons, 1)
        else:
            screen.onscreenclick(None, 1)

            turnToken += 1

            AtkDef = randint(1, 2)
            if pATK == 1:
                AtkDef = 1

            if AtkDef == 1:
                pHP -= eATK
                screen.textinput("", "attack")
            else:
                pATK -= eDEF
                screen.textinput("", "defend")

        screen.ontimer(play, 1000)

screen = Screen()
screen.setup(width=1.0, height=1.0)

m1 = Turtle(visible=False)
m1.speed('fastest')
m1.fillcolor("lime")

m2 = Turtle(visible=False)
m2.speed('fastest')
m2.fillcolor("red")

txt = Turtle(visible=False)
txt.speed('fastest')
txt.penup()

pDEF = 1
eDEF = 1

pDMG = 5
eDMG = 5

eHP = 50
eATK = 10

turnToken = 1

pSlime()

fireSlime()

txt.pensize(15)
txt.goto(-800, -230)
txt.pendown()

txt.forward(750)
txt.left(50)
txt.forward(100)
txt.right(50)
txt.forward(800)

txt.penup()
txt.pensize(5)
txt.goto(-800, 230)
txt.pendown()

txt.forward(700)
txt.left(90)
txt.forward(200)
txt.left(90)

txt.penup()
txt.forward(570)
txt.left(90)
txt.forward(105)

txt.write("\nWelcome to Evolve, a game of monsters, genetics, \nand battle. The slime on the left will be your first monster.\n Click the attack button to attack the fire slime on the right", align="left", font=SMALL_FONT)

txt.pensize(3)
txt.goto(300, 300)
txt.forward(450)
txt.pendown()

txt.forward(85)
txt.left(90)
txt.forward(500)
txt.left(180)
txt.forward(900)
txt.left(90)
txt.forward(200)
txt.left(180)
txt.forward(200)
txt.left(90)
txt.right(180)
txt.forward(362)
txt.right(90)
txt.forward(200)

txt.penup()
txt.goto(110, -220)
txt.write("Attack", align="left", font=LARGE_FONT)
txt.forward(100)
txt.write("Defend", align="left", font=LARGE_FONT)
txt.left(90)
txt.forward(200)
txt.write("Exit Battle", align="left", font=LARGE_FONT)
txt.left(90)
txt.forward(100)
txt.write("Item", align="left", font=LARGE_FONT)

screen.listen()  # only needs to be called once, can't be undone

play()

screen.mainloop()
0 голосов
/ 15 февраля 2019

По причинам, которые другие утверждают, невозможно точно знать, в чем заключается ваша проблема, поскольку вы не предоставляете весь свой код.Я вижу что-то подозрительное, на которое я укажу, потому что это вполне может быть вашей проблемой ...

Ваш второй блок кода - это цикл, отсюда и возможность заморозки.Единственный выход из этого цикла состоит в том, что и eHP, и pHP становятся равными 0. Из кода, который я вижу, вполне вероятно, что это условие никогда не произойдет, и вы застрянете в этом цикле навсегда.

Не видя больше вашего кода, я не могу это знать наверняка, но весьма подозрительно, что вы только когда-либо делали вычитание из двух переменных, которые вы тестируете.Я не знаю, откуда берутся значения, которые вы вычитаете, но если они оба положительны, то вы можете легко получить любое из значений, которые вы тестируете, отрицательными и не сможете выйти из циклавернув их обратно к 0.

Возможно, вы хотите проверить эти значения на «<0», а не «! = 0», и, возможно, вы хотите «и», а не «или».Невозможно узнать, что вы предоставили. </p>

...