ecs #58
275
src/scenes/basic_game.py
Normal file
275
src/scenes/basic_game.py
Normal file
|
@ -0,0 +1,275 @@
|
|||
"""
|
||||
Définit 3 scènes de jeu basique
|
||||
"""
|
||||
|
||||
from enum import Enum
|
||||
import random
|
||||
import pygame
|
||||
from engine import CurrentScene, Scene, Plugin
|
||||
from engine.ecs import World
|
||||
from engine.math import Vec2
|
||||
from plugins import assets
|
||||
from plugins import render
|
||||
from plugins import writing
|
||||
from plugins.assets import Assets
|
||||
from plugins.hover import HoveredTexture
|
||||
from plugins.inputs import Pressed
|
||||
from plugins.render import Sprite
|
||||
from plugins.text import Text
|
||||
from plugins.writing import Writing
|
||||
from plugins.click import Clickable
|
||||
from scenes import menu
|
||||
|
||||
|
||||
class GameMode(Enum):
|
||||
"""
|
||||
Definit un ressource represantant le mode de jeu actuel.
|
||||
"""
|
||||
|
||||
CLASSIC = 0
|
||||
LIAR = 1
|
||||
CHEATER = 2
|
||||
|
||||
|
||||
class RemainingAttempts(int):
|
||||
"""
|
||||
Definit une ressources qui represente le nombre d'essais restants du joueur
|
||||
"""
|
||||
|
||||
|
||||
class Attempts:
|
||||
"""
|
||||
Definit un composant qui representes le texte du nombre d'essai
|
||||
"""
|
||||
|
||||
|
||||
class Response:
|
||||
"""
|
||||
Definit un composant qui representes le texte de reponse
|
||||
"""
|
||||
|
||||
|
||||
class Number(int):
|
||||
""" "
|
||||
Definit une ressource contenant le nombre a trouver
|
||||
"""
|
||||
|
||||
|
||||
class IsRunning:
|
||||
"""
|
||||
Ressource qui defint si le jeux est en cour ou non
|
||||
"""
|
||||
|
||||
|
||||
class PlayAgain:
|
||||
"""
|
||||
Definit un composant qui identifie le bouton Valider/PlayAgain
|
||||
"""
|
||||
|
||||
|
||||
def __initialize_world(world: World):
|
||||
world.set(Number(random.randint(0, 99)))
|
||||
world.set(IsRunning())
|
||||
print(world[Number])
|
||||
|
||||
world.new_entity().set(Sprite(world[Assets].get_texture("background")))
|
||||
world.new_entity().set(
|
||||
Sprite(world[Assets].get_texture("arrow"), Vec2(150), 0),
|
||||
HoveredTexture(
|
||||
world[Assets].get_texture("arrow"), world[Assets].get_texture("arrow_hover")
|
||||
),
|
||||
Clickable(lambda world, entity: world.set(CurrentScene(menu.SCENE))),
|
||||
)
|
||||
world.new_entity().set(
|
||||
Sprite(
|
||||
world[Assets].get_texture("valider"),
|
||||
Vec2(render.WIDTH / 2, 850),
|
||||
0,
|
||||
origin=Vec2(0.5),
|
||||
),
|
||||
HoveredTexture(
|
||||
world[Assets].get_texture("valider"),
|
||||
world[Assets].get_texture("valider_hover"),
|
||||
),
|
||||
Clickable(lambda world, entity: __update(world)),
|
||||
PlayAgain(),
|
||||
)
|
||||
|
||||
match world[GameMode]:
|
||||
case GameMode.CLASSIC:
|
||||
world.set(RemainingAttempts(7))
|
||||
text_color = pygame.Color(64, 37, 146)
|
||||
case GameMode.LIAR:
|
||||
world.set(RemainingAttempts(15))
|
||||
text_color = pygame.Color(57, 160, 0)
|
||||
case GameMode.CHEATER:
|
||||
world.set(RemainingAttempts(10))
|
||||
text_color = pygame.Color(133, 51, 25)
|
||||
|
||||
match world[GameMode]:
|
||||
case GameMode.CLASSIC:
|
||||
world.set(RemainingAttempts(7))
|
||||
case GameMode.LIAR:
|
||||
world.set(RemainingAttempts(15))
|
||||
case GameMode.CHEATER:
|
||||
world.set(RemainingAttempts(10))
|
||||
|
||||
world.new_entity().set(
|
||||
Text(
|
||||
f"Il reste : {world[RemainingAttempts]} essais",
|
||||
100,
|
||||
text_color,
|
||||
Vec2(650, 150),
|
||||
),
|
||||
Attempts(),
|
||||
)
|
||||
|
||||
world.new_entity().set(
|
||||
Text(
|
||||
"Devines le nombre !",
|
||||
150,
|
||||
text_color,
|
||||
Vec2(render.WIDTH / 2, 450),
|
||||
Vec2(0.5),
|
||||
),
|
||||
Response(),
|
||||
)
|
||||
|
||||
world.new_entity().set(
|
||||
Text(
|
||||
"",
|
||||
150,
|
||||
text_color,
|
||||
Vec2(render.WIDTH / 2, 650),
|
||||
Vec2(0.5),
|
||||
),
|
||||
Writing("0123456789", 2),
|
||||
)
|
||||
|
||||
|
||||
def __update(world: World):
|
||||
# Gestion du pluriel pour le nombre d'essais restants
|
||||
pluriel = "s"
|
||||
if int(world[RemainingAttempts]) == 2:
|
||||
pluriel: str = ""
|
||||
else:
|
||||
pluriel = "s"
|
||||
lying = False
|
||||
if world[GameMode] == GameMode.LIAR:
|
||||
lie = random.randint(1, 4)
|
||||
if lie == 4:
|
||||
lying = True
|
||||
else:
|
||||
lying = False
|
||||
|
||||
print(lying)
|
||||
|
||||
# Si le jeu est fini
|
||||
if IsRunning not in world:
|
||||
# On relance la scene/jeu
|
||||
match world[GameMode]:
|
||||
case GameMode.CLASSIC:
|
||||
world.set(CurrentScene(CLASSIC))
|
||||
case GameMode.LIAR:
|
||||
world.set(CurrentScene(LIAR))
|
||||
case GameMode.CHEATER:
|
||||
world.set(CurrentScene(CHEATER))
|
||||
|
||||
for entity in world.query(Text, Writing):
|
||||
if entity[Text].text != "":
|
||||
if int(entity[Text].text) == world[Number]:
|
||||
for response in world.query(Text, Response):
|
||||
response[Text].text = "Gagné !"
|
||||
entity[Text].text = ""
|
||||
del world[IsRunning]
|
||||
del entity[Writing]
|
||||
elif int(entity[Text].text) > world[Number]:
|
||||
if world[GameMode] != GameMode.LIAR or not lying:
|
||||
for response in world.query(Text, Response):
|
||||
response[Text].text = "Plus petit"
|
||||
else:
|
||||
for response in world.query(Text, Response):
|
||||
response[Text].text = "Plus grand"
|
||||
|
||||
world[RemainingAttempts] -= 1
|
||||
for attempts in world.query(Text, Attempts):
|
||||
attempts[
|
||||
Text
|
||||
].text = f"Il reste : {world[RemainingAttempts]} essai{pluriel}"
|
||||
entity[Text].text = ""
|
||||
else:
|
||||
if world[GameMode] != GameMode.LIAR or not lying:
|
||||
for response in world.query(Text, Response):
|
||||
response[Text].text = "Plus grand"
|
||||
else:
|
||||
for response in world.query(Text, Response):
|
||||
response[Text].text = "Plus petit"
|
||||
|
||||
world[RemainingAttempts] -= 1
|
||||
for attempts in world.query(Text, Attempts):
|
||||
attempts[
|
||||
Text
|
||||
].text = f"Il reste : {world[RemainingAttempts]} essai{pluriel}"
|
||||
entity[Text].text = ""
|
||||
else:
|
||||
for response in world.query(Text, Response):
|
||||
response[Text].text = "Veuillez entrer un nombre."
|
||||
|
||||
if world[RemainingAttempts] == 0:
|
||||
for response in world.query(Text, Response):
|
||||
response[Text].text = "Perdu !"
|
||||
entity[Text].text = f"Le nombre etait {world[Number]}"
|
||||
for play_again in world.query(PlayAgain):
|
||||
play_again[Sprite].texture = world[Assets].get_texture("play_again")
|
||||
play_again[HoveredTexture].normal = world[Assets].get_texture(
|
||||
"play_again"
|
||||
)
|
||||
play_again[HoveredTexture].hovered = world[Assets].get_texture(
|
||||
"play_again_hover"
|
||||
)
|
||||
|
||||
del entity[Writing]
|
||||
del world[IsRunning]
|
||||
|
||||
if world[GameMode] == GameMode.CHEATER:
|
||||
world[Number] += random.randint(-3, 3)
|
||||
|
||||
|
||||
__SCENE = (
|
||||
Scene(
|
||||
[__initialize_world],
|
||||
[__detect_keys],
|
||||
[],
|
||||
)
|
||||
+ writing.PLUGIN
|
||||
)
|
||||
|
||||
CLASSIC = assets.loading_scene(
|
||||
Plugin(
|
||||
[lambda world: world.set(GameMode.CLASSIC)],
|
||||
[],
|
||||
[],
|
||||
)
|
||||
+ __SCENE,
|
||||
"base_game/classic",
|
||||
)
|
||||
|
||||
LIAR = assets.loading_scene(
|
||||
Plugin(
|
||||
[lambda world: world.set(GameMode.LIAR)],
|
||||
[],
|
||||
[],
|
||||
)
|
||||
+ __SCENE,
|
||||
"base_game/liar",
|
||||
)
|
||||
|
||||
CHEATER = assets.loading_scene(
|
||||
Plugin(
|
||||
[lambda world: world.set(GameMode.CHEATER)],
|
||||
[],
|
||||
[],
|
||||
)
|
||||
+ __SCENE,
|
||||
"base_game/cheater",
|
||||
)
|
Loading…
Reference in a new issue