Un pong complètement customisable, fait avec mon autre script ez menu, et text, qui permettent d’avoir une belle interface
from math import * from ez_menu import Menu from kandinsky import * from ion import * from time import * from random import * from text import * gameMenu = Menu([ [ ["Play","btn",-1], ["Settings","btn",1], ["Quit","btn",-1] ],[ ["Game Settings","btn",2], ["Player Settings","btn",4], ["Ball Settings","btn",3], ["Color Settings","btn",5], ["Back","btn",0] ],[ ["NumberOfPoint: ","nbr",[0,5],[1,20]], ["NumberOfPlayer: ","nbr",[12,1],[1,2]], ["Back","btn",1] ],[ ["BallMaxSpeed: ","lst",[3,2],[50,100,250,500,1000]], ["BallSize: ","nbr",[7,5],[1,20]], ["BallDetail: ","lst",[8,1],[False,True]], ["BallParticles: ","lst",[10,0],[False,True]], ["Back","btn",1] ],[ ["PlayerSlipperiness: ","lst",[1,3],[0,25,50,100,200,500,1000]], ["PlayerYSize: ","lst",[9,2],[10,20,30,40,50,100,150,200]], ["PlayerDetail: ","lst",[2,1],[False,True]], ["PlayerBounceOnWall: ","lst",[11,1],[False,True]], ["Back","btn",1] ],[ ["bg: ","lst",[4,0],[(60,)*3,(0,)*3,(255,)*3]], ["col1: ","lst",[5,0],[(255,)*3,(0,255,0),(0,)*3]], ["col2: ","lst",[6,0],[(255,200,0),(255,0,255),(255,200,0)]], ["Back","btn",1] ],[ ["Play again","btn",-1], ["Main Menu","btn",0], ["Quit","btn",-1] ],[ ["Resume","btn",-1], ["Main Menu","btn",0], ["Quit","btn",-1] ] ]) pltfrms = [] def getscore(): if gameMenu.NumberOfPlayer() == 1: return str(pltfrms[0].score) return str(pltfrms[0].score)+"-"+str(pltfrms[1].score) logos=("PONG","SETTINGS","GAME","BALL","PLAYER","COLORS",getscore,"PAUSE") def drwLg(**kwargs): if str(type(logos[gameMenu.menuNumb]))=="<class 'function'>": text5 = logos[gameMenu.menuNumb]() else: text5 = logos[gameMenu.menuNumb] drawBigText(text5,int(160-len(text5)/2*40)+5,10,size=10,col1=gameMenu.col2()) gameMenu.func = drwLg class Pltfrm: def __init__(self,**kwargs): pltfrms.append(self) self.x = 10 self.y = 0 self.oldY = 0 self.sx = 10 self.speed = 0 self.accelerationValue = 1000 self.keys = (1,2) self.last = 0 self.score = 0 self.maxspeed = 250 for key,value in kwargs.items(): setattr(self,key,value) def drw(self): if gameMenu.PlayerDetail(): fill_rect(self.x,round(self.y)+1,self.sx,gameMenu.PlayerYSize()-2,gameMenu.col1()) fill_rect(self.x+1,round(self.y),self.sx-2,gameMenu.PlayerYSize(),gameMenu.col1()) else: fill_rect(self.x,round(self.y),self.sx,gameMenu.PlayerYSize(),gameMenu.col1()) def updt(self): self.oldY = self.y self.isMoving = keydown(self.keys[1])-keydown(self.keys[0]) if self.isMoving!=0: self.speed = max(-self.maxspeed,min(self.speed+self.isMoving*self.accelerationValue*deltaTime,self.maxspeed)) else: self.speed /= 1+0.001*gameMenu.PlayerSlipperiness() if abs(self.speed)<1: self.speed = 0 self.y = max(0,min(self.y+self.speed*deltaTime,222-gameMenu.PlayerYSize())) if self.y == self.oldY: if gameMenu.PlayerBounceOnWall(): self.speed *= -1 else: self.speed = 0 self.updtdrwng() def updtdrwng(self): Y = round(self.y) OldY = round(self.oldY) if Y==OldY: return elif Y > OldY: if gameMenu.PlayerDetail(): fill_rect(self.x+1,OldY,self.sx-1,Y-OldY,gameMenu.bg()) fill_rect(self.x,OldY+1,1,Y-OldY,gameMenu.bg()) fill_rect(self.x+self.sx-1,OldY+1,1,Y-OldY,gameMenu.bg()) fill_rect(self.x+1,OldY+gameMenu.PlayerYSize(),self.sx-2,Y-OldY,gameMenu.col1()) fill_rect(self.x,OldY+gameMenu.PlayerYSize()-1,1,Y-OldY,gameMenu.col1()) fill_rect(self.x+self.sx-1,OldY+gameMenu.PlayerYSize()-1,1,Y-OldY,gameMenu.col1()) else: fill_rect(self.x,OldY,self.sx,Y-OldY,gameMenu.bg()) fill_rect(self.x,OldY+gameMenu.PlayerYSize(),self.sx,Y-OldY,gameMenu.col1()) elif Y < OldY: if gameMenu.PlayerDetail(): fill_rect(self.x+1,Y,self.sx-2,OldY-Y,gameMenu.col1()) fill_rect(self.x,Y+1,1,OldY-Y,gameMenu.col1()) fill_rect(self.x+self.sx-1,Y+1,1,OldY-Y,gameMenu.col1()) fill_rect(self.x+1,Y+gameMenu.PlayerYSize(),self.sx-2,OldY-Y,gameMenu.bg()) fill_rect(self.x,Y+gameMenu.PlayerYSize()-1,1,OldY-Y,gameMenu.bg()) fill_rect(self.x+self.sx-1,Y+gameMenu.PlayerYSize()-1,1,OldY-Y,gameMenu.bg()) else: fill_rect(self.x,Y,self.sx,OldY-Y,gameMenu.col1()) fill_rect(self.x,Y+gameMenu.PlayerYSize(),self.sx,OldY-Y,gameMenu.bg()) particles = [] class Particle: def __init__(self,x,y,sens): particles.append(self) self.x = round(x) self.y = round(y) self.sx = randint((sens<0)*(-200),(sens>0)*200) self.sy = randint(-200,100) def updt(self): fill_rect(round(self.x),round(self.y),2,2,gameMenu.bg()) self.x += self.sx*deltaTime self.y += self.sy*deltaTime if self.y > 222: del particles[particles.index(self)] else: fill_rect(round(self.x),round(self.y),2,2,gameMenu.col2()) self.sy += 400*deltaTime class Ball: def __init__(self,**kwargs): self.oldX = 50 self.oldY = 50 self.x = 50 self.y = 50 self.startSpeed = 100 self.sx = randint(round(self.startSpeed/2),self.startSpeed) self.sy = sqrt(self.startSpeed**2-self.sx**2)*choice([-1,1]) self.oldSpeed = self.startSpeed self.speed = self.startSpeed self.accelerationValue = 5 def drw(self): fill_rect(round(self.oldX),round(self.oldY),gameMenu.BallSize(),gameMenu.BallSize(),gameMenu.bg()) if gameMenu.BallDetail(): fill_rect(round(self.x),round(self.y+1),gameMenu.BallSize(),gameMenu.BallSize()-2,gameMenu.col2()) fill_rect(round(self.x+1),round(self.y),gameMenu.BallSize()-2,gameMenu.BallSize(),gameMenu.col2()) else: fill_rect(round(self.x),round(self.y),gameMenu.BallSize(),gameMenu.BallSize(),gameMenu.col2()) def updt(self): self.oldX = self.x self.oldY = self.y self.oldSpeed = self.speed self.speed = min(self.speed+self.accelerationValue*deltaTime,gameMenu.BallMaxSpeed()) self.sx = (self.sx*self.speed)/self.oldSpeed self.sy = (self.sy*self.speed)/self.oldSpeed self.x += self.sx*deltaTime if self.x > 320 or self.x+gameMenu.BallSize() < 0: pltfrms[(self.x+gameMenu.BallSize()<0)].score += 1 self.x = 160 self.y = 111 self.sx = randint(round(self.startSpeed/2),self.startSpeed) self.sy = sqrt(self.startSpeed**2-self.sx**2)*choice([-1,1]) self.oldSpeed = self.startSpeed self.speed = self.startSpeed for i in pltfrms: i.last = 0 if gameMenu.NumberOfPlayer() == 1: gameMenu.menuNumb = 6 gameMenu.drwScrn(True) return False self.y = min(222-gameMenu.BallDetail(),max(self.y+self.sy*deltaTime,0)) if self.y == self.oldY: self.sy *= -1 self.y = min(222-gameMenu.BallSize(),max(self.y+self.sy*deltaTime,0)) for i in pltfrms: if not(self.x>i.x+i.sx or self.x+gameMenu.BallSize()<i.x or self.y>i.y+gameMenu.PlayerYSize() or self.y+gameMenu.BallSize()<i.y) and not i.last: self.sx *= -1 if gameMenu.NumberOfPlayer() == 1: pltfrms[0].score += 1 if gameMenu.BallParticles(): for j in range(5): Particle(self.x,self.y,self.sx) for j in pltfrms: j.last = 0 i.last = 1 self.drw() return True deltaTime = 0 gameMenu.drwScrn(True) Pltfrm() Pltfrm(x=300,keys=(KEY_RIGHTPARENTHESIS,KEY_MINUS)) ball = Ball() while 1: b=gameMenu.loop() if b=="Play" or b=="Play again" or b=="Resume": if b=="Play" or b=="Play again": for i in pltfrms: i.score = 0 i.last = 0 if gameMenu.NumberOfPlayer() == 1: pltfrms[1].keys = (1,2) else: pltfrms[1].keys=(KEY_RIGHTPARENTHESIS,KEY_MINUS) playing = True fill_rect(0,0,320,222,gameMenu.bg()) for pltfrm in pltfrms: pltfrm.drw() deltaTime = 0 while playing: time = monotonic() playing = ball.updt() if playing: for i in particles: i.updt() for i in pltfrms: i.updt() if i.score == gameMenu.NumberOfPoint() and gameMenu.NumberOfPlayer() == 2: gameMenu.menuNumb = 6 gameMenu.drwScrn(True) playing = False if keydown(KEY_ONOFF): playing = False gameMenu.menuNumb = 7 gameMenu.drwScrn(True) deltaTime = monotonic() - time elif b=="Quit": break