the_snake.py

Created by antarctus

Created on February 02, 2021

4.84 KB

Petit jeu du serpent (snake en anglais). Se lance avec la fonction start(). Une version (très) amélioré existe avec “The_snake_game.py”. Mon discord: ANTARCTUS#8195


from random import randint
from kandinsky import color,draw_string,fill_rect
from ion import *
from time import *

s=None

#125 30/09
#84 11/10
#81 18/09

#94 13/10 Thibault

def dur(t):
  if t<0:
    t=0
  return t

class Snake:
  def __init__(self,couleur=(0,255,0)):
    self.x=randint(0,10)
    self.y=10
    self.couleur=couleur
    self.orientation=(1,0)
    self.queue=[(-1,-1)]
    self.mort=False
    self.raison="Je ne sait pas pourquoi!!"
    self.pas=0

  def orienter(self):
    ex_orientation=self.orientation
    for i in range(4):
      if keydown(i):
        self.orientation=((-1,0),(0,-1),(0,1),(1,0))[i]
    if self.orientation==(-ex_orientation[0],-ex_orientation[1]):
      self.orientation=ex_orientation

  def bouger(self):
    self.pas+=1
    if len(self.queue)>1:
      i=len(self.queue)
      while i>0:
        self.queue[i-1]=self.queue[i-2]
        i+=-1
    self.queue[0]=(self.x,self.y)
    self.x+=self.orientation[0]
    self.y+=self.orientation[1]
    if not 0<self.x<32 or not 0<self.y<22:
      self.raison="Tu a touche un mur."
      self.mort=True
    for p in pommes:
      if self.x==p.x and self.y==p.y:
        p.bouffer(self)
    if (self.x,self.y) in self.queue:
      self.raison="Tu t'est recoupe."
      self.mort=True


  def draw(self):
    last=self.queue[-1]
    if type(self.couleur)==type([2,3]):
      fill_rect(self.x*10,self.y*10,10,10,self.couleur[self.pas%len(self.couleur)])
    else:
      fill_rect(self.x*10,self.y*10,10,10,self.couleur)
    fill_rect(last[0]*10,last[1]*10,10,10,couleur_fond)
    for p in pommes:      
      if p.x==last[0] and p.y==last[1]:
        p.draw()

  def draw_all(self):
    if type(self.couleur)==type([2,3]):
      for i in self.queue:
        fill_rect(i[0]*10,i[1]*10,10,10,self.couleur[0])
    else:
      for i in self.queue:
        fill_rect(i[0]*10,i[1]*10,10,10,self.couleur)
    self.draw()

  def pv(self,n):
    if n>0:
      try:
        for i in range(n):
          self.queue.append((-1,-1))
      except:
        pass
    if n<0:
      for i in range(-n):
        if not len(self.queue)<=1:
          fill_rect(self.queue[-1][0]*10,self.queue[-1][1]*10,10,10,couleur_fond)
          del self.queue[-1]
    draw_string("Score:"+str(len(self.queue))+" ",10,10)


class Pomme:
  def __init__(self,couleur=(255,0,0),pv=1,clonage=1,autres=[],tp=1):
    self.couleur=couleur
    self.pv=pv
    self.clonage=clonage
    self.autres=autres
    self.tp=tp
    self.novCoord()
    try:
      pommes.append(self)
    except:
      pass

  def bouffer(self,serpent):
    global pommes
    if self.pv==-1000:
      serpent.mort=True
      serpent.raison="Vous avez mangee \n\tune pomme pourrie."
      return
    serpent.pv(self.pv)
    if self.tp!=1:
      serpent.x+=serpent.orientation[0]*self.tp
      serpent.y+=serpent.orientation[1]*self.tp
      fill_rect(self.x*10,self.y*10,10,10,(255,255,255))
    for i in range(self.clonage):
      Pomme(self.couleur,self.pv,self.clonage,self.autres,self.tp)
      pommes[-1].draw()
    for i in self.autres:
      for j in range(i[0]):
        Pomme(i[1],i[2],i[3])
        pommes[-1].draw()

    pommes.remove(self)
    del self
    return

  def novCoord(self):
    x=2+randint(0,28)
    y=2+randint(0,18)
    for i in pommes:
      if (x,y)==(i.x,i.y):
        self.novCoord()
        return
    self.x=x
    self.y=y

  def draw(self):
    fill_rect(self.x*10,self.y*10,10,10,self.couleur)

def draw_all():
  global s
  fill_rect(0,0,320,222,couleur_fond) 
  s.draw_all()
  for p in pommes:
    p.draw()
  draw_string("Score:"+str(len(s.queue))+" ",10,10)

def commencer(m=((1,(255,0,0),1,1),),c=(0,255,0)):
  global s
  s=Snake(c)
  mode_pomme(m)

  draw_all()

def perdre(serpent):
  score=len(serpent.queue)
  draw_string("Perdu!!",100,70)
  draw_string(serpent.raison,60,100)
  draw_string("Score:"+str(score),80,140)
  print("Score:"+str(score))
  return(score)

couleur_fond=(255,255,255)

pommes=[]

fps=1
vitesse=1/fps

def mode_pomme(quoi):
  global pommes
  pommes=[]
  for type in quoi:
    if len(type)==4:
      for n in range(type[0]):
        Pomme(couleur=type[1],pv=type[2],clonage=type[3])
    if len(type)==5:
      for n in range(type[0]):
        Pomme(couleur=type[1],pv=type[2],clonage=type[3],autres=type[4])
    if len(type)==6:
      for n in range(type[0]):
        Pomme(couleur=type[1],pv=type[2],clonage=type[3],autres=type[4],tp=type[5])
    
def boucler(vitesse=vitesse):
  while True:
    t=monotonic()
    s.orienter()
    s.bouger()
    s.draw()
    if s.mort:
      return(perdre(s))
      break
    if keydown(KEY_ONOFF):
      fill_rect(0,0,320,222,(0,0,0))
      sleep(0.25)
      while not keydown(KEY_ONOFF):
        sleep(0.1)
      draw_all()
      sleep(0.25)  
    sleep(dur(t-monotonic()+vitesse))

def start():
  commencer()
  boucler()
  draw_string("Ressuciter: touche <=",80,160)
  while not keydown(KEY_BACKSPACE):
    sleep(0.05)
  start()