PAGE NSI PREMIÈRE. GABIN ROUMEGUERE

Projet final
Bonjour, voici la page qui va relater mon parcours de façon chronologique sur mon projet final.
Séance 1 et définition des objectifs
J’ai décidé de partir sur un jeu de type space invader. Les particularités sont nombreuses. L’idée est de faire choisir à l’utilisateur un avion parmi les 4 proposés et de parcourir une distance entre deux villes. Pour gagner des points, il devra tuer des ennemis mais aussi faire des actes citoyens tels que un relevé météo,...Ces points lui permettront d’atteindre des checkpoints pour pouvoir acheter de l’essence, réparer l’avion et acheter des objets plus fiables.

Séance 2
Je suis allé sur Arcade Make code pour commencer à voir comment faire pour l’arrière-plan, le sprite,..Puis, j’ai recherché un programme space invaders que j’ai trouvé sur https://www.geeksforgeeks.org/building-space-invaders-using-pygame-python/. Le programme marche, je le détaillerai plus tard.

Séance 3
Je suis allé sur Arcade Make code pour terminer le choix des arrière-plans et des sprites. Puis, j'ai demandé à M.Laclaverie pour savoir comment intégrer la notion de distance dans mon jeu.



bullet:
avion:
ennemis:
Séance 4
Cette partie du code va gérer la collision entre l'alien et le missile. Grâce à la fonction isCollision() qui va vérifier si les deux sprites sont proches, la fonction if va servir à modifier le score, ramener le missile à son état initial avec les modifications de variables bullet_Y et bullet_state. Enfin, la dernière partie du code permet que l'alien reviennent à l'écran après avoir disparu.
Cette partie du code va gérer les mouvements des aliens. La première boucle conditionnelle va permettre de définir quand un alien touche l'avion. La seconde va permettre le déplacement horizontal en changeant le signe de la valeur associée à invader_Xchange[i] pour qu'elle aille dans l'autre sens si l'abscisse de l'alien est supérieur ou égal à 735 ou inférieur ou égal à 0.
Cette partie du code va gérer les mouvements du missile en fonction de la valeur associée à la variable bullet_state, qui si est associée à "fire" va appeller la fonction bullet() qui fait apparaître le missile et va modifier la variable bullet_Y, un paramètre de la fonction bullet qui va permettre que le sprite du missile "se déplace" à chaque mise à jour de l'écran. Le missile se déplaçant juste sur l'axe des ordonnées.
Cette partie du code va gérer les mouvements du sprite du joueur.
Cette partie du code va permettre que les sprites du joueur, des aliens et du missile apparaissent en l'injectant dans la fenêtre avec la fonction screen.blit()
Cette partie du code va s'occuper de vérifier la distance entre les aliens et le missile et renvoyer une réponse nécessaire à la suite du texte en vérifiant si la distance entre le missile et l'alien est inférieure ou égale à 50 en utilisat la formule:
racine carré((xalien-xmissile)²+(yalien-ymissile)²)
On comprend que le code va prendre en compte les instructions du joueur grâce au clavier. En effet, la création de la boucle avec en élément event dans la fonction pygame.event.get() qui va renvoyer une liste contenant les interactions du joueurs, les fonctions if servant conditionner les possibilités de touches pour le dépacement aux touches directionelles gauche/droite, a et b. A l'intérieur, en fonction du choix de l'utili Enfin, la fonction if event.key==pygame.K_space: ve permettre l'envoie du missile.
C'est cette partie du code où la position du joueur va changer avec la modification des valeurs associées aux variables Player_X et Y qui sont les paramètres d'apparition de l'avion par les variables Player_Xchange et Ychange qui sont définies par le choix de l'utilisateur . Enfin, la boucle for() est utilisé pour le changement de position des aliens.
Je suis allé sur Arcade Make code pour valider le choix de l'alien. Puis, j'ai tenté de modifier le programme pourque l'on puisse avancer de haut en bas. Cependant, je rencontre des problèmes parcequ'il détecte quand j'appuie sur les touches mais ne prend pas en compte le déplacement. Je pense régler le problème pendant les vacances et aussi intégrer la notion de distance et tenter de créer la première escale. Cependant, je dois aussi régler un autre problème car je ne peux faire apparaître qu'une rocket à l'écran, pour tenter de résoudre le problème, je pense regarder une vidéo du youtubeur graven.
# Créé par gabin.roumeguere, le 30/01/2023 en Python 3.7
import pygame
import random
import math
from pygame import mixer
# ipemet d'initialiser tous les modules pygame importés
pygame.init()
# création de l'écran
screen_width = 800#associe 800 Ã la variable screen_width
screen_height = 600#associe 800 Ã la variable screen_height
screen = pygame.display.set_mode((screen_width,
screen_height))#associe à la variable screen, la création d'un écran avec la fonction pygame.display.set_mode() qui prend en paramètre les variables screen_width et screen height
pygame.display.set_caption("Welcome to Space\Invaders Game by:- styles")
#la fonction display.set_cation() permet de donner un nom à l'écran
# Score
score_val = 0#associe la valeur zero à la variable score_val
scoreX = 5#associe la valeur 5 Ã la variable scoreX
scoreY = 5#associe la valeur 5 Ã la variable scoreY
font = pygame.font.Font('freesansbold.ttf', 20)
#associe une police et sa taille avec la fonction font.Font() Ã la variable
# Game Over
game_over_font = pygame.font.Font('freesansbold.ttf', 64)
#associe une police et sa taille avec la fonction font.Font() Ã la variable
def show_score(x, y):
score = font.render("Points: " + str(score_val),
True, (255,255,255))
screen.blit(score, (x , y ))
def game_over():
game_over_text = game_over_font.render("GAME OVER",
True, (255,255,255))
screen.blit(game_over_text, (190, 250))
#on écrit les variables qui vont être utilisées pour le sprite du joueur et son déplacement
playerImage = pygame.image.load('Avions 1.png')
player_X = 370#associe la valeur 370 Ã la variable player_X
player_Y = 523#associe la valeur 523 Ã la variable player_Y
player_Xchange = 0#associe la valeur zero à la variable player_Xchange
#on écrit les variables qui vont être utilisées pour les ennemis et son déplacement
invaderImage = []
invader_X = []
invader_Y = []
invader_Xchange = []
invader_Ychange = []
no_of_invaders = 8#associe la valeur huit à la variable no_of_invaders
for num in range(no_of_invaders):
invaderImage.append(pygame.image.load('aliens.png'))
invader_X.append(random.randint(64, 737))
invader_Y.append(random.randint(30, 180))
invader_Xchange.append(1.2)
invader_Ychange.append(50)
#on écrit les variables qui vont être utilisées pour le missile et son déplacement
# rest - bullet is not moving
# fire - bullet is moving
bulletImage = pygame.image.load('rockets.png')
bullet_X = 0#associe la valeur zero à la variable bullet_X
bullet_Y = 500#associe la valeur 500 Ã la variable bullet_Y
bullet_Xchange = 0#associe la valeur zero à la variable bullet_Xchange
bullet_Ychange = 3#associe la valeur 3 Ã la variable bullet_Ychange
bullet_state = "rest"
# définition du concept de la collision
def isCollision(x1, x2, y1, y2):
distance = math.sqrt((math.pow(x1 - x2,2)) +
(math.pow(y1 - y2,2)))
if distance <= 50:
return True
else:
return False
def player(x, y):
screen.blit(playerImage, (x - 16, y + 10))
def invader(x, y, i):
screen.blit(invaderImage[i], (x, y))
def bullet(x, y):
global bullet_state
screen.blit(bulletImage, (x, y))
bullet_state = "fire"
# game loop
running = True
while running:
# RGB
screen.fill((0, 0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Controlling the player movement
# from the arrow keys
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player_Xchange = -1.7
print("gauche")#affiche du texte
if event.key == pygame.K_RIGHT:
player_Xchange = 1.7
print("droite")#affiche du texte
if event.key == pygame.K_b:
player_Ychange= 1.7
print("haut")#affiche du texte
if event.key == pygame.K_a:
player_Ychange = 1.7
print("bas")#affiche du texte
if event.key == pygame.K_SPACE:
# Fixing the change of direction of bullet
if bullet_state is "rest":
bullet_X = player_X
bullet(bullet_X, bullet_Y)
if event.type == pygame.KEYUP:
player_Xchange = 0
player_Ychange=0
# adding the change in the player position
player_X += player_Xchange
player_Y += player_Ychange
for i in range(no_of_invaders):
invader_X[i] += invader_Xchange[i]
# bullet movement
if bullet_Y <= 0:
bullet_Y = 600
bullet_state = "rest"
if bullet_state is "fire":
bullet(bullet_X, bullet_Y)
bullet_Y -= bullet_Ychange
# movement of the invader
for i in range(no_of_invaders):
if invader_Y[i] >= 450:
if abs(player_X-invader_X[i]) < 80:
for j in range(no_of_invaders):
invader_Y[j] = 2000
game_over()
break
if invader_X[i] >= 735 or invader_X[i] <= 0:
invader_Xchange[i] *= -1
invader_Y[i] += invader_Ychange[i]
# Collision
collision = isCollision(bullet_X, invader_X[i],
bullet_Y, invader_Y[i])
if collision:
score_val += 1
bullet_Y = 600
bullet_state = "rest"
invader_X[i] = random.randint(64, 736)
invader_Y[i] = random.randint(30, 200)
invader_Xchange[i] *= -1
invader(invader_X[i], invader_Y[i], i)
#cette partie du programme permet d'empêcher que le sprite du joueur sorte de l'écran
if player_X <= 16:
player_X = 16;
elif player_X >= 750:
player_X = 750
#appel des fonctions player et show_score
player(player_X, player_Y)
show_score(scoreX, scoreY)
#la fonction display.update()permet de mettre à jour les modifications de position sur l'écran
pygame.display.update()
Va faire apparaître le score avec la fonction show score() qui va injecter la variable score avec la fonction screen.blit(). La fonction game.over() va faire apparaître
"GAME OVER" sur la fenêtre de jeu avec la fonction screen.blit()
Cette boucle va servir à faire apparaître les aliens, pour cela, la boucle se répète huit fois et on les fait apparaître aléatoirement entre(64,737;30,180). Enfin, on ajoute 1.2 et 50 aux listes invader_X et invader_Y
Séance 5
J'ai continué de travailler sur la partie space invaders et fait afficher l'essence, les points,...La prochaine étape est d'intégrer la notion de temps qui passe dans le programme pour faire évoluer le programme en temps réel.
Séance 6
Sur cette séance, je me suis concentré sur la conception du marché entre les escales. Pour cela, j'ai défini des listes d'achats pour l'essence, la vie et les augmentations:
​
​
​
La liste life est associée à d'autres listes contentant en premier élément, une chaîne de caractère indiquant le nombre de vie rajouté par achat. Le second élément de chaque liste est un élément de type int permettant de modifier la variable vie. Enfin, le dernier élément sert à indiquer le prix de l’achat.
La liste essence est associée à d'autres listes contentant en premier élément, une chaîne de caractère indiquant la fraction d’essence de la contenance du réservoir d’essence que l’on va acheter par achat. Le second élément de chaque liste est un élément de type int permettant de modifier la variable essence. Enfin, le dernier élément sert à indiquer le prix de l’achat.
La liste augmentation est associée à d'autres listes contentant en premier élément, une chaîne de caractère indiquant le type d’augmentation que l’utilisateur peut acheter, « vitesse » correspond à la vitesse de l’avion et « attaque » correspond à la vitesse du missile. Le second élément de chaque liste est un élément de type int permettant de modifier les variables attaque et vitesse. Enfin, le dernier élément sert à indiquer le prix de l’achat.
Dans un premier temps, pour créer le marché, je suis parti sur l’idée de créer 4 fonctions :
-une fonction marche() qui va appeler les autres fonctions selon la réponse de l’utilisateur.
-une fonction marchelife() qui servira à l’achat de vie supplémentaire par l’utilisateur.
-une fonction marcheessence() qui sera utilisé pour l’achat d’essence supplémentaire pour le joueur.
-une fonction marcheaugmentation() qui permettra l’achat de boost au joueur.
​
J'ai juste écris la fonction marcheessence():
​
​
​
​
​
​
​


Séance 7
Sur cette séance, j'ai écris les fonctions marchelife(), marcheaugmentation() et la fonction marche().
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
Voici la fin du programme du marche, pour l'instant, il ne renvoie que la modification de la valeur du porte monnaie. Voici le programme en entier:
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​









Séance 8
Je me suis concentré sur le problème du temps. En premier, je suis parti sur une fonction distance avec à l'intérieur une boucle while et en utilisant la fonction sleep():
from time import sleep#on importe la fonction sleep de la bibliothèque time
x=20#on associe la valeur 20 Ã la variable x
def distance(distance):#on crée une boucle distance qui prend en paramètre distance
while distance>0:#On crée une boucle while qui va se répéter jusqu'à ce que l'élément distance ne soit plus supérieur à 0
sleep(1)#on utilise la fonction sleep() avec en paramètre 1 pour faire attendre une seconde
distance-=1#on enlève 1 à la valeur associé à la variable distance
print(distance)#on affiche la variable distance
distance(x)#on appelle la fonction distance avec en paramètre x.
Le programme marche. Maintenant, il reste à l'implanter au programme.
Séance 9
Pour me créer une porte de sortie, j'ai utilisé un autre système pour intégrer l'idée de variation dans le temps avec la fonction time().
from time import *#on importe la fonction * de la bibliothèque time
def d(x):#on définit la fonction d avec pour paramètre x
while x>0: #on crée une boucle while qui va se répéter tant que x est supérieur à zero et permet que l’on puisse amener la variable distance à zero
t1=time()#on associe la fonction time qui permet d’avoir le temps de l’horloge interne de l’ordinateur en seconde à la variable t1
t2=0#on associe zero à la variable t2
while t2<t1+1: #on crée une boucle while qui va se répéter tant que t2 est supérieur à t1+1 et permet que la variable t2 puisse être supérieur à t1 et 1seconde et ainsi permettre de faire descendre la variable x seconde par seconde
t2=time()#on associe la fonction time qui permet d’avoir le temps de l’horloge interne de l’ordinateur en seconde à la variable t2
x-=1#on enlève -1 à x et la boucle while va se répéter jusqu’à ce que la distance soit égale à zero d(20)
​
Le but du programme est de que la première boucle while se répète tant que la variable représentant la distance (x) est supérieure à zéro, et on enlève 1 à la variable x quand t2 sera supérieur à t1+1 ce qui veut dire que l’on enlève 1 à la variable x toutes les secondes. Cela nous permet de d’intégrer l’idée de variation des variables dans le temps. Je vais maintenant me concentrer sur d’autres parties du programme.
Séance 10
Maintenant que j'ai deux solutions pour le temps, j'ai réalisé des recherches pour les autres objectifs de mon programme tels que l'incrustation de l'arrière plan ou encore pouvoir faire apparaître plusieurs missiles à l'écran. Pour cela, j'ai utilisé des vidéos du youtubers graven:
Séance 11
J'ai décidé d'intégrer les deux essais de temps dans le programme en commençant par le programme des deux boucles while :
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
J'ai implanté la fonction d(x) que j'appelle et associe avec la variable distance qui apparaît dans la fonction show_distance() et qui sert à afficher la distance restante. Cependant, j'ai eu un problème, la variation de distance marchait mais le reste du programme plantait à cause du fait que la deuxième boucle while qui fait des time() à répétition prenait trop place dans la mémoire de l'ordinateur par rapport à la place qu'occupe le programme. L'utilisation de cette solution n'est donc pas possible.







Séance 12
J'ai essayé avec la méthode sleep(), j'ai juste remplacé les deux boucles while par le programme de la fonction sleep().
​
​
​
​
Même problème, le programme ne marche pas, en effet, la fonction sleep() met tout le programme en pause. Donc les deux solutions ne sont pas possibles. Ensuite, j'ai écrit le programme pour l'arrière plan:
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
D'ailleurs, une chose à connaître, quand on crée un écran en python les x et les y sont dans ces sens.
​
0 (x)
​
​
(y)




Séance 13
J'ai fait des recherches pour le problème du temps et je pense trouver des solutions sur le site pygame.
J'ai décidé de partir sur deux questions, pour la première, ce sera une interrogation sur la pression et la seconde sur la couverture nuageuse. J'ai donc fais la première question, pour cela, je vais dans un premier temps faire choisir à l'ordinateur un nombre au hasard entre 1000 et 1024 avec la fonction random.randint(). Puis, je crée deux nombres qui sont égaux à nombre choisi au hasard + ou - d'autres nombres aléatoires. Et enfin, avec des fonctions conditionelles if et une question, je demande si c'est une zone anticyclonique ou dépressionnaire. En effet, si la pression est inférieure à 1013 hPa, c'est une dépression et si elle est supérieure à 1013 hPa, c'est une zone anticyclonique.
​
​
​
​
​
​
​


Séance 14
J'ai écris les quatre premières séances sur le site.
Séance 15
Je suis retourné sur la partie marché et j'ai remarqué que c'était compliqué pour renvoyer les achats et les différents montants du porte monnaie au fur et à mesure car il fallait rajouter des return puis décomposer ce qui nous était renvoyés donc j'ai décidé de partir d'une boucle qui va se répéter trois fois et ainsi permettre que l'utilisateur regarde les trois marchés. J'ai juste eu le temps d'écrire la partie sur l'achat de vies supplémentaires:
​
​
​
​
​
​
​
​
​
​
​
Les deux fonctions if budget>0: servent à vérifier si l'achat est bien possible et les autres fonctions servent à modifier les variables vie et budget en fonction du choix de l'utilisateur. En fin de séance, j'ai décidé d'appliquer cette même méthode pour tous les marchés.

Séance 16
J'ai terminé d'écrire le code sur le marché en entier.
Séance 17
Pour que l'utilisateur ne puisse pas acheter deux fois le même produit, j'ai rajouté au début de la boucle for() une suite de fonctions conditionnelles if qui servent à vérifier si l'utilisateur n'a pas déjà fait ce choix, pour cela, j'ai crée trois variables augmentation_l2, essence_l1 et life_l3 qui vont changer ou pas de valeurs quand l'utilisateur va choisir d'aller sur le marché pour la vie, les augmentations,...
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​




Séance 18
Dans cette dernière séance, j'ai fusionné les différents programmes et fait quelques petites modifications légères pour que les achats soient pris en compte. Pour cela, j'ai modifié le changement de position pour que le changement ne soit pas plus une valeur mais une variable. De plus, j'ai aussi réalisé la question sur la couverture nuageuse. Son commentaire sera directement sur le projet. Voici le programme terminé, pour les photos a vous de le faire :
​
​
​
​