Code : Tout sélectionner
# -*- coding: cp1252 -*- #se renseigner
#Import des modules nécessaires
import pygame
import random as rd
import numpy as np
#Initialisation du module
pygame.init()
#Variables globales
#Taille fenetre
taille=(1000,600)
fenetre=pygame.display.set_mode(taille) #open window possible, à expliquer
#Position et vitesse de l'objet
dx=0
dy=0
#Couleurs
rouge=(255,0,0)
vert=(0,255,0)
bleu=(0,0,255)
noir=(0,0,0)
blanc=(255,255,255)
rose=(255,0,123)
#Tableau d'objets
nobj=20 #Nombre d'objets
T=np.zeros((nobj,6)) #(Nombre d'objets, paramètres des objets)
Variable1=False #A compléter
xob=0 #Ne sert pas pour le moment
yob=0
hob=5
lob=3
dxob=0
dyob=0
Lspawn=[]
#Etablir le tableau
for i in range(nobj):
spawn=rd.randint(0,1000)
T[i,0]=spawn #+(10*i) #xob
T[i,1]=5 #yob
T[i,2]=5 #hauteur hob
T[i,3]=3 #largeur lob
T[i,4]=dxob #dxob
T[i,5]=dyob #dyob
#Liste des indices qui doit subir les même changements (dans le tri)
Lindice=[]
for u in range(nobj):
Lindice.append(u)
#Destruction d'objets par obstacle
xobstacle=0
yobstacle=0
#Personnage respawn
respawn=True
x=465
y=570
#Permet de "sauvegarder" le point d'apparition
copiex=x
copiey=y
#Les salves
salve1=True #Ajouter d'autres salves ?
#Objectif
xobjectif=480
yobjectif=0
dxobjectif=5
goal=False
#Vies et difficulté
vie=5
vcote=10 #Permet augmentation de la vitesse
vhaut=10
vbas=5
#Bonus
nbonus=0
nbonusreel=0
B=np.zeros((10,6)) #Nombre bonus et caractéristiques
for i in range(nbonus):
B[i,0]=rd.randint(0,950)
B[i,1]=rd.randint(0,550)
B[i,2]=rd.randint(0,50)
B[i,3]=dxob
B[i,4]=dyob
bonus=False
#Tableau des scores
fscore=open("fscore.txt",'r')
num=open("num.txt",'r')
score=0
numjoueur=0
numlist=num.readlines()
for i in numlist:
numjoueur=numjoueur+1
#Horloge qui gère la vitesse d'actualisation de l'écran
clock=pygame.time.Clock()
fermer=False #Booléen permettant de fermer la fenêtre
#Boucle principale
while fermer==False: #Fonctionnement continu du jeu
#Boucle des évènements
for event in pygame.event.get(): #Pour une action de l'utilisateur
if event.type == pygame.QUIT: #Si l'evenement reçu est "fermer la fenêtre"
fermer=True #Interrompt le fonctionnement du jeu
elif event.type == pygame.KEYDOWN: #Appui sur touche
if event.key == pygame.K_UP:
dy=-vhaut
if event.key == pygame.K_DOWN:
dy=vbas
if event.key == pygame.K_LEFT:
dx=-vcote
if event.key == pygame.K_RIGHT:
dx=vcote
elif event.type == pygame.KEYUP: #Touche relâchée
if event.key == pygame.K_UP:
dy=0
if event.key == pygame.K_DOWN:
dy=0
if event.key == pygame.K_LEFT:
dx=0
if event.key == pygame.K_RIGHT:
dx=0
#Boucle du jeu
#Remplit fenetre en blanc
fenetre.fill(blanc)
#Boucle des fonctions
#Personnage et déplacements
# perso=pygame.draw.rect(fenetre,bleu,[x,y,20,30]) #initialisation du personnage
#x=x+dx #Déplacement horizontal
#y=y+dy #Déplacement vertical
#Bordures
if x<=0: #Bordure gauche
x=x+vcote
dx=0
if x+20>=1000: #Bordure droite
x=x-vcote
dx=0
if y<=0-vhaut: #Bordure haute
y=y+vhaut
dy=0
if y+30>=600: #Bordure basse
y=y-vhaut
dy=0
#Tableau des objets (projectiles)
#On définit les composantes de chaque objet
for i in range(nobj):
spawn=rd.randint(0,1000) #Spawn aléatoire de l'objet i
#Supprimer #T[i,0]=T[i,0] #Coordonée horizontale du coin gauche de l'objet
#Supprimer #T[i,1]=T[i,1] #Pareil avec coordonée verticale
T[i,2]=hob #Hauteur de l'objet
T[i,3]=lob #Largeur de l'objet
T[i,4]=dxob #Vitesse horizontale de l'objet
T[i,5]=dyob #Vitesse verticale de l'objet
Lspawn.append(spawn)
#On créé des objets associés aux composantes de T
for o in range(nobj):
pygame.draw.rect(fenetre,noir,[T[o,0],T[o,1],T[o,2],T[o,3]])
Lindice=[]
for u in range(nobj):
Lindice.append(u)
#Tri bulle de la liste
for m in range(nobj): #Nombre minimal de répétitions nécessaires pour être sur que la liste est triée
for t in range(nobj-1):
stock=0
stocki=0
while Lspawn[t]>Lspawn[t+1]:
stock=Lspawn[t] #Pour les valeurs de spawn
Lspawn[t]=Lspawn[t+1]
Lspawn[t+1]=stock
stocki=Lindice[t] #Pour les indices
Lindice[t]=Lindice[t+1]
Lindice[t+1]=stocki
Lspawn=[] #Evite ajout massif de coordonnées
#Déplacements des objets
#Horizontal
for j in range(nobj):
gd=rd.random()
dxob=dxob+5
if T[j,0]<500: #Comparativement au milieu de l'écran
if gd<=0.7: #70% de chance d'aller à droite si on est dans la moitié gauche
T[j,0]=T[j,0]+dxob
else: T[j,0]=T[j,0]-dxob
else:
if gd<=0.7: #70% de chance d'aller à gauche si on est dans la moitié droite
T[j,0]=T[j,0]-dxob
else: T[j,0]=T[j,0]+dxob
dxob=0 #Evite accéleration horizontale
#Vertical
for k in Lindice[0:(int(nobj/2))]: #Plus l'objet est à une extrémité de l'écran plus il va plus vite comparé aux autres
T[k,5]=T[k,5]+k
for n in Lindice[int((nobj/2)):nobj]:
T[n,5]=T[n,5]+(nobj-n)
for f in range(nobj):
T[f,1]=T[f,1]+T[f,5]
T[f,5]=0
#Salves
if salve1==True:
for i in range(nobj):
if T[i,0]>taille[0] or T[i,1]>taille[1]: #sort de l'écran
spawn=rd.randint(0,1000)
T[i,0]=spawn #remettre un spawn au hasard
T[i,1]=yob
#Obstacle
#Respawn du personnage
if respawn==True:
perso=pygame.draw.rect(fenetre,bleu,[x,y,20,30])
for u in range(x,x+20): #verif largeur
for v in range(y,y+30): #verif hauteur
for i in range(nobj): #Objet
if x<=(T[i,0]+T[i,3]) and (T[i,0]+T[i,3])<=x+20 and y<=(T[i,1]+T[i,2]) and (T[i,1]+T[i,2])<=y+30 : #impact
respawn=False
if respawn==False: #On remet au départ
x=copiex
y=copiey
perso=pygame.draw.rect(fenetre, rouge, [x,y ,20,30]) #Respawn+clignote
respawn=True
vie=vie-1
x=x+dx
y=y+dy
#Objectif
objectif=pygame.draw.rect(fenetre,rose,[xobjectif,yobjectif,40,10])
xobjectif=xobjectif+dxobjectif
if xobjectif+40>1000:
dxobjectif=-dxobjectif
if xobjectif<0:
dxobjectif=-dxobjectif
#Si atteint :
if x>xobjectif and x<xobjectif+40 and y<=yobjectif+10:
respawn=False
score=score+1
vie=vie+1 #Négation de la perte de vie
nobj=nobj+5 #Augmentation de la difficulté
T=np.zeros((nobj,6))
for i in range(nobj): #Fait respawn les ennemis
spawn=rd.randint(0,1000)
T[i,0]=spawn
T[i,1]=0
vcote=vcote+2 #Deplacement plus rapide
vhaut=vhaut+2
goal=True #Bonus
#Vies et score
if vie<=0: #Si plus de vie
fermer=True #Fin du jeu
fscore=open("fscore.txt",'a') #Ecriture dans fscore
scoretxt=str(score) #Conversion d'une chaine de caractères
numjoueurtxt=str(numjoueur)
fscore.write("Score joueur "+numjoueurtxt+" : "+scoretxt+"\n") #Ecriture
fscore.close()
print("Merci d'avoir joué !"+"\n"+"Votre score est de "+scoretxt+" !") #Message de fin
num=open("num.txt",'a') #Incrémentation du numéro pour parties à venir
num.write("1\n")
num.close()
#Bonus
if goal==True:
nbonus=rd.randint(1,score+5)
nbonusreel=0
k=0
while k<nbonus:
pbonu=rd.random() #Proba de bonus
if pbonu>(1-(vie/10)) and nbonusreel<10: #Moins de vie, plus de bonus et nombre max de bonus
nbonusreel=nbonusreel+1
k=k+1
for u in range(nbonusreel):
B[u,0]=rd.randint(0,950) #x
B[u,1]=rd.randint(0,550) #y
B[u,2]=rd.randint(0,10) #rayon
B[u,3]=0 #?? Idée : plus bonus petit, plus il est puissant et on stocke sa "puissance" ici
B[u,4]=0 #??
goal=False
for u in range(nbonusreel): #Dessin des cercles
pygame.draw.circle(fenetre,vert,[int(B[u,0]),int(B[u,1])],int(B[u,2])) #int car rd.randint donne...un float
for u in range(x,x+20): #verif largeur
for v in range(y,y+30): #verif hauteur
for i in range(nbonusreel): #Objet
if x<=(B[i,0]+B[i,2]) and (B[i,0]+B[i,2])<=x+20 and y<=(B[i,1]+B[i,2]) and (B[i,1]+B[i,2])<=y+30 : #impact
bonus=True
if bonus==True:
effet=rd.random()
if effet<0.1: #10 a 20% de chance de lancer un effet
vcote=vcote+2
vhaut=vhaut+2
print("Et rapide en plus !")
elif 0.1<effet<0.2: #Ajouter un truc rigolo
vie=vie+2
print("On n'a qu'une vie...mais moi j'en ai 2 en plus !")
elif 0.2<effet<0.3: #Moins d'objets
nobj=nobj-3
print("Ils s'enfuient ! Enfin pas tous...")
elif 0.3<effet<0.5: #Life up !
vie=vie+1
print("Awyeah !")
elif 0.5<effet<0.6: #En arrière toute !
vbas=vbas+5
print("En arrière toute !")
elif 0.6<effet<0.7: #Cadeau empoisonné
nobj=nobj+10
vie=vie+10
T=np.zeros((nobj,6))
print("Des vies ! Il va y en avoir besoin...")
for i in range(nobj): #Fait respawn les ennemis
spawn=rd.randint(0,1000)
T[i,0]=spawn
T[i,1]=0
elif 0.7<effet<0.8: #Pas de retraite !
vbas=0
vhaut=vhaut+15
print("Chargez !")
else: #Tir activé (non implémenté)
tirer=True
print("Armement opérationnel !")
bonus=False
B=np.zeros((10,6)) #Fait disparaitre les cercles de bonus
#Affichage des vies en bas à droite
for v in range(vie):
pygame.draw.rect(fenetre,rouge,[10*v,595,5,5])
#Limite de frame/seconde de l'horloge
clock.tick(30)
#Editer l'écran
pygame.display.flip()
#Permet de fermer le programme correctement si lancé depuis idle
pygame.quit()