Pieges/game.py

150 lines
5.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
##### Principes généraux du jeu de piege:
# Partie preliminaire:
# Au début de la partie, les joueurs placent les tirettes dans des positions aléatoires.
# Ensuite, chacun à leur tour, ils placent une bille sur la grille, aux endroits où il
# ny a pas de trou. Lorsque toutes les billes sont placées, le jeu peu commencer.
#
# Partie:
# Le jeu se joue au tour par tour. À son tour, un joueur choisit une tirette et
# la déplace dun cran dans le sens quil souhaite dans le but de faire tomber les
# billes des joueurs adverses.
# Le gagnant est le dernier joueur à avoir des billes en jeu.
# structures de données:
# • La position des billes sur la grille
# - liste des billes (tuples x,y)
#
# • La position des tirettes et la position de leurs trous
# - liste des tirettes (avec la tirette 0 en bas à gauche)
# - une tirette est une liste contenant un nombre (la position)
# - liste des cases pour les tirettes (taille 7×7) (O(1))
# - lorsque trou True
# - sinon false False
#
# Il vous faudra ensuite implémenter les fonctions de base du moteur du jeu :
# • Une fonction qui déplace une tirette
# • Une fonction qui met à jour les positions des billes, en faisant tomber les
# billes situées au-dessus de trous
# • Une fonction qui génère aléatoirement une tirette, avec au moins un trou (sinon on ne peut pas gagner !)
# • Une fonction qui permet de placer une bille dun joueur sur la grille (pour la phase préliminaire)
#
# ▬ ▬ ▬ ▬ ▬ ▬ ▬
# ―――――――――――――
# |❍|❍|❍|❍|❍|❍|❍|▬
# |❍|❍|❍|❍|❍|❍|❍|▬
# |❍|❍|❍|❍|❍|❍|❍|▬
# |❍|❍|❍|❍|❍|❍|❍|▬
# |❍|❍|❍|❍|❍|❍|❍|▬
# |❍|❍|❍|❍|❍|❍|❍|▬
# |❍|❍|❍|❍|❍|❍|❍|▬
# ―――――――――――――
# | | | | | | |
# | | | | | | |
# | | | | | | |
# ▬ ▬ ▬ ▬ ▬ ▬ ▬
import random
DIM = 7
VERTICAL = 0
HORIZONTAL = 1
def calcul_coord(x,y):
return y * DIM + x
class Plateau:
def __init__(self):
self.trous = [ [False] * DIM * DIM ] * 2 # Espace 7 × 7, deux fois pour
# vertical et horizontal
self.billes = [] # liste de tuples (x,y)
self.tirettes = [ [None] * DIM ] * 2 # Espace 7 , deux fois pour
# vertical et horizontal
return self
def générer_tirettes():
for orientation in range(2): # vertical et horizontal
for i in range(DIM):
self.tirettes[orientation][i] =
Tirette(i+(orientation*DIM), self)
def est_ce_un_trou(self,x,y):
return self.trous[calcul_coord(x,y)]
def mise_à_jour(self):
for bille in self.billes:
if self.est_ce_un_trou(bille[0], bille[1]):
self.billes.pop(bille)
class Tirette:
def __init__(self, numéro, plateau, orientation=random.randint(0,1), trous=[]):
"""
"""
self.numéro = numéro # définit son placement dans l'espace
self.plateau = plateau # lien vers le plateau de jeu
self.orientation = orientation # 0 pour vertical, 1 pour horizontal
self.trous = [] # liste de trous sous la forme d'un offset
# du point 0 de la tirette (bas ou gauche selon
# orientation)
# Si rien fourni, générer 50% de trous
if len(self.trous) == 0:
for i in range(0,DIM):
tirage = random.random() * 100
if (tirage < 50):
self.trous.append(i)
# position initiale à 0
self.position = 0
return self
def calcul_pos(self, offset):
if self.orientation == VERTICAL:
return calcul_coord(self.numéro, offset - self.position)
else:
return calcul_coord(offset - self.position, self.numéro)
def déplacer(self, nouvelle_position):
"""
"""
# Ancienne position de la tirette
ancienne_position = tirette.position
# Pour chaque trou de la tirette
for trou in self.trous:
# Nettoie l'ancienne position du trou si dans le plateau
if trou - self.position > 0:
self.plateau.trous[self.orientation][calcul_pos(trou)] = False
# Met à jour la position du trou dans l'espace si dans le plateau
if trou - nouvelle_position > 0:
self.plateau.trous[self.orientation][calcul_pos(trou +
(nouvelle_position - ancienne_position))] = True
# Mise à jour de la position de la tirette
tirette.position = nouvelle_position
class Joueur:
def __init__(self, plateau):
self.plateau = plateau
return self
def placer_bille(self, x, y):
if not self.plateau.est_ce_un_trou(x,y):
if not (x,y) in self.plateau.billes:
self.plateau.billes.append((x,y))
return True
return False