splash.py

Created by schraf

Created on February 02, 2024

1.93 KB

Tuto détaillé sur la création de ce jeu (utile si vous suivez la filière NSI au lycée)

But

Obtenir le plus grand territoire possible en lançant de la peinture.

Comment jouer ?

  • A la ligne n°79 il y a un 0 après le -100, cela signifie qu’il s’agit d’un joueur humain
  • A la ligne n°80 il y a un 1 après le 100, cela signifie que c’est la calculatrice qui joue.

Donc mettez des 0 ou des 1 pour avoir 2 joueurs humains ou pour que la calculatrice joue toute seule.

Les touches sont les flèches gauche et droite et pour lancer la peinture, restez appuyé plus ou moins longtemps sur la flèche vers le bas (Flèche vers le haut pour le 2e joueur humain) pour définir la distance du jet.


from turtle import *
from time import *
from ion import *
from random import randint
from kandinsky import fill_rect, get_pixel, draw_string
from math import sqrt

def pause(a):
 setheading(a)
 sleep(0.02)

def dist(rvb1, rvb2):
 (r1, v1, b1), (r2, v2, b2) = rvb1, rvb2
 return sqrt((r1 - r2) ** 2 + (v1 - v2) ** 2 + (b1 - b2) ** 2)

def score(*joueurs):
 hideturtle()
 for c in range(320):
  for l in range(222):
   v = get_pixel(c, l)
   if v != BL:
    for j in joueurs:
     d = dist(v, j.rvb)
     if d < 100: j.score += 1 / (1 + d)
 total = sum(j.score for j in joueurs)
 for j in joueurs:
  draw_string("{0:.2f}".format(100 * j.score / total), 140, 100 - j.pos, BL, j.coul)

class joueur:
 def __init__(self, coul, pos, ia, mi, ma, jet, gau, drte):
  self.coul = coul
  self.pos = pos
  self.ia = ia
  self.dep = (mi + ma) / 2
  self.mi = mi
  self.ma = ma
  self.jet = jet
  self.gau = gau
  self.drte = drte
  self.score = 0  
  if pos > 0:
   fill_rect(0, 0, 320, 5, coul)
   self.rvb = get_pixel(0, 0)
  else:
   fill_rect(0, 217, 320, 5, coul)
   self.rvb = get_pixel(0, 217)

 def tour(self):
  hideturtle()
  color("black")
  penup()
  goto(0, self.pos)
  setheading(self.dep)
  showturtle()
  if self.ia:
   t = monotonic()
   a = self.dep
   while monotonic() - t < 0.4:
    a = max(self.mi, min(self.ma, a + randint(-10, 10)))
    pause(a)
   d = randint(1, 200)
  else:
   a = self.dep 
   while not keydown(self.jet):
    if keydown(self.gau):
     a = min(self.ma, a + 5)
     pause(a)
    elif keydown(self.drte):
     a = max(self.mi, a - 5)
     pause(a)
   d = 0
   while keydown(self.jet): d += 0.2
  fd(d)
  color(self.coul)
  pendown()
  pensize(randint(20, 80))
  for _ in range(6): goto(position())

j1 = joueur("purple", -100, 0, 0, 180, KEY_DOWN, KEY_LEFT, KEY_RIGHT)
j2 = joueur("orange", 100, 1, -180, 0, KEY_UP, KEY_RIGHT, KEY_LEFT)

BL = get_pixel(10, 10)
turn = 0

while turn < 10:
 j1.tour()
 j2.tour()
 turn += 1

score(j1, j2)