2016-05-09 28 views
0

Ich habe keine Ahnung, was ich hier tun soll, ich möchte es so machen, dass eine Schildkröte in Python eine Kugel schießt und wenn es mit der anderen Schildkröte kollidiert, steigt die Punktzahl. Außer wenn ich diesen Code ausführe, stürzt das Spiel ab, wenn ich die Kugel schieße. Bisher habe ich es nur für einen der acht Bewegungsbefehle versucht.Wie führe ich eine Kollisionsprüfung durch?

#imports turtles 
import turtle 
import random 
#Sets screen, turtle program, and colour group 
turtle.setup(1000, 800) 
screen = turtle.Screen() 
wn = turtle.Screen() 
wn.bgcolor("springgreen") 

amir = turtle.Turtle() 
amir.shape("arrow") 
amir.shapesize(1) 
amir.speed(10) 
amir.pensize (2) 
amir.color("blue") 
amir.setheading(90) 
amir.penup() 
#bullet 1 
jonafat = turtle.Turtle() 
jonafat.shape("circle") 
jonafat.shapesize(0.5) 
jonafat.speed(2) 
jonafat.pensize (1) 
jonafat.color("black") 
jonafat.penup() 
jonafat.ht() 

hossein = turtle.Turtle() 
hossein.shape("arrow") 
hossein.shapesize(1) 
hossein.speed(10) 
hossein.pensize (2) 
hossein.color("gold") 
hossein.setheading(90) 
hossein.penup() 
#bullet 
jonafat2 = turtle.Turtle() 
jonafat2.shape("circle") 
jonafat2.shapesize(0.5) 
jonafat2.speed(2) 
jonafat2.pensize (1) 
jonafat2.color("black") 
jonafat2.penup() 
jonafat2.ht() 
#scoreboard 
TT = turtle.Turtle() 
TT.ht() 
TT.penup() 
TT.goto(-500,200) 
TT.color("black") 
TT.write("0", move = False, align = "center", font = ("Arial", 20, "normal")) 
#second scoreboard 
TT = turtle.Turtle() 
TT.ht() 
TT.penup() 
TT.goto(-500,200) 
TT.color("black") 
TT.write("0", move = False, align = "center", font = ("Arial", 20, "normal")) 

x = 0 
y = 0 
amirs = 2 
hosseins = 2 
auto = 15 
vanguard = 15 
trump = 0 
time = 1 
score = 0 
panda = 295 

def up(): 
    global amir 
    global x 
    global amirs 
    global hosseins 
    amir.seth(90) 
    n = 1 
    for i in range(0, n): 
     amir.sety(amir.ycor()+10) 
     n + 1 

def down(): 
    global amir 
    global x 
    global amirs 
    global hosseins 
    amir.seth(270) 
    n = 1 
    for i in range(0, n): 
     amir.sety(amir.ycor()-10) 
     n + 1 

def left(): 
    global amir 
    global x 
    global amirs 
    global hosseins 
    amir.seth(180) 
    n = 1 
    for i in range(0, n): 
     amir.setx(amir.xcor()-10) 
     n + 1 

def right(): 
    global amir 
    global x 
    global amirs 
    global hosseins 
    amir.seth(0) 
    n = 1 
    for i in range(0, n): 
     amir.setx(amir.xcor()+10) 
     n + 1 

def up2(): 
    global hossein 
    global y 
    global hosseins 
    hossein.seth(90) 
    n = 1 
    for i in range(0, n): 
     hossein.sety(hossein.ycor()+10) 
     n + 1 

def down2(): 
    global hossein 
    global y 
    global hosseins 
    hossein.seth(270) 
    n = 1 
    for i in range(0, n): 
     hossein.sety(hossein.ycor()-10) 
     n + 1 

def left2(): 
    global hossein 
    global y 
    global hosseins 
    hossein.seth(180) 
    n = 1 
    for i in range(0, n): 
     hossein.setx(hossein.xcor()-10) 
     n + 1 

