Une version “optimisée” de mon script snake.py, mais qui pourrait être encore plus raccourcie si l’on remplaçait l’indentation de 2 par une indentation de 1, si l’on renommais les variables/fonctions/méthodes en 1 seule caractère, ou encore si l’on utilisait ; pour placer plusieurs lignes en 1.
from kandinsky import * from time import sleep from ion import * from random import randint config={} #try:from snake_config import config #except:pass UP,DOWN,LEFT,RIGHT=0,1,2,3 posx=lambda x:10*x-5 posy=lambda y:10*y-4 class Snake: def __init__(self,config,high_score=0): self.imported_config=config self.high_score=high_score self.init_snk() self.show_score() self.start() def set_config(self): self.x,self.y=16,11 self.init_len=3 self.body=[(self.x,self.y),(self.x,self.y),(self.x,self.y)] self.sleep=0.01 self.decrement=0.0003 self.inc=1 self.direction=UP self.tdirection=UP self.brd_co=(255,0,0) self.bg_co=(255,255,255) self.snk_co=(100,255,100) self.fd_co=(255,100,100) for key, value in self.imported_config.items():setattr(self,key,value) def init_snk(self): self.set_config() self.len=self.init_len self.eat=[] fill_rect(0,0,320,222,self.bg_co) fill_rect(0,0,320,6,self.brd_co) fill_rect(0,0,5,222,self.brd_co) fill_rect(320-5,0,5,222,self.brd_co) fill_rect(0,222-6,320,6,self.brd_co) for _ in range(3):self.spawn_food() self.show_score() def spawn_food(self): while True: x=randint(1,31) y=randint(1,21) if(x,y)not in self.body or(x,y)not in self.eat:break fill_rect(posx(x),posy(y),10,10,self.fd_co) self.eat.append((x,y)) def show_score(self,sx=205,sy=6):draw_string("Score : {:0>2}".format(self.len-self.init_len),sx,sy) def start(self): sub_iter=lambda i1, i2:tuple(v1-v2 for v1,v2 in zip(i1,i2)) while True: if self.len<len(self.body):self.body.pop(0) x,y=self.body[0] x,y=posx(x),posy(y) ddir=sub_iter(self.body[0],self.body[1]) l,h=10,10 if ddir[0]<0:l=self.inc if ddir[0]>0: l=self.inc x+=10-self.inc if ddir[1]<0:h=self.inc if ddir[1]>0: h=10 y+=10-self.inc fill_rect(x,y,l,h,self.bg_co) x,y=posx(self.x),posy(self.y) ddir=sub_iter(self.body[0],self.body[1]) l,h=10,10 if self.direction==RIGHT:l=self.inc if self.direction==LEFT: l=self.inc x+=10-self.inc if self.direction==DOWN:h=self.inc if self.direction==UP: h=self.inc y+=10-self.inc fill_rect(x,y,l,h,self.snk_co) sleep(self.sleep) if keydown(KEY_EXE): while keydown(KEY_EXE):pass while not keydown(KEY_EXE):pass while keydown(KEY_EXE):pass if keydown(KEY_UP)and self.direction!=DOWN:self.tdirection=UP if keydown(KEY_DOWN)and self.direction!=UP:self.tdirection=DOWN if keydown(KEY_RIGHT)and self.direction!=LEFT:self.tdirection=RIGHT if keydown(KEY_LEFT) and self.direction!=RIGHT:self.tdirection=LEFT if self.inc==10: self.inc=0 self.direction=self.tdirection if self.direction==UP:self.y-=1 if self.direction==DOWN:self.y+=1 if self.direction==RIGHT:self.x+=1 if self.direction==LEFT:self.x-=1 self.body.append((self.x,self.y)) if(self.x,self.y)in self.eat: self.len+=1 del self.eat[self.eat.index((self.x,self.y))] self.spawn_food() self.show_score() if self.sleep>self.decrement:self.sleep-=self.decrement elif (self.x,self.y)in self.body[1:-1]or not 0<self.x<32 or not 0<self.y<22: fill_rect(5,6,310,210,self.bg_co) draw_string("Game Over",120,100) draw_string("Press EXE to play again",55,120) draw_string("Press HOME to return home",55,137) self.high_score=max(self.len-self.init_len,self.high_score) draw_string("Highscore : " + str(self.high_score),80,190) self.show_score(120,170) while 1: if keydown(KEY_EXE):break sleep(0.01) self.init_snk() self.inc+=1 Snake(config,high_score=30)