2017-04-18 22 views
2

私は、赤いカメが青いカメを追いかけるPythonゲームを作ろうとしています。赤いカメが青いカメを捕まえたら、画面上に「COLLISION」と言ってもらいたいが、機能していない。衝突すると何も起きず、エラーが発生します。 'Turtle'オブジェクトは呼び出し可能ではありません。カメは.rect()メソッドを持っていないPython turtle gameの衝突を検出する

def is_collided_with(self, run): 
    return self.rect.colliderect(run.rect) 

runner = run(10, 10, 'my_run') 
follower = follow(20, 10) 
if follow.is_collided_with(run): 
    print 'collision!' 

from turtle import Turtle, Screen 

playGround = Screen() 

playGround.screensize(250, 250) 
playGround.title("Turtle Keys") 

run = Turtle("turtle") 
run.speed("fastest") 
run.color("blue") 
run.penup() 
run.setposition(250, 250) 

follow = Turtle("turtle") 
follow.speed("fastest") 
follow.color("red") 
follow.penup() 
follow.setposition(-250, -250) 

def k1(): 
    run.forward(45) 

def k2(): 
    run.left(45) 

def k3(): 
    run.right(45) 

def k4(): 
    run.backward(45) 

def quitThis(): 
    playGround.bye() 

def follow_runner(): 
    follow.setheading(follow.towards(run)) 
    follow.forward(8) 
    playGround.ontimer(follow_runner, 10) 

playGround.onkey(k1, "Up") # the up arrow key 
playGround.onkey(k2, "Left") # the left arrow key 
playGround.onkey(k3, "Right") # you get it! 
playGround.onkey(k4, "Down") 

playGround.listen() 

follow_runner() 

def is_collided_with(self, run): 
    return self.rect.colliderect(run.rect) 

runner = run(10, 10, 'my_run') 
follower = follow(20, 10) 
if follow.is_collided_with(run): 
    print 'collision!' 

playGround.mainloop() 
+0

「実行」の位置が「フォロー」と一致するかどうかを確認することができますか? – aug

+0

私はpygameについてそのコードには何も見ません。あなたがpygameを使用しているなら、そのスプライト機能を使用して、pygameに衝突を検出させてみませんか? –

答えて

2

このコードは、実際のプログラミングよりも希望的観測であるように思われます。このdefステートメントを使用して、既存のクラスにis_collided_with()メソッドを追加することはできません。 run()follow()の機能はありません。この衝突テストは、動作ごとに必要なときに一度だけ実行されます。我々は、この作業を行うことができますし、何サルベージしてみましょう:あなたが合うよう

from turtle import Turtle, Screen 

playGround = Screen() 

playGround.screensize(250, 250) 
playGround.title("Turtle Keys") 

run = Turtle("turtle") 
run.color("blue") 
run.penup() 
run.setposition(250, 250) 

follow = Turtle("turtle") 
follow.color("red") 
follow.penup() 
follow.setposition(-250, -250) 

def k1(): 
    run.forward(45) 

def k2(): 
    run.left(45) 

def k3(): 
    run.right(45) 

def k4(): 
    run.backward(45) 

def quitThis(): 
    playGround.bye() 

def is_collided_with(a, b): 
    return abs(a.xcor() - b.xcor()) < 10 and abs(a.ycor() - b.ycor()) < 10 

def follow_runner(): 
    follow.setheading(follow.towards(run)) 
    follow.forward(min(follow.distance(run), 8)) 

    if is_collided_with(follow, run): 
     print('Collision!') 
     quitThis() 
    else: 
     playGround.ontimer(follow_runner, 10) 

playGround.onkey(k1, "Up") # the up arrow key 
playGround.onkey(k2, "Left") # the left arrow key 
playGround.onkey(k3, "Right") # you get it! 
playGround.onkey(k4, "Down") 

playGround.listen() 

follow_runner() 

playGround.mainloop() 

私は亀のカーソルのサイズに基づいて衝突半径として10を使用して、あなたが調整することができます。このコードは単にメッセージを表示してゲームを終了させ、衝突が発生したときにはもっと洗練されたものをやりたいことがあります。ランナーが誤ってフォロワーを奪った場合のために、各キーストローク後に衝突ロジックを独自の機能として使用することを検討することができます。

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

なぜ単純に: 'return t1.distance(t2)<20' – cdlane

+0

ありがとう!!!!!!!!! –

1

私たちはカメでの距離のための機能を持っているので、のはturtle1は、X1、Y1であるとしましょう、とturtle2はX2、Y2であり、その距離は、その2点間の数学的XY距離として計算されます。

ここで、turtle1の半径をr1、turtle2の半径をr2とすると、距離がこれらの2つの半径の合計よりも小さい場合は、チェンジングによって衝突を確認できます。

だから私は、これらの半径は、このように設定することができた(R1 + R2)< = turtle1.distance(turtle2.pos())

場合、それは をチェックするために十分であろうと思う:turtle1.r = 10 、turtle2.r = 5、またはグローバル変数として、r1 = 10、r2 = 5です。最後のオプションが適用可能な場合は、defのglobalキーワードを覚えておいてください。

カメ、タートル1、およびカメのリストとの衝突を確認するには、カメの名前[[ジム、ベン、ケイト、ジェーン]、すべてのカメに半径のフィールドがあります。r、このリストを反復することができます、turtle1はそれらのいずれかに衝突したかどうかを確認するには:この最後の1の機能を作るために今すぐ

collsion=False 
for turtle in turtles: 
    if (turtle.r+turtle1.r)<=turtle1.distance(turtle.pos()): 
     collision=True 
     # turtle.reset() # removes the turtle 
     # points+=1, or whatever 

def group_collide(t1,group): 
    global points 
    turtle1=t1 
    collide=False 
    for turtle in group: 
     if (turtle.r+turtle1.r)<=turtle1.distance(turtle(pos)): 
      collide=True 
      turtle.reset() 
      points+=1 
    # if needed: 
    return collide 

をこれはturtle1は、グループ内のいずれかと衝突した場合、カメを削除検出されますそのturtle1が衝突し、グローバルポイントに1を加え、必要に応じてTrueを返します。衝突が発生した場合はFalse。

このように、フォロワーはカメのグループを追い抜こうとする可能性があります。これがいくらか助けてくれることを願っています。