# Edited by: Wilson. from kandinsky import * from kandinsky import fill_rect as F from kandinsky import draw_string as STR from ion import * from time import * from random import * from random import randint as R def draw_ground(): bg=(0,0,0) gx=300 gy=5 gw=5 gh=5 for i in range(0,322,5): for j in range(210,222): gc=choice([(150,0,0),(100,0,0),(250,0,0)]) i+=randint(0,1) j+=randint(-4,2) F(i,j,gw,gh,gc) F(i+gw,j,2,gh,bg) F(i,j-2,gw,2,bg) sleep(0.2) def draw_home_screen(): clone_x=R(10,35) clone_y=170 bg=(45,5,79) F(0,0,322,222,bg) while not keydown(KEY_OK) and not keydown(KEY_EXE): F(0,25,322,2,"cyan") F(0,55,322,2,"cyan") F(10,200,300,10,"gray") F(280,192,22,8,"cyan") F(0,210,322,25,"red") F(clone_x,clone_y,14,26,(0,120,0)) F(clone_x+5,clone_y+5,12,8,"cyan") STR("Chute 2.0",100,34,"black","cyan") STR("keys [left]/[Right] = Move",25,70,"white",bg) STR("key [Backspace] = Jump",30,90,"yellow",bg) STR("key [Toolbox] = Shoot",40,110,"gray",bg) STR("key [VAR] = Pause",60,130,"cyan",bg) STR("(Press [OK] to Start)",90,160,(R(200,255),0,0),bg) def print_intro(): text=[ "In a peaceful planet, chaos", "erupted! Visitors from unknown", "origin and unknown species", "appeared on a quiet morning.", "They took over all resources.", "HELP!! Who will save us??!" ] F(0,0,322,222,"white") sleep(0.7) STR(text[0],10,30,"blue") sleep(0.7) STR(text[1],10,50,"blue") sleep(0.7) STR(text[2],10,70,"blue") sleep(0.7) STR(text[3],10,90,"blue") sleep(0.7) STR(text[4],10,110,"blue") sleep(0.7) STR(text[5],10,130,"blue") sleep(0.5) while not keydown(KEY_OK) and not keydown(KEY_EXE): STR("Press [OK] to Start",50,180) draw_home_screen() sleep(0.2) print_intro() time=9 time_2=1 lives=3 score=0 energy=30 sh_on=False sh_time=5 sh_x=R(2,310) sh_y=R(-20,0) sh_w=16 sh_h=16 sh_c=(R(0,255),R(0,255),R(0,255)) f_x=R(2,315) f_y=R(-100,-50) f_w=11 f_h=18 f_c=(R(0,255),R(0,255),R(0,255)) lava_y=210 #dark red lava_c=(150,0,0) rect_x=300 rect_y=R(20,60) rect_w=R(20,50) rect_h=R(10,30) rect_c=(R(0,255),R(0,255),R(0,255)) #background backColor=choice([ "black","pink", (randint(0,105),R(0,105),randint(0,255)) ]) def game_over_draw(): F(0,0,322,222,"black") for x in range(0,322,14): for y in range(0,222,18): sleep(0.0025) F(x,y,13,17,choice(["grey","white",(150,140,135),(201,205,200)])) F(0,70,322,110,"black") while not keydown(KEY_OK): STR("GAME OVER",100,100,"white","black") STR("SCORE: "+str(round(score)),100,130,"cyan","black") F(0,0,322,222,"black") #platforms to jump on plateforms_color=(randint(0,255),randint(0,255),randint(0,255)) shoot_color=(randint(150,255),randint(150,255),randint(150,255)) trainee=False level=0 class Entity(): def __init__(self,x,y,width,height,speed,ma=True): self.x=x self.y=y self.width=width self.height=height self.speed=speed self.move_alone=ma self.chute=0 self.gx=self.x+int(self.width/2) self.gy=self.y+self.height self.dead=False self.drawing=[] self.shooting=None def set_drawing_inverse(self): self.drawing_inverse=[None,]*len(self.drawing) for i in range(len(self.drawing)): j=self.drawing[i] self.drawing_inverse[i]=[self.width-j[0]-j[2],j[1],j[2],j[3],j[4]] def contact(self,x1,y1,x2,y2): if self.x<=x1<=self.x+self.width or self.x<=x2<=self.x+self.width: if self.y<=y1<=self.y+self.height or self.y<=y2<=self.y+self.height: return True return False def step(self): x=self.x y=self.y self.move() if self.x!=x or self.y!=y or len(shoot): F(x,y,20,30,backColor) self.draw() if is_shooting: draw_shoot((0,)*3) #assign global variables.. def move(self): global level,energy,lives if is_shooting: draw_shoot(backColor) if self.chute: if self.chute>0: if self.tomber(): self.y+=self.chute self.chute+=1 else: self.y=plateforms[self.get_plateform()][1]-self.height #player dies if self.y+self.height>lava_y+4 or time_2<=0: self.dead=True lives-=1 #6 spaces for this else else: self.y+=self.chute self.chute+=1 if self.move_alone: self.x+=self.speed if self.tomber(): self.speed*=-1 self.x+=self.speed else: x=(keydown(3)-keydown(0)) if x: self.speed=abs(self.speed)*x self.x+=self.speed # Jump if keydown(KEY_BACKSPACE) and not self.tomber(): self.y=plateforms[self.get_plateform()][1]-self.height # and height of jump.. self.chute=-10 if (not self.tomber()): if self.contact(points[1][0],points[1][1],points[1][0]+20,points[0][1]+5): level+=1 self.dead=True if self.tomber() and self.chute==0: self.chute=1 def tomber(self): self.gx=self.x+int(self.width/2) self.gy=self.y+self.height for i in plateforms: if self.gy<=i[1]<=self.gy+self.chute: if i[0]<=self.gx<=i[0]+i[2]: return False return True def get_plateform(self): if not self.tomber(): for i in plateforms: if self.gy<=i[1]<=self.gy+self.chute: if i[0]<=self.gx<=i[0]+i[2]: return plateforms.index(i) def draw(self): if self.speed<=0: for i in self.drawing: F(self.x+i[0],self.y+i[1],i[2],i[3],i[4]) else: for i in self.drawing_inverse: F(self.x+i[0],self.y+i[1],i[2],i[3],i[4]) #Plateforms def draw_all_plateforms(color): for i in plateforms: F(i[0],i[1],i[2],i[3],color) #Entites def draw_all_entities(): for i in entities: i.move() i.draw() #Shoot is_shooting=None shooting_direction=1 shoot=[] shooting_list=[] for i in range(20): shooting_list+=[[int((15**2-(i-10)**2)**0.5),i-10],] def get_shoot(e,shooting): return [e.gx,e.y+8+10, shooting_list[shooting][0]*((e.speed>0)*2-1), shooting_list[shooting][1],0] #shoot aim moves in curve.. def draw_shoot(color): shoot_color="cyan" c=get_shoot(avatar,is_shooting) F(c[0]+c[2]*2-5,c[1]+c[3]*2-2,9,9,color) #Screen when died or when complete level def new_area_screen(): F(0,0,322,222,"black") while not keydown(KEY_OK): STR("Life: "+str(round(lives)),60,60,"gray","black") STR("Press [OK] to conitue",70,120,"white","black") #player loss 1 chance (life) def death_animation(): F(0,0,322,222,"black") for x in range(0,322,16): for y in range(0,222,5): sleep(0.0006) F(x,y,15,4,choice(["white","black"])) F(0,70,322,110,"black") while not keydown(KEY_OK): STR("Life: "+str(round(lives)),100,90,"cyan","black") STR("Press [OK] to conitue",70,120,"black","cyan") # portals on left and right # 2 teleport stations points=[] def draw_all_points(): #start F(points[0][0],points[0][1]-5,20,5,"cyan") #goal F(points[1][0],points[1][1]-5,20,5,(R(0,50),R(200,250),R(200,250))) maps=[ #[spawn/end,monsters,plateforms(,txt)] [ #[x,y] coordinate of: #platform and portal. [[10,200],[280,200]], [], [ #[x,y,w,h] values of: plateforms [0,200,322,10], ], ],[ [[10,200],[10,100]], [], [ [10,200,100,10], [140,200,100,10], [170,150,100,10], [10,100,100,10], ], ], [ [[10,160],[280,80]], [[100,100,20,30,5],], [ [10,160,50,10], [100,130,100,10], [200,80,100,10], ], ], [ [[0,120],[280,80]], [ [130,100,20,30,5], [160,100,20,30,5], [190,100,20,30,5], ],[ [0,120,50,10], [100,130,140,10], [200,80,100,10], ], ], [[[10, 190], [270, 90]], [[180, 100, 20, 30, 5]], [[10, 190, 130, 10], [140, 140, 100, 10], [240, 90, 50, 10]]], [[[10, 170], [270, 170]], [[90, 140, 20, 30, 5]], [[10, 170, 100, 10], [170, 170, 120, 10]]], [[[20, 40], [270, 200]], [[270, 100, 20, 30, 5], [100, 80, 20, 30, 5], [180, 130, 20, 30, 5], [160, 10, 20, 30, 5], [50, 50, 20, 30, 5], [230, 170, 20, 30, 5]], [[220, 200, 70, 10], [220, 130, 70, 10], [160, 160, 60, 10], [90, 110, 40, 10], [140, 40, 60, 10], [40, 80, 40, 10], [20, 40, 50, 10]]], [[[120, 200], [290, 50]], [[190, 120, 20, 30, 5], [110, 120, 20, 30, 5], [100, 70, 20, 30, 5], [200, 70, 20, 30, 5], [150, 70, 20, 30, 5], [80, 20, 20, 30, 5], [120, 20, 20, 30, 5], [180, 20, 20, 30, 5], [220, 20, 20, 30, 5]], [[100, 150, 120, 10], [90, 100, 140, 10], [70, 50, 180, 10], [120, 200, 80, 10], [280, 50, 30, 10]]], [[[40, 130], [240, 130]], [[70, 0, 20, 30, 5], [90, 10, 20, 30, 5], [110, 20, 20, 30, 5], [130, 30, 20, 30, 5], [150, 40, 20, 30, 5], [170, 50, 20, 30, 5], [190, 60, 20, 30, 5], [210, 70, 20, 30, 5], [230, 80, 20, 30, 5]], [[40, 130, 220, 10],]], [[[10, 200], [280, 40]], [[250, 10, 20, 30, 5], [190, 150, 20, 30, 5], [260, 100, 20, 30, 5], [120, 70, 20, 30, 5], [30, 20, 20, 30, 5], [140, -10, 20, 30, 5]], [[240, 40, 60, 10], [10, 200, 80, 10], [180, 180, 50, 10], [240, 130, 70, 10], [100, 100, 70, 10], [2990, 210, 20, 10], [10, 50, 60, 10], [110, 20, 90, 10]]], [[[20, 190], [280, 70]], [[160, 110, 20, 30, 5], [70, 70, 20, 30, 5], [150, 20, 20, 30, 5], [110, 160, 20, 30, 5]], [[20, 190, 270, 10], [140, 140, 70, 10], [50, 100, 60, 10], [130, 50, 60, 10], [230, 70, 70, 10]]], [ [[10,200],[290,200]], [], [ [10,200,300,10], ],"**[ You completed this game! ]**" ] ] def spawn(level): global avatar,entities,plateforms,shoot,points,txt,game F(0,0,320,222,backColor) shoot=[] if level==len(maps): game=False return map=maps[level] points=map[0] plateforms=map[2] avatar=Entity(points[0][0],points[0][1]-30,20,30,10,False) avatar.drawing=[ #player (3,0,17,30,(R(0,100),R(0,100),R(0,100))), (0,3,12,10,"cyan"), ] avatar.set_drawing_inverse() entities=[avatar,] for i in map[1]: enemy_c=choice([ "black",(135,0,0),(0,135,0), (0,0,135),(135,135,135), (65,25,95),(95,25,65), (R(0,255),R(0,255),R(0,255)) ]) #enemy width and height enemy_w=R(11,17) #original height=30 enemy_h=R(25,34) entities+=[Entity(i[0],i[1],i[2],i[3],i[4]),] entities[-1].drawing=[ #Original width,height=17,30 (3,0,enemy_w,enemy_h,enemy_c), #enemy mask (0,3,12,10,choice(["white", "cyan","black","green", (120,0,0),(36,25,32), (R(0,255),R(0,255),R(0,255)) ])), ] entities[-1].set_drawing_inverse() if len(map)==4: STR(map[3],20,20,(150,)*3,backColor) avatar.draw() spawn(level) time_start=monotonic() game=True while game: if avatar.dead: death_animation() spawn(level) rect_x=R(400,700) draw_ground() for i in range(len(entities)-1,0,-1): for j in range(len(shoot)-1,-1,-1): if entities[i].contact(shoot[j][0]-5,shoot[j][1]-5,shoot[j][0]+5,shoot[j][1]+5): F(entities[i].x,entities[i].y,20,30,backColor) F(shoot[j][0]-5,shoot[j][1]-5,10,10,backColor) del entities[i] del shoot[j] break if keydown(KEY_TOOLBOX) or is_shooting!=None: if keydown(KEY_TOOLBOX): if is_shooting==None: is_shooting=1 draw_shoot(backColor) is_shooting+=shooting_direction if is_shooting==len(shooting_list)-1 or is_shooting==0: shooting_direction*=-1 elif is_shooting!=None: shoot+=[get_shoot(avatar,is_shooting),] shoot[-1][0]+=shoot[-1][2] shoot[-1][1]+=shoot[-1][3] draw_shoot(backColor) is_shooting=None for i in entities: i.step() if not trainee: for i in shoot: F(i[0]-5,i[1]-5,10,10,backColor) for i in range(len(shoot)-1,-1,-1): shoot[i][0]+=shoot[i][2] shoot[i][1]+=shoot[i][3] shoot[i][3]+=1 if shoot[i][1]>222: del shoot[i] continue F(shoot[i][0]-5,shoot[i][1]-5,10,10,shoot_color) #player collides into for i in entities[1:]: if i.contact(avatar.x,avatar.y,avatar.x+avatar.width,avatar.y+avatar.height) and sh_on==False: avatar.dead=True #use the dot to access x,y,width,height # Player losses energy fast if avatar.x+avatar.width>rect_x and avatar.x<rect_x+rect_w and avatar.y+avatar.height>rect_y and avatar.y<rect_y+rect_h and sh_on==False: F(avatar.x,avatar.y,avatar.width,avatar.height,"red") energy-=2 avatar.x-=5 #for a few seconds,can jump higher! if avatar.x+avatar.width>f_x and avatar.x<f_x+f_w and avatar.y+avatar.height>f_y and avatar.y<f_y+f_h: F(avatar.x,avatar.y,avatar.width,avatar.height,"pink") F(f_x,f_y,f_w,f_h,backColor) f_y=R(-2000,-1500) f_x=R(2,310) lives+=0.5 score+=R(50,100) if avatar.x+avatar.width>sh_x and avatar.x<sh_x+sh_w and avatar.y+avatar.height>sh_y and avatar.y<sh_y+sh_h: F(avatar.x,avatar.y,avatar.width,avatar.height,"cyan") F(sh_x,sh_y,sh_w,sh_h,backColor) while not keydown(KEY_OK): STR("Press [UP]+[Backspace]",20,50,"black","cyan") STR("to Super Jump!!",20,70,"black","cyan") STR("(Press [OK] to continue)",70,100,"black","yellow") STR(" ",20,50,backColor,backColor) STR(" ",20,70,backColor,backColor) STR(" ",70,100,backColor,backColor) sleep(0.3) time+=1 lives+=0.25 score+=R(200,500) sh_on=True sh_y=R(-3000,-2000) sh_x=R(2,300) sh_c=(R(0,255),R(0,255),R(0,255)) if sh_on: F(avatar.x,avatar.y,2,avatar.height,(R(0,255),R(0,255),R(0,255))) F(avatar.x+avatar.width-2,avatar.y,2,avatar.height,(R(0,255),R(0,255),R(0,255))) F(avatar.x,avatar.y,avatar.width,2,(R(0,255),R(0,255),R(0,255))) F(avatar.x,avatar.y+avatar.height-2,avatar.width,2,(R(0,255),R(0,255),R(0,255))) color=(R(0,255),R(0,255),R(0,255)) sh_time-=0.04 if sh_time<=0: sh_time=5 sh_on=False if energy<=0: lives-=1 energy=25 #Pause/Resume code if keydown(KEY_VAR): while not keydown(KEY_OK): STR("<PAUSED>",120,10,"black","cyan") STR("(PRESS [OK] KEY TO RESUME)",90,40,"white") STR(" ",120,10,backColor,backColor) STR(" ",90,40,backColor,backColor) F(rect_x,rect_y,rect_w,rect_h,rect_c) F(rect_x+rect_w,rect_y,7,rect_h,backColor) #border on rect F(rect_x,rect_y,2,rect_h,"blue") F(rect_x+rect_w-2,rect_y,2,rect_h,"blue") F(rect_x,rect_y,rect_w,2,"blue") F(rect_x,rect_y+rect_h-2,rect_w,2,"blue") # temporary shield F(sh_x,sh_y,sh_w,sh_h,sh_c) F(sh_x,sh_y-4,sh_w,4,backColor) F(sh_x,sh_y,2,sh_h,"white") F(sh_x+sh_w-2,sh_y,2,sh_h,"white") F(sh_x,sh_y,sh_w,2,"white") F(sh_x,sh_y+sh_h-2,sh_w,2,"white") #player outer color if sh_on==False: F(avatar.x,avatar.y,2,avatar.height,"black") F(avatar.x+avatar.width-2,avatar.y,2,avatar.height,"black") F(avatar.x,avatar.y,avatar.width,2,"black") F(avatar.x,avatar.y+avatar.height-2,avatar.width,2,"black") F(f_x,f_y,f_w,f_h,f_c) F(f_x,f_y-3,f_w,3,backColor) F(f_x,f_y,2,f_h,"pink") F(f_x+f_w-2,f_y,2,f_h,"pink") F(f_x,f_y,f_w,2,"pink") F(f_x,f_y+f_h-2,f_w,2,"pink") f_y+=3 if f_y+f_h>=lava_y: # food_y=lava_y-food_h f_y-=2 f_c=(R(100,255),0,0) if f_y>222: f_y=R(-1200,-1000) f_x=R(2,310) rect_x-=7 sh_y+=4 if sh_y+sh_h>=lava_y: # shield_y=lava_y-shield_h sh_y-=1 if sh_y>222: sh_y=R(-1000,-800) sh_x=R(2,300) sh_c=(R(0,255),R(0,255),R(0,255)) #rectangle enemy reaches left side of screen if rect_x+rect_w<0-R(5,10): rect_x=R(400,600) rect_y=R(10,198-rect_h) rect_w=R(10,30) rect_h=R(16,85) rect_c=choice([ (R(0,125),R(0,125),R(0,125)), "red","white","yellow" ]) time-=0.005 if time<=0 or lives<=0.9: game_over_draw() game=False if keydown(KEY_UP) and sh_on: avatar.y-=4 f_x-=R(-4,4) F(f_x-4,f_y,4,f_h,backColor) F(f_x+f_w,f_y,4,f_h,backColor) #player bullet colors are random shoot_color=(R(0,255),R(0,255),R(0,255)) draw_all_points() draw_all_plateforms(plateforms_color) if avatar.x<=0: avatar.x=0 if avatar.x+avatar.width>322: avatar.x=322-avatar.width if avatar.y+avatar.height>=202: avatar.y=202-avatar.height draw_ground() avatar.y-=6 lives-=0.02 F(0,0,60,20,backColor) #this is the speed of game loop. sleep(0.04)