def right2(): 
    global hossein 
    global y 
    global hosseins 
    hossein.seth(0) 
    n = 1 
    for i in range(0, n): 
     hossein.setx(hossein.xcor()+10) 
     n + 1 

def collisionCheck(jonafat, hossein): 
    crash = True 
    jonafat1X = jonafat.xcor() 
    jonafat1Y = jonafat.ycor() 
    hossein2X = hossein.xcor() 
    hossein2Y = hossein.ycor() 
    jonafatPos = (int(jonafat1X), int(jonafat1Y)) 
    hosseinPos = (int(hossein2X), int(hossein2Y)) 
    if jonafatPos != hosseinPos: 
     crash = False 
    if jonafatPos == hosseinPos: 
     crash = True 
    return crash 

def clock(): 
    global time 
    time = time-1 

def move(): 
    global auto 
    global vanguard 
    global score 
    global time 
    wn.ontimer(clock,1000) 
    angle = amir.heading() 
    jonafat.ht() 
    jonafat.speed(10) 
    jonafat.setpos(amir.xcor(), amir.ycor()) 
    if angle == 0: 
     trump = 1. 
     time = time-1 
     jonafat.showturtle() 
     jonafat.speed(2) 
     n = 1 
     for i in range(0, n): 
      jonafat.goto(amir.xcor()+300, amir.ycor()) 
      n + 1 
     infLoop = 1 
     while infLoop == 1: 
       if collisionCheck(jonafat, hossein) == True: 
        infLoop = 0 
        break 
        score = score + 1 
        TT.clear() 
        TT.write(score, move = False, align = "center", font = ("Arial", 20, "normal")) 

       if time == 0: 
        break 
        infLoop = 0 


    if angle == 90: 
     jonafat.showturtle() 
     jonafat.speed(2) 
     n = 1 
     for i in range(0, n): 
      jonafat.goto(amir.xcor(),amir.ycor()+300) 
      n + 1 
    if angle == 180: 
     jonafat.showturtle() 
     jonafat.speed(2) 
     n = 1 
     for i in range(0, n): 
      jonafat.goto(amir.xcor()-300, amir.ycor()) 
      n + 1 
    if angle == 270: 
     jonafat.showturtle() 
     jonafat.speed(2) 
     n = 1 
     for i in range(0, n): 
      jonafat.goto(amir.xcor(), amir.ycor()-300) 
      n + 1 


def move2(): 
    angle2 = hossein.heading() 
    jonafat2.ht() 
    jonafat2.speed(10) 
    jonafat2.setpos(hossein.xcor(), hossein.ycor()) 
    if angle2 == 0: 
     jonafat2.showturtle() 
     jonafat2.speed(2) 
     n = 1 
     for i in range(0, n): 
      jonafat2.goto(hossein.xcor()+300, hossein.ycor()) 
      n + 1 
    if angle2 == 90: 
     jonafat2.showturtle() 
     jonafat2.speed(2) 
     n = 1 
     for i in range(0, n): 
      jonafat2.goto(hossein.xcor(), hossein.ycor()+300) 
      n + 1 
    if angle2 == 180: 
     jonafat2.showturtle() 
     jonafat2.speed(2) 
     n = 1 
     for i in range(0, n): 
      jonafat2.goto(hossein.xcor()-300, hossein.ycor()) 
      n + 1 
    if angle2 == 270: 
     jonafat2.showturtle() 
     jonafat2.speed(2) 
     n = 1 
     for i in range(0, n): 
      jonafat2.goto(hossein.xcor(), hossein.ycor()-300) 
      n + 1 








wn.onkeypress(up, "w") 
wn.onkeypress(down, "s") 
wn.onkeypress(left, "a") 
wn.onkeypress(right, "d") 
wn.onkeypress(up2, "Up") 
wn.onkeypress(down2, "Down") 
wn.onkeypress(left2, "Left") 
wn.onkeypress(right2, "Right") 
wn.onkeypress(move2, "Shift_R") 

