Skip to content

Typing speed test + Coin machine + Roulette #113

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 28 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
0c59499
speed typing test first commit + readme
RoxyGrs May 28, 2025
ffdba16
improve UI for better appearance and usability
RoxyGrs May 28, 2025
783a862
submit test with Enter key
RoxyGrs May 28, 2025
2088981
reduce window size to better fit content
RoxyGrs May 28, 2025
fcc9785
modernize interface using ttkbootstrap
RoxyGrs May 28, 2025
fddf864
add real-time timer display during typing
RoxyGrs May 28, 2025
89645c6
add real-time error highlighting for incorrect characters
RoxyGrs May 28, 2025
db94347
init: Matthias
Crosnierpaul Jun 2, 2025
bef540b
inti: Mathis
Crosnierpaul Jun 2, 2025
8e66400
Ajout d'un casino roulette
Jun 3, 2025
9e8f42b
Structure de base de la roultte, on definit les numero et un input
Jun 3, 2025
f1e936f
ajout de l'input, l'utilisateur peut choisir un nombre entre 0 et 36
Jun 3, 2025
3b17ab7
Le joueur comment la parti avec un capital de 100e et peut mise sur u…
Jun 3, 2025
7a80a48
ajout des différents types de paris de casino (plein, cheval, carré, …
Jun 3, 2025
4b22dad
vérification de validité des paris
Jun 3, 2025
2d30cb6
creation de l'interface Tkinter et supreesion de certain type de pari…
Jun 3, 2025
5e2439f
modif sur le tkinter ( esthétique)
Jun 3, 2025
a32832b
affichge des reglé en fonction du type de pari choisi et amélioration…
Jun 3, 2025
2a92965
modifcation de la taille de la fenetre
Jun 3, 2025
d240a09
modifcation sur l'affichage du numero qui est afficher avec sa couleu…
Jun 3, 2025
3bb1c8f
Create CoinMachine
LatthiasM Jun 10, 2025
cc9d62a
last comit
Jun 10, 2025
62685d0
build crée avec fichier .exe
LatthiasM Jun 10, 2025
869f4c2
Update Analysis-00.toc
LatthiasM Jun 10, 2025
9603d8e
Update warn-MachineaSous.txt
LatthiasM Jun 10, 2025
cb5d720
Update xref-MachineaSous.html
LatthiasM Jun 10, 2025
a77678f
fix
MathisDugue6653 Jun 10, 2025
7f229b4
Merge branch 'Mathis'
MathisDugue6653 Jun 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
173 changes: 173 additions & 0 deletions Projects/Casino Roulette/App.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
import tkinter as tk
from tkinter import messagebox, font
import random

def get_color(number):
if number == 0:
return "green"
elif number in [1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36]:
return "red"
else:
return "black"

def tourner_roulette(pari_type, mise, capital, details):
numero = random.randint(0, 36)
couleur = get_color(numero)
gain = 0

if pari_type == "plein":
capital -= mise * len(details)
if numero in details:
gain = mise * 35
elif pari_type == "couleur":
capital -= mise
if couleur == details[0]:
gain = mise * 2
elif pari_type == "pair":
capital -= mise
if numero != 0 and numero % 2 == 0:
gain = mise * 2
elif pari_type == "impair":
capital -= mise
if numero != 0 and numero % 2 == 1:
gain = mise * 2

capital += gain

if gain > 0:
message = f"Bravo ! Vous avez gagné {gain:.2f}€ !\n"
else:
montant_perdu = mise * (len(details) if pari_type == "plein" else 1)
message = f"Désolé, vous avez perdu {montant_perdu:.2f}€.\n"

return capital, numero, couleur, message

class RouletteApp:
def __init__(self, root):
self.root = root
self.root.title("Roulette Casino")
self.root.geometry("400x630")
self.root.configure(bg="#f0f4f8")

self.capital = 100

self.custom_font = font.Font(family="Helvetica", size=12)
self.title_font = font.Font(family="Helvetica", size=16, weight="bold")

self.label_title = tk.Label(root, text="🎰 Roulette Casino 🎰", font=self.title_font, bg="#f0f4f8", fg="#2c3e50")
self.label_title.pack(pady=15)

self.label_capital = tk.Label(root, text=f"Capital : {self.capital}€", font=self.custom_font, bg="#f0f4f8", fg="#34495e")
self.label_capital.pack(pady=5)

frame_options = tk.Frame(root, bg="#f0f4f8")
frame_options.pack(pady=10, fill="x", padx=30)

tk.Label(frame_options, text="Type de mise :", font=self.custom_font, bg="#f0f4f8", fg="#34495e").grid(row=0, column=0, sticky="w")
options = ["plein", "couleur", "pair", "impair"]
self.pari_type_var = tk.StringVar(value=options[0])
self.option_menu = tk.OptionMenu(frame_options, self.pari_type_var, *options, command=self.on_pari_change)
self.option_menu.config(font=self.custom_font, bg="white")
self.option_menu.grid(row=0, column=1, sticky="ew", padx=10)

tk.Label(frame_options, text="Détails du pari :", font=self.custom_font, bg="#f0f4f8", fg="#34495e").grid(row=1, column=0, sticky="w", pady=8)
self.entry_details = tk.Entry(frame_options, font=self.custom_font)
self.entry_details.grid(row=1, column=1, sticky="ew", padx=10)
frame_options.columnconfigure(1, weight=1)

tk.Label(root, text="Mise en € :", font=self.custom_font, bg="#f0f4f8", fg="#34495e").pack(anchor="w", padx=30, pady=(15, 5))
self.entry_mise = tk.Entry(root, font=self.custom_font)
self.entry_mise.pack(fill="x", padx=30)

self.btn_jouer = tk.Button(root, text="Jouer", font=self.custom_font, bg="#27ae60", fg="white", activebackground="#2ecc71", command=self.jouer)
self.btn_jouer.pack(pady=20, ipadx=10, ipady=5)

# Canvas pour afficher le carré avec numéro
self.canvas = tk.Canvas(root, width=100, height=100, bg="#f0f4f8", highlightthickness=0)
self.canvas.pack(pady=5)

self.result_label = tk.Label(root, text="", font=self.custom_font, bg="#f0f4f8", fg="#2c3e50", wraplength=350, justify="left")
self.result_label.pack(padx=30, pady=10)

self.help_label = tk.Label(root, text="", font=("Helvetica", 10, "italic"), fg="#7f8c8d", bg="#f0f4f8", wraplength=350, justify="left")
self.help_label.pack(padx=30, pady=(0, 10))

self.on_pari_change(self.pari_type_var.get())

def on_pari_change(self, value):
if value == "plein":
self.entry_details.config(state="normal")
self.help_label.config(text="Entrez un ou plusieurs numéros séparés par des virgules (ex : 17,22,3). La mise sera appliquée à chaque numéro.")
elif value == "couleur":
self.entry_details.config(state="normal")
self.help_label.config(text="Entrez 'rouge' ou 'noir'.")
elif value == "pair":
self.entry_details.delete(0, tk.END)
self.entry_details.config(state="disabled")
self.help_label.config(text="Vous misez sur les numéros pairs. Aucun détail à entrer.")
elif value == "impair":
self.entry_details.delete(0, tk.END)
self.entry_details.config(state="disabled")
self.help_label.config(text="Vous misez sur les numéros impairs. Aucun détail à entrer.")
else:
self.entry_details.config(state="normal")
self.help_label.config(text="")

def dessiner_carre(self, numero, couleur):
self.canvas.delete("all")
taille = 100
# Dessiner carré coloré
self.canvas.create_rectangle(5, 5, taille-5, taille-5, fill=couleur, outline="black", width=2)
# Afficher le numéro au centre en blanc
self.canvas.create_text(taille//2, taille//2, text=str(numero), fill="white", font=("Helvetica", 36, "bold"))

def jouer(self):
try:
mise = float(self.entry_mise.get())
pari_type = self.pari_type_var.get()
raw_details = self.entry_details.get().strip().lower()

if pari_type == "plein":
if not raw_details:
raise ValueError("Entrez au moins un numéro.")
details = [int(x) for x in raw_details.split(",")]
for num in details:
if num < 0 or num > 36:
raise ValueError("Numéro de plein invalide.")
mise_totale = mise * len(details)
else:
mise_totale = mise

if mise_totale <= 0 or mise_totale > self.capital:
raise ValueError("Mise invalide ou insuffisante pour couvrir tous les paris.")

if pari_type == "couleur":
if raw_details not in ["rouge", "noir"]:
raise ValueError("Couleur invalide.")
details = [raw_details]
elif pari_type in ["pair", "impair"]:
details = []

except Exception as e:
messagebox.showerror("Erreur", f"Erreur dans la mise ou les détails du pari.\n{e}")
return

self.capital, numero, couleur, resultat = tourner_roulette(pari_type, mise, self.capital, details)
# Mise à jour du capital en haut
self.label_capital.config(text=f"Capital : {self.capital:.2f}€")

# Ici, on supprime la phrase "Capital restant" dans le texte de résultat
# Affiche le message résultat (sans capital)
self.result_label.config(text=resultat)

# Dessine le carré avec numéro
self.dessiner_carre(numero, couleur)

if self.capital <= 0:
messagebox.showinfo("Fin", "Vous avez perdu tout votre argent.")
self.root.destroy()

if __name__ == "__main__":
root = tk.Tk()
app = RouletteApp(root)
root.mainloop()
167 changes: 167 additions & 0 deletions Projects/CoinMachine/MachineaSous.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
import sys
import random
from PyQt5.QtWidgets import (
QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout,
QMessageBox, QHBoxLayout
)
from PyQt5.QtGui import QFont, QColor
from PyQt5.QtCore import Qt

# === Paramètres du jeu ===
symbols = ["🍒", "🍋", "🔔", "💎", "🍀", "7️⃣"]
weights = [30, 25, 20, 15, 8, 2]
initial_balance = 100
goal_amount = 500

custom_gains = {
"🍒": {"3": 4, "2": 1.5},
"🍋": {"3": 3, "2": 1.3},
"🔔": {"3": 6, "2": 2},
"💎": {"3": 8, "2": 3},
"🍀": {"3": 10, "2": 4},
"7️⃣": {"3": 15, "2": 5, "1": 1.5}
}

class SlotMachine(QWidget):
def __init__(self):
super().__init__()
self.balance = initial_balance
self.init_ui()

def init_ui(self):
self.setWindowTitle("Machine à sous 🎰")
self.setFixedSize(400, 420)

layout = QVBoxLayout()

self.label_title = QLabel("🎰 Machine à sous")
self.label_title.setFont(QFont("Arial", 20))
self.label_title.setAlignment(Qt.AlignCenter)

self.label_balance = QLabel(f"💰 Solde : {self.balance}€")
self.label_balance.setFont(QFont("Arial", 14))
self.label_balance.setAlignment(Qt.AlignCenter)

self.label_slots = QLabel("🎲 🎲 🎲")
self.label_slots.setFont(QFont("Arial", 40))
self.label_slots.setAlignment(Qt.AlignCenter)

self.entry_bet = QLineEdit("10")
self.entry_bet.setFont(QFont("Arial", 14))
self.entry_bet.setAlignment(Qt.AlignCenter)

self.btn_spin = QPushButton("Lancer")
self.btn_spin.setFont(QFont("Arial", 14))
self.btn_spin.clicked.connect(self.play)

self.btn_rules = QPushButton("Règles")
self.btn_rules.setFont(QFont("Arial", 10))
self.btn_rules.clicked.connect(self.show_rules)

self.label_message = QLabel("")
self.label_message.setFont(QFont("Arial", 14))
self.label_message.setAlignment(Qt.AlignCenter)

layout.addWidget(self.label_title)
layout.addWidget(self.label_balance)
layout.addWidget(self.label_slots)
layout.addWidget(self.entry_bet)
layout.addWidget(self.btn_spin)
layout.addWidget(self.btn_rules)
layout.addWidget(self.label_message)

self.setLayout(layout)

def show_rules(self):
rules = (
"🎰 RÈGLES DU JEU 🎰\n\n"
"🎯 Objectif : Atteindre 500€ pour gagner.\n"
"💼 Solde initial : 100€\n\n"
"🔢 À chaque tour : entrez une mise et cliquez sur Lancer.\n\n"
"💥 Gains selon les symboles :\n"
"🍒 → x4 (3x), x1.5 (2x)\n"
"🍋 → x3 (3x), x1.3 (2x)\n"
"🔔 → x6 (3x), x2 (2x)\n"
"💎 → x8 (3x), x3 (2x)\n"
"🍀 → x10 (3x), x4 (2x)\n"
"7️⃣ → x15 (3x), x5 (2x), x1.5 (1x)\n\n"
"🎲 Bonne chance et amuse-toi bien !"
)
QMessageBox.information(self, "Règles du jeu", rules)

def spin_slots(self):
return random.choices(symbols, weights=weights, k=3)

def calculate_payout(self, result, bet):
counts = {s: result.count(s) for s in set(result)}
best_payout = 0
best_message = "😢 Aucun gain."
best_color = "red"

for symbol, count in counts.items():
gains = custom_gains.get(symbol, {})
if count == 3 and "3" in gains:
m = gains["3"]
payout = bet * m
if payout > best_payout:
best_payout = payout
best_message = f" x{m}\nGain : {int(payout)}€"
best_color = self.get_color(m)
elif count == 2 and "2" in gains:
m = gains["2"]
payout = int(bet * m)
if payout > best_payout:
best_payout = payout
best_message = f" x{m}\nGain : {payout}€"
best_color = self.get_color(m)
elif count == 1 and symbol == "7️⃣" and "1" in gains:
m = gains["1"]
payout = int(bet * m)
if payout > best_payout:
best_payout = payout
best_message = f" x{m}\nGain : {payout}€"
best_color = self.get_color(m)

return best_payout, best_message, best_color

def get_color(self, multiplier):
if multiplier >= 10:
return "gold"
elif multiplier >= 5:
return "orange"
elif multiplier >= 2:
return "blue"
else:
return "green"

def play(self):
try:
bet = int(self.entry_bet.text())
if bet <= 0 or bet > self.balance:
raise ValueError
except ValueError:
QMessageBox.critical(self, "Erreur", "Mise invalide ou supérieure au solde.")
return

self.balance -= bet
result = self.spin_slots()
payout, message, color = self.calculate_payout(result, bet)
self.balance += payout

self.label_slots.setText(" | ".join(result))
self.label_balance.setText(f"💰 Solde : {self.balance}€")
self.label_message.setText(message)
self.label_message.setStyleSheet(f"color: {color};")

if self.balance == 0:
QMessageBox.information(self, "Perdu", "Vous avez tout perdu !")
self.btn_spin.setEnabled(False)
elif self.balance >= goal_amount:
QMessageBox.information(self, "Gagné", f"Félicitations ! Vous avez atteint {self.balance}€ !")
self.btn_spin.setEnabled(False)

if __name__ == "__main__":
app = QApplication(sys.argv)
machine = SlotMachine()
machine.show()
sys.exit(app.exec_())
38 changes: 38 additions & 0 deletions Projects/CoinMachine/MachineaSous.spec
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# -*- mode: python ; coding: utf-8 -*-


a = Analysis(
['MachineaSous.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)

exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='MachineaSous',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
Loading