pong.py

Created by jblbeurope

Created on March 18, 2019

2.31 KB

Pong game (requires https://github.com/numworks/epsilon/pull/746).


# Pong for NumWorks by boricj

from time import *
from kandinsky import *
from random import *

def pong():
  WIDTH=320
  HEIGHT=224
  
  class Paddle:
    def __init__(self, x):
      self.width=16
      self.height=64
      self.x=x
      self.y=((224-self.height)/2)
    def move(self,dy):
      self.y=min(max(self.y+dy,0),HEIGHT-self.height)
  
  class Ball:
    def __init__(self):
      self.width=16
    def reset(self):
      self.x=(WIDTH-self.width)/2
      self.y=(HEIGHT-self.width)/2
      self.dx=(random()+3)*16
      self.dy=(random()+3)*16
    def collide(self,pad):
      bx1=self.x
      by1=self.y
      bx2=self.x+self.width
      by2=self.y+self.width
      px1=pad.x
      py1=pad.y
      px2=pad.x+pad.width
      py2=pad.y+pad.height
      if bx1 < px2 and bx2 > px1 and by1 < py2 and by2 > py1:
        return True
      return False
  
  B=Ball()
  B.reset()
  P1=Paddle(16)
  P2=Paddle(WIDTH-32)
  score1=0
  score2=0
  fill_rect(0,0,WIDTH,HEIGHT,color(0,0,0))
  
  prevTime=monotonic()
  while True:
    curTime=monotonic()
    dTime=curTime-prevTime
    prevTime=curTime
    keys=get_keys()
    oldp1x=P1.x
    oldp1y=P1.y
    oldp2x=P2.x
    oldp2y=P2.y
    oldbx=B.x
    oldby=B.y
    B.x+=B.dx*dTime
    B.y+=B.dy*dTime
    if "up" in keys:
      P1.move(-128*dTime)
    elif "down" in keys:
      P1.move(128*dTime)
    if P2.y+P2.height/2>B.y+B.width/2:
      P2.move(-160*dTime)
    else:
      P2.move(160*dTime)
    if B.collide(P1):
      B.x=P1.x+P1.width+1
      B.dx*=-1.1
      B.dy*=1.1
    elif B.collide(P2):
      B.x=P2.x-B.width-1
      B.dx*=-1.1
      B.dy*=1.1
    if B.x<0:
      B.reset()
      score2+=1
    elif B.x>WIDTH:
      B.reset()
      score1+=1
    if B.y<0:
      B.y=1
      B.dy=-B.dy
    elif B.y>HEIGHT-B.width:
      B.y=HEIGHT-B.width-1
      B.dy=-B.dy
    wait_vblank()
    fill_rect(int(oldp1x),int(oldp1y),P1.width,P1.height,color(0,0,0))
    fill_rect(int(oldp2x),int(oldp2y),P2.width,P2.height,color(0,0,0))
    fill_rect(int(oldbx),int(oldby),B.width,B.width,color(0,0,0))
    fill_rect(int(P1.x),int(P1.y),P1.width,P1.height,color(0,0,255))
    fill_rect(int(P2.x),int(P2.y),P2.width,P2.height,color(255,0,0))
    fill_rect(int(B.x),int(B.y),B.width,B.width,color(255,255,255))
    draw_string(str(score1),int(WIDTH/4),16)
    draw_string(str(score2),int(3*WIDTH/4),16)