wn.onkeypress(move, "space") 

wn.listen() 

Dies ist der Teil I mit Mühe haben

def collisionCheck(jonafat, hossein): 
    crash = True 
    jonafat1X = jonafat.xcor() 
    jonafat1Y = jonafat.ycor() 
    hossein2X = hossein.xcor() 
    hossein2Y = hossein.ycor() 
    jonafatPos = (int(jonafat1X), int(jonafat1Y)) 
    hosseinPos = (int(hossein2X), int(hossein2Y)) 
    if jonafatPos != hosseinPos: 
     crash = False 
    if jonafatPos == hosseinPos: 
     crash = True 
    return crash 

def clock(): 
    global time 
    time = time-1 

def move(): 
    global auto 
    global vanguard 
    global score 
    global time 
    wn.ontimer(clock,1000) 
    angle = amir.heading() 
    jonafat.ht() 
    jonafat.speed(10) 
    jonafat.setpos(amir.xcor(), amir.ycor()) 
    if angle == 0: 
     trump = 1. 
     time = time-1 
     jonafat.showturtle() 
     jonafat.speed(2) 
     n = 1 
     for i in range(0, n): 
      jonafat.goto(amir.xcor()+300, amir.ycor()) 
      n + 1 
     infLoop = 1 
     while infLoop == 1: 
       if collisionCheck(jonafat, hossein) == True: 
        infLoop = 0 
        break 
        score = score + 1 
        TT.clear() 
        TT.write(score, move = False, align = "center", font = ("Arial", 20, "normal")) 

       if time == 0: 
        break 
        infLoop = 0 

Antwort

0

Es scheint die einzige zu überprüfen, ob ihre Position gleich ist, obwohl zwei Objekte nahe beieinander passieren können, so dass sie visuell kollidieren, aber sind nicht genau auf der gleichen Position wie einander.

Sie sollten ihre Abmessungen berücksichtigen, um ordnungsgemäß auf Kollisionen zu prüfen. Der einfachste Weg, um zu überprüfen, ob sie kollidieren, besteht darin, den Abstand zwischen ihren Positionen zu ermitteln und zu überprüfen, ob sie kleiner als ein bestimmter Wert ist. Obwohl bessere Optionen existieren.

0

Statt dessen alle:

def collisionCheck(jonafat, hossein): 
    crash = True 
    jonafat1X = jonafat.xcor() 
    jonafat1Y = jonafat.ycor() 
    hossein2X = hossein.xcor() 
    hossein2Y = hossein.ycor() 
    jonafatPos = (int(jonafat1X), int(jonafat1Y)) 
    hosseinPos = (int(hossein2X), int(hossein2Y)) 
    if jonafatPos != hosseinPos: 
     crash = False 
    if jonafatPos == hosseinPos: 
     crash = True 
    return crash 

des nehmen Lassen Vorteil @ JoshuaWaring Rat sowie der Schildkröte distance() Methode und kommen mit etwas mehr wie:

PERSONAL_SPACE = 10 # assign this to be how close is too close 

def collisionCheck(jonafat, hossein): 
    return jonafat.distance(hossein) < PERSONAL_SPACE 

Lassen Sie uns den Rest der Nacharbeit Code, um ein minimal spielbares Spiel zu erzeugen:

# imports turtles 
from turtle import Turtle, Screen 

PERSONAL_SPACE = 15 # assign this to be how close is too close 
FIRE_DISTANCE = 300 
FONT = ('Arial', 36, 'normal') 

# Sets screen, turtle program, and color group 
screen = Screen() 
screen.setup(1000, 800) 
screen.bgcolor('springgreen') 

def collisionCheck(bullet, player): 
    return bullet.distance(player) < PERSONAL_SPACE 

