from tkinter import *
import random
root= Tk( )
#Appearence
RTitle= root.title ( "Protect'em" )
RWidth= 400
RHeight= 500
root.geometry ( ( "%dx%d" ) %( RWidth, RHeight) )
fr0 = Frame( root, bg= "#DEB887" , width= 210 , height= 500 , bd= 10 )
can = Canvas( fr0, bg= "#FFF8DC" , width= 200 , height= 500 )
fr1 = Frame( root, bg= "lightblue" , width= 190 , height= 500 , bd= 12 )
fr0.pack ( side= "left" )
can.pack ( )
fr1.pack ( side= "right" )
inv = Label( fr1, text= "Move: \n Left, Right.\n Shoot:\n Space\n You've got 5 lifes\n Shoot to START" ,
font = "Arial 15" )
inv.grid ( row= 0 )
#/Appearence
xy = [ ( 90 , 400 ) , ( 110 , 400 ) , ( 110 , 420 ) , ( 130 , 420 ) , ( 130 , 440 ) , ( 110 , 440 ) , ( 110 , 460 ) ,
( 130 , 460 ) , ( 130 , 480 ) , ( 70 , 580 ) , ( 70 , 460 ) , ( 90 , 460 ) , ( 90 , 440 ) ,
( 70 , 440 ) , ( 70 , 420 ) , ( 90 , 420 ) ]
car = can.create_polygon ( xy, fill= "red" , outline= "black" )
car_place = can.coords ( car)
class Hero( ) :
def __init__ ( self ) :
self .points = 0
self .car_shoot_number = 1
self .hero_lifes = 5
def car_move_left( self , event) :
self .car_place = can.coords ( car)
if self .car_place [ 18 ] >= 10 :
self .car_shoot_number -= 1
can.move ( car, -70 , 0 )
def car_move_right( self , event) :
self .car_place = can.coords ( car)
if self .car_place [ 6 ] < 200 :
self .car_shoot_number += 1
can.move ( car, 70 , 0 )
class Enemy( Hero) :
def create_rock( self ) :
self .rocktype = random .randint ( 0 , 2 )
if self .rocktype == 0 :
self .rock = can.create_rectangle ( 30 , 10 , 50 , 30 , fill= "black" ,
outline= "green" )
elif self .rocktype == 1 :
self .rock = can.create_rectangle ( 90 , 10 , 110 , 30 , fill= "black" ,
outline= "green" )
elif self .rocktype == 2 :
self .rock = can.create_rectangle ( 150 , 10 , 170 , 30 , fill= "black" ,
outline= "darkgreen" )
else : print ( "it cant be" )
def delete_rock( self ) :
can.delete ( self .rock )
def endgame( self ) :
root.destroy ( )
self .root = Tk( )
self .endsight = Label( self .root , text = "Game Is Over\n Your Score:" , font= "Arial 20" )
self .endsight1 = Label( self .root , text = hero.points , font= "Arial 20" )
self .endsight1 .pack ( side= "bottom" )
self .endsight .pack ( side= "top" )
self .root .mainloop ( )
def enemymove( self ) :
can.move ( self .rock , 0 , 20 )
can.after ( 30 , self .enemymove )
self .rock_place = can.coords ( self .rock )
if self .rock_place [ 1 ] == 410 and hero.car_shoot_number == self .rocktype :
self .delete_rock ( )
enemy.create_rock ( )
hero.hero_lifes -= 1
#print(hero.hero_lifes)
elif self .rock_place [ 1 ] > 470 :
hero.hero_lifes -= 1
# print(hero.hero_lifes)
self .delete_rock ( )
enemy.create_rock ( )
if hero.hero_lifes == 0 :
self .endgame ( )
def shootem( self , event) :
if hero.car_shoot_number == self .rocktype :
hero.points += 1
poin.addtext ( hero.points )
#print(self.points)
can.delete ( self .rock )
enemy.create_rock ( )
class Points( ) :
def __init__ ( self ) :
self .point = Text( fr1, width = 10 , height = 1 )
self .point .grid ( row= 1 )
def addtext( self , point) :
#print(enemy.points)
self .point .delete ( 1.0 , END)
self .point .insert ( END, point)
hero= Hero( )
enemy = Enemy( )
enemy.create_rock ( )
enemy.enemymove ( )
poin = Points( )
root.bind ( "<space>" , enemy.shootem )
root.bind ( "<Left>" , hero.car_move_left )
root.bind ( "<Right>" , hero.car_move_right )
mainloop( )
ZnJvbSB0a2ludGVyIGltcG9ydCAqCmltcG9ydCByYW5kb20KCnJvb3Q9VGsoKQoKI0FwcGVhcmVuY2UKUlRpdGxlPXJvb3QudGl0bGUoIlByb3RlY3QnZW0iKQpSV2lkdGg9NDAwClJIZWlnaHQ9NTAwCnJvb3QuZ2VvbWV0cnkoKCIlZHglZCIpJShSV2lkdGgsUkhlaWdodCkpCgpmcjAgPSBGcmFtZShyb290LGJnPSIjREVCODg3Iix3aWR0aD0yMTAsaGVpZ2h0PTUwMCxiZD0xMCkKY2FuID0gQ2FudmFzKGZyMCxiZz0iI0ZGRjhEQyIsd2lkdGg9MjAwLGhlaWdodD01MDApCmZyMSA9IEZyYW1lKHJvb3QsYmc9ImxpZ2h0Ymx1ZSIsd2lkdGg9MTkwLGhlaWdodD01MDAsYmQ9MTIpCmZyMC5wYWNrKHNpZGU9ImxlZnQiKQpjYW4ucGFjaygpCmZyMS5wYWNrKHNpZGU9InJpZ2h0IikKCgoKaW52ID0gTGFiZWwoZnIxLHRleHQ9Ik1vdmU6IFxuTGVmdCwgUmlnaHQuXG4gU2hvb3Q6XG4gU3BhY2VcbllvdSd2ZSBnb3QgNSBsaWZlc1xuIFNob290IHRvIFNUQVJUIiwKICAgICAgICAgICAgZm9udCA9ICJBcmlhbCAxNSIpCmludi5ncmlkKHJvdz0wKQoKIy9BcHBlYXJlbmNlCgp4eSA9IFsoOTAsNDAwKSwoMTEwLDQwMCksKDExMCw0MjApLCgxMzAsNDIwKSwoMTMwLDQ0MCksKDExMCw0NDApLCgxMTAsNDYwKSwKKDEzMCw0NjApLCgxMzAsNDgwKSwoNzAsNTgwKSwoNzAsNDYwKSwoOTAsNDYwKSwoOTAsNDQwKSwKKDcwLDQ0MCksKDcwLDQyMCksKDkwLDQyMCldCmNhciA9IGNhbi5jcmVhdGVfcG9seWdvbih4eSxmaWxsPSJyZWQiLG91dGxpbmU9ImJsYWNrIikKY2FyX3BsYWNlID0gY2FuLmNvb3JkcyhjYXIpCgoKY2xhc3MgSGVybygpOgoKICAgIGRlZiBfX2luaXRfXyAoc2VsZik6CiAgICAgICAgc2VsZi5wb2ludHMgPSAwCiAgICAgICAgc2VsZi5jYXJfc2hvb3RfbnVtYmVyID0gMQogICAgICAgIHNlbGYuaGVyb19saWZlcyA9IDUKCiAgICBkZWYgY2FyX21vdmVfbGVmdChzZWxmLGV2ZW50KToKICAgICAgICBzZWxmLmNhcl9wbGFjZSA9IGNhbi5jb29yZHMoY2FyKQogICAgICAgIGlmIHNlbGYuY2FyX3BsYWNlWzE4XT49MTA6CiAgICAgICAgICAgIHNlbGYuY2FyX3Nob290X251bWJlciAtPSAxCiAgICAgICAgICAgIGNhbi5tb3ZlKGNhciwtNzAsMCkKCgogICAgZGVmIGNhcl9tb3ZlX3JpZ2h0KHNlbGYsZXZlbnQpOgogICAgICAgIHNlbGYuY2FyX3BsYWNlID0gY2FuLmNvb3JkcyhjYXIpCiAgICAgICAgaWYgc2VsZi5jYXJfcGxhY2VbNl08MjAwOgogICAgICAgICAgICBzZWxmLmNhcl9zaG9vdF9udW1iZXIgKz0gMQogICAgICAgICAgICBjYW4ubW92ZShjYXIsNzAsMCkKCmNsYXNzIEVuZW15KEhlcm8pOgogICAgZGVmIGNyZWF0ZV9yb2NrKHNlbGYpOgogICAgICAgIHNlbGYucm9ja3R5cGUgPSByYW5kb20ucmFuZGludCgwLDIpCiAgICAgICAgaWYgc2VsZi5yb2NrdHlwZSA9PSAwOgogICAgICAgICAgICBzZWxmLnJvY2sgPSBjYW4uY3JlYXRlX3JlY3RhbmdsZSgzMCwxMCw1MCwzMCxmaWxsPSJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZT0iZ3JlZW4iKQoKICAgICAgICBlbGlmIHNlbGYucm9ja3R5cGUgPT0gMToKICAgICAgICAgICAgc2VsZi5yb2NrID0gY2FuLmNyZWF0ZV9yZWN0YW5nbGUoOTAsMTAsMTEwLDMwLGZpbGw9ImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lPSJncmVlbiIpCgogICAgICAgIGVsaWYgc2VsZi5yb2NrdHlwZSA9PSAyOgogICAgICAgICAgICBzZWxmLnJvY2sgPSBjYW4uY3JlYXRlX3JlY3RhbmdsZSgxNTAsMTAsMTcwLDMwLGZpbGw9ImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lPSJkYXJrZ3JlZW4iKQogICAgICAgIGVsc2U6IHByaW50KCJpdCBjYW50IGJlIikKCiAgICBkZWYgZGVsZXRlX3JvY2soc2VsZik6CiAgICAgICAgY2FuLmRlbGV0ZShzZWxmLnJvY2spCgoKICAgIGRlZiBlbmRnYW1lKHNlbGYpOgogICAgICAgIHJvb3QuZGVzdHJveSgpCiAgICAgICAgc2VsZi5yb290ID0gVGsoKQogICAgICAgIHNlbGYuZW5kc2lnaHQgPSBMYWJlbChzZWxmLnJvb3QsIHRleHQgPSAiR2FtZSBJcyBPdmVyXG4gWW91ciBTY29yZToiLCBmb250PSJBcmlhbCAyMCIpCiAgICAgICAgc2VsZi5lbmRzaWdodDEgPSBMYWJlbChzZWxmLnJvb3QsdGV4dCA9IGhlcm8ucG9pbnRzLCBmb250PSJBcmlhbCAyMCIpCiAgICAgICAgc2VsZi5lbmRzaWdodDEucGFjayhzaWRlPSJib3R0b20iKQogICAgICAgIHNlbGYuZW5kc2lnaHQucGFjayhzaWRlPSJ0b3AiKQogICAgICAgIHNlbGYucm9vdC5tYWlubG9vcCgpCgogICAgZGVmIGVuZW15bW92ZShzZWxmKToKICAgICAgICBjYW4ubW92ZShzZWxmLnJvY2ssMCwyMCkKICAgICAgICBjYW4uYWZ0ZXIoMzAsc2VsZi5lbmVteW1vdmUpCiAgICAgICAgc2VsZi5yb2NrX3BsYWNlID0gY2FuLmNvb3JkcyhzZWxmLnJvY2spCiAgICAgICAgaWYgc2VsZi5yb2NrX3BsYWNlWzFdPT00MTAgYW5kIGhlcm8uY2FyX3Nob290X251bWJlciA9PSBzZWxmLnJvY2t0eXBlOgogICAgICAgICAgICBzZWxmLmRlbGV0ZV9yb2NrKCkKICAgICAgICAgICAgZW5lbXkuY3JlYXRlX3JvY2soKQogICAgICAgICAgICBoZXJvLmhlcm9fbGlmZXMgLT0gMQogICAgICAgICAgICAjcHJpbnQoaGVyby5oZXJvX2xpZmVzKQogICAgICAgIGVsaWYgc2VsZi5yb2NrX3BsYWNlWzFdPjQ3MDoKICAgICAgICAgICAgaGVyby5oZXJvX2xpZmVzIC09IDEKICAgICAgICAgICAjIHByaW50KGhlcm8uaGVyb19saWZlcykKICAgICAgICAgICAgc2VsZi5kZWxldGVfcm9jaygpCiAgICAgICAgICAgIGVuZW15LmNyZWF0ZV9yb2NrKCkKICAgICAgICBpZiBoZXJvLmhlcm9fbGlmZXMgPT0gMDoKICAgICAgICAgICAgICAgIHNlbGYuZW5kZ2FtZSgpCgoKICAgIGRlZiBzaG9vdGVtKHNlbGYsZXZlbnQpOgogICAgICAgIGlmIGhlcm8uY2FyX3Nob290X251bWJlciA9PSBzZWxmLnJvY2t0eXBlOgogICAgICAgICAgICBoZXJvLnBvaW50cyArPSAxCiAgICAgICAgICAgIHBvaW4uYWRkdGV4dChoZXJvLnBvaW50cykKICAgICAgICAgICAgI3ByaW50KHNlbGYucG9pbnRzKQogICAgICAgICAgICBjYW4uZGVsZXRlKHNlbGYucm9jaykKICAgICAgICAgICAgZW5lbXkuY3JlYXRlX3JvY2soKQoKCmNsYXNzIFBvaW50cygpOgogICAgZGVmIF9faW5pdF9fIChzZWxmKToKICAgICAgICBzZWxmLnBvaW50ID0gVGV4dChmcjEsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEpCiAgICAgICAgc2VsZi5wb2ludC5ncmlkKHJvdz0xKQoKCiAgICBkZWYgYWRkdGV4dChzZWxmLCBwb2ludCk6CiAgICAgICAgI3ByaW50KGVuZW15LnBvaW50cykKICAgICAgICBzZWxmLnBvaW50LmRlbGV0ZSgxLjAsRU5EKQogICAgICAgIHNlbGYucG9pbnQuaW5zZXJ0KEVORCxwb2ludCkKCgpoZXJvPUhlcm8oKQplbmVteSA9IEVuZW15KCkKZW5lbXkuY3JlYXRlX3JvY2soKQplbmVteS5lbmVteW1vdmUoKQpwb2luID0gUG9pbnRzKCkKCnJvb3QuYmluZCgiPHNwYWNlPiIsZW5lbXkuc2hvb3RlbSkKcm9vdC5iaW5kKCI8TGVmdD4iLGhlcm8uY2FyX21vdmVfbGVmdCkKcm9vdC5iaW5kKCI8UmlnaHQ+IixoZXJvLmNhcl9tb3ZlX3JpZ2h0KQoKbWFpbmxvb3AoKQ==