Luke, thank you for your quick and complete response.  Based on your 
suggestions I have already made some progress!  BTW, I am so glad that I 
can ask this list my Python questions and get help.  I began feeling 
quite stuck and not knowing where to turn for help.  So, thank you for 
the great service!

Luke Paireepinart wrote:
> Tonu Mikk wrote:
>> Thanks for offering to help!  I am following the Livewires exercise 
>> (attached file "5-robots.pdf").  I have gotten as far as page 7.  
>> Attached is also my code so far in robotsarecoming-teleport.py.
>> Question 1.  I was checking for collision of a robot and player first 
>> in this way:
>>
>> def check_collisions():
>>    if player_x == robot_x+0.5 and player_y == robot_y+0.5:
>>       print 'You have been caught'
>>
>> This was working fine.  I then tried to create a definition like this:
>>
>> def collided():
>>    player_x == robot_x+0.5 and player_y == robot_y+0.5
> I haven't looked at your code yet, but this doesn't seem like a very 
> good way to check for collisions,
> unless the player moves on a grid of 0.5 at a time, and you guarantee 
> that you can check if the player collided with a robot on every move.
> even so, doesn't this only collide with the robot if the player hits 
> the bottom-right corner?
Yes, this indeed looks strange.  I believe it is particular to this 
Livewires exercise.  The reason it is strange is that I am comparing a 
position of two different shapes, a circle and a square.  The position 
for the circle is in the center of the circle and it is defined by 
player_x and player_y coordinates.  The position of the square is 
defined by the first two coordinates that make up a square robot_x and 
robot_y.  The circle radius is 0.5.  It took me a loooong time to figure 
out how to write my code so that when the robot sits exactly on top of 
the player, there is a message "you have been caught" :-) .  When I run 
the code, the robot will sit on top of the player and I can have the  
message printed - yeaaah!
>
>>
>> and then check for collisions in this way (as in my code):
>> def check_collisions():
>>    if collided() == 1:
>>        print 'You have been caught'
> The reason this isn't working is because your function 'collided' 
> doesn't return anything.
> Consider this example:
>
> def foo():
>    "Hello"
>
> What do you expect to happen when you call foo()?
> 1) "Hello" won't be printed, because there is no 'print' statement here.
> 2) "Hello" won't be returned, because you have no return statement.
> So what does happen, then?
> well, foo() creates a string in memory with "Hello" stored in it, but 
> there are no variables referenced to it, so nothing happens.
> Basically, the only thing foo() accomplishes is that it wastes memory 
> until "Hello" is garbage collected and deleted.
>
> Now consider this:
> def foo():
>    a == b and b == c
>
> What do you expect to happen here?
> It's similar to the above example.
> a == b is evaluated.
> if it's true, b == c is evaluated.
> if it's true, then the value True is there, but it's not assigned to 
> any variables, so it just disappears.
> Can you see now why your code doesn't work?
>
> Here's an example of a function you'd want to look at to give you an 
> idea of what to do:
>
> def foo():
>  return a < b
>> But this isn't printing out anything when the player and robot 
>> collide.  I think I need to pass a variable of collided somehow, but 
>> I am not sure how.  I also tried following:
>> def check_collisions():
>>    if collided()
>>       print 'You have been caught'
>> but this isn't working either.
> This is because collided() is not returning anything.
> Try this:
> print collided()
> you will get this output:
> None
Based on your guidance, I figured it out.  I need to use a return 
statement, which I had not encountered before.  Now I wrote my 
definitions in this way:

def collided():
    if player_x == robot_x+0.5 and player_y == robot_y+0.5:
       return True

Then I use that value in another definition like this:

def check_collisions():
    if collided() == 1:
       print "You have been caught"

Which is displaying the message when the robot sits on top of the player.
   
>>
>> Question 2.  I created a if statement to check if the "t" key is 
>> pressed on a keyboard.  If it is, I want the player to be placed on 
>> another location on the grid.  However nothing happens when I press 
>> the "t" key.  I am not sure why.
> Instead of changing the player's location, print "YOU PRESSED T" 
> instead, and if you see that in the console, you know there's a 
> problem with your repositioning code.  If you don't see that, you know 
> it's a problem with your input code.
> If you can't diagnose further than that, let us know.
It is great suggestion to use a print statement for testing!  I tried it 
and I did not get a printed message either.  I will need to think about 
it some more.  I believe your other email will give me some ideas here.
>>
>> Question 3.  I think there is something strange about how I check 
>> that my player is within the boundaries of the grid.  When it gets 
>> close to the edges of the grid, it can sometimes disappear past it 
>> even though I thought I had prevented this from happening.
> It's probably similar to the thing I was mentioning above.
> Imagine that you have this case:
> you're checking if the player is hitting 0.5, 0.5
> now if the player can move by acceleration, etc... and you can't 
> guarantee that it moves exactly in .5 increments, the player may very 
> well move to the position .51,.51 and from there, to .49, .49 which 
> would negate your test.
> Even if you check a range of values (for example, 0.0 - 0.5 in the x 
> axis and 0.0 - 0.5 in the y axis)
> the player could theoretically jump right over this boundary (unless 
> you restrict his maximum movement speed.)
> The best way to check would be:
> Say you have the player's coordinates
> playerx, playery
> and your player-permitted space is 0,0 to 1024, 768
> I would suggest something like this:
> newx, newy = (playerx + movex, playery + movey)
> if newx >= 0 and newx < 1024:
>    playerx = newx
> if newy >= 0 and newy < 768:
>    playery = newy
>
> This will only allow the player to move to wherever he's moving IFF 
> he's not moving out of bounds.
> Otherwise, he just stays where he is.
> Alternatively, you could check the boundaries, and if he's outside, 
> set him to the boundary.
> That way you could have the player walk right up to the wall, which 
> isn't allowed in my code (depending how fast the player moves)
> For example, if the player moves at 1.5, and he's at the position 1.4, 
> he won't be able to move any closer to the wall.
>
Thanks for this suggestion.  I will likely need to re-write how I check 
for boundaries.  Currently I was checking for boundaries after I moved 
the player.  I did this by not letting the player_x and player_y 
coordinates to be changed if the player was going to go beyond 
boundaries.  It seems I need to put in a check for boundaries before I 
move the player.
>>
>>
>> Thank you again for looking at this.  The attached bit of code has 
>> taken a long time to create.  I admire all who can program :-).
> Hey, I'm going to send this e-mail now, so everyone on the list (you 
> included) will be able to read it, but I'm going to send another one 
> in a second with comments on your code (Unless you don't want ;)
Yes, I do want you to comment on the code, absolutely, which I see you 
so generously did in another email.

Thank you,
Tonu
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to