pong.py

Created by loic-azavant

Created on December 07, 2022

8.8 KB

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

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.