def up1(): 
    player1.seth(90) 
    player1.forward(10) 

def down1(): 
    player1.seth(270) 
    player1.forward(10) 

def left1(): 
    player1.seth(180) 
    player1.forward(10) 

def right1(): 
    player1.seth(0) 
    player1.forward(10) 

def clock1(): 
    global time1, score1 

    if collisionCheck(bullet1, player2): 
     score1 += 1 
     TT1.undo() 
     TT1.write(score1, align='center', font=FONT) 
     time1 = 1 
    else: 
     bullet1.forward(1) 

    time1 -= 1 

    if time1: 
     screen.ontimer(clock1, 10) 
    else: 
     bullet1.hideturtle() 

def fire1(): 
    global time1 

    bullet1.setpos(player1.pos()) 
    bullet1.setheading(player1.heading()) 
    bullet1.showturtle() 

    time1 = FIRE_DISTANCE 
    screen.ontimer(clock1, 100) 

screen.onkeypress(up1, 'w') 
screen.onkeypress(down1, 's') 
screen.onkeypress(left1, 'a') 
screen.onkeypress(right1, 'd') 
screen.onkeypress(fire1, 'space') 

def up2(): 
    player2.seth(90) 
    player2.forward(10) 

def down2(): 
    player2.seth(270) 
    player2.forward(10) 

def left2(): 
    player2.seth(180) 
    player2.forward(10) 

def right2(): 
    player2.seth(0) 
    player2.forward(10) 

def clock2(): 
    global time2, score2 

    if collisionCheck(bullet2, player1): 
     score2 += 1 
     TT2.undo() 
     TT2.write(score2, align='center', font=FONT) 
     time2 = 1 
    else: 
     bullet2.forward(1) 

    time2 -= 1 

    if time2: 
     screen.ontimer(clock2, 10) 
    else: 
     bullet2.hideturtle() 

def fire2(): 
    global time2 

    bullet2.setpos(player2.pos()) 
    bullet2.setheading(player2.heading()) 
    bullet2.showturtle() 

    time2 = FIRE_DISTANCE 
    screen.ontimer(clock2, 100) 

screen.onkeypress(up2, 'Up') 
screen.onkeypress(down2, 'Down') 
screen.onkeypress(left2, 'Left') 
screen.onkeypress(right2, 'Right') 
screen.onkeypress(fire2, '0') 

player1 = Turtle('arrow') 
player1.speed('fastest') 
player1.color('blue') 
player1.setheading(180) 
player1.penup() 
player1.forward(10) 

# bullet 1 
bullet1 = Turtle('circle', visible=False) 
bullet1.shapesize(0.5) 
bullet1.speed('fastest') 
bullet1.color('black', 'blue') 
bullet1.penup() 

player2 = Turtle('arrow') 
player2.speed('fastest') 
player2.color('gold') 
player2.setheading(0) 
player2.penup() 
player2.forward(10) 

# bullet 2 
bullet2 = Turtle('circle', visible=False) 
bullet2.shapesize(0.5) 
bullet2.speed('fastest') 
bullet2.color('black', 'gold') 
bullet2.penup() 

# scoreboard 
TT1 = Turtle(visible=False) 
TT1.penup() 
TT1.goto(-450, 300) 
TT1.color('blue') 
TT1.write('0', align='center', font=FONT) 

# second scoreboard 
TT2 = Turtle(visible=False) 
TT2.penup() 
TT2.goto(450, 300) 
TT2.color('gold') 
TT2.write('0', align='center', font=FONT) 

time1 = 0 
score1 = 0 

time2 = 0 
score2 = 0 

screen.listen() 

screen.mainloop() 

Benötigt immer noch zusätzliche Arbeit, d. H. Behandelt (oder deaktiviert) mehrere Aufnahmen nicht korrekt, usw.

enter image description here

Verwandte Themen