# Code to run Pong game except that updateGameState must
# be completed by you (it *runs* without error now but
# doesn't yield reasonable pong behavior) 
#
# To run the game do: 
#                    playPong(2.0)
# in the command window. Note: 2.0 is just an example speed.
# You can try different numbers.
#
# I strongly recommend that you don't change *any* code
# below the long line of #####'s
#

# This is the function you need to change.  This bare-bones 
# version runs without error but simply makes the ball
# move straight to the right and then off the screen.
#
def updateGameState(window, ballX, ballY, ballSize, ballSpeed, ballXDir, ballYDir, paddleX, paddleY, paddleWidth, paddleHeight):

  # To do thing correctly you should compute new
  # values for ballX, ballY, ballXDir, and ballYDir
  newBallX = ballX + 1
  
  # send the new values to the game 
  setNewState(newBallX, ballY, ballXDir, ballYDir)


#############################################################
#
# Recommendation: don't change any code below here
#
#############################################################

import time
import javax.swing as swing
import java
import thread


class gameState:
  def __init__(self, speed):

    self.window = makeEmptyPicture(300,300)
    self.ballX = 200.0
    self.ballY = 100.0
    self.ballSize = 10
    self.ballSpeed = speed
    self.ballXDir = .7
    self.ballYDir = sqrt(1-(self.ballXDir*self.ballXDir))

    self.paddleX = 10
    self.paddleY = 150
    self.paddleWidth = 10
    self.paddleHeight = 30

    self.done = 0
     
def gameThread():

    picture = gameState.window
    width = getWidth(picture)
    height = getHeight(picture)

    while (gameState.done == 0):      

      addRectFilled(picture, 1, 1, width, height, white)
      addRectFilled(picture,int(gameState.ballX), int(gameState.ballY), gameState.ballSize, gameState.ballSize, black)
      addRectFilled(picture, gameState.paddleX, gameState.paddleY, gameState.paddleWidth, gameState.paddleHeight, black)
   
      updateGameState(picture, gameState.ballX, gameState.ballY, gameState.ballSize, gameState.ballSpeed, gameState.ballXDir, gameState.ballYDir, gameState.paddleX, gameState.paddleY, gameState.paddleWidth, gameState.paddleHeight)
     
      repaint(picture)      
      time.sleep(.033)

class pongWindow(swing.JFrame):
  def __init__(self):
      
    swing.JFrame.__init__(self,title = "Pong Controls", size = (200,100))
    self.contentPane.layout = java.awt.FlowLayout()
    self.b1 = swing.JButton("Up", size = (20,20), actionPerformed = self.Up)
    self.contentPane.add(self.b1)
    self.b2 = swing.JButton("Down", size = (20,20), actionPerformed = self.Down)
    self.contentPane.add(self.b2)
    self.b3 = swing.JButton("Quit", size = (30,20), actionPerformed = self.Done)
    self.contentPane.add(self.b3)
  
    self.setLocation(300,1)
    show(gameState.window)
    self.gameThread = thread.start_new_thread(gameThread, ())
    self.visible = 1

  def Up(self, event):
    gameState.paddleY = gameState.paddleY - 3

  def Down(self, event):
    gameState.paddleY = gameState.paddleY + 3

  def Done(self,event):
    gameState.done = 1

def setNewState(newBallX, newBallY, newBallXDir, newBallYDir):
  gameState.ballX = newBallX
  gameState.ballY = newBallY
  gameState.ballXDir = newBallXDir
  gameState.ballYDir = newBallYDir
  
def playPong(ballSpeed):
  global gameState
  gameState = gameState(ballSpeed)
  window = pongWindow()  

