From 6fa8e86097b6ad0512906dc3c774940d13c614a8 Mon Sep 17 00:00:00 2001 From: Matt Mets Date: Sun, 2 Sep 2018 22:27:35 +0100 Subject: [PATCH] Pong! --- pong/main.py | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 pong/main.py diff --git a/pong/main.py b/pong/main.py new file mode 100644 index 0000000..1c1ef7b --- /dev/null +++ b/pong/main.py @@ -0,0 +1,220 @@ +"""Pong!""" + +___name___ = "Pong" +___license___ = "WTFPL" +___categories___ = ["Games"] +___dependencies___ = ["dialogs", "app", "ugfx_helper", "random", "sleep", "buttons"] + +import math, ugfx, ugfx_helper, random, sleep, buttons, time +from tilda import Buttons + +ugfx_helper.init() + +SCREEN_WIDTH = ugfx.width() +SCREEN_HEIGHT = ugfx.height() + +bgColor = ugfx.BLACK +ballColor = ugfx.html_color(0x00FF00) +paddleColor = ugfx.html_color(0x00FF00) +netColor = ugfx.html_color(0x00FF00) + +class Paddle(): + height = 6 + width = 60 + + moveSpeed = 4 + + needsRedraw = True + + def __init__(self, type): + self.type = type + + self.x = SCREEN_WIDTH/2 + self.previousX = self.x + + if type == 0: + self.y = self.height/2 + else: + self.y = SCREEN_HEIGHT - (self.height/2) + + def draw(self): + if self.needsRedraw: + ugfx.area(int(self.previousX-self.width/2),int(self.y-self.height/2),int(self.width),int(self.height),bgColor) + self.needsRedraw = False + + ugfx.area(int(self.x-self.width/2),int(self.y-self.height/2),int(self.width),int(self.height),paddleColor) + + def update(self): + if self.type == 1: + if Buttons.is_pressed(Buttons.BTN_Hash): + self.needsRedraw = True + self.previousX = self.x + self.x += self.moveSpeed + + if Buttons.is_pressed(Buttons.BTN_Star): + self.needsRedraw = True + self.previousX = self.x + self.x -= self.moveSpeed + if self.type == 0: + if Buttons.is_pressed(Buttons.BTN_3): + self.needsRedraw = True + self.previousX = self.x + self.x += self.moveSpeed + if Buttons.is_pressed(Buttons.BTN_1): + self.needsRedraw = True + self.previousX = self.x + self.x -= self.moveSpeed + + if self.x + self.width/2 > SCREEN_WIDTH: + self.x = SCREEN_WIDTH - self.width/2 + + if self.x -self.width/2 < 0: + self.x = self.width/2 + +class Ball(): + size = 10 + + x = 0 + y = 0 + + yDeathOffset = 5+3 + + def __init__(self): + self.x = random.randint(30,SCREEN_WIDTH-30) + + self.y = SCREEN_HEIGHT/2 + + self.vX = 3 + + if random.randrange(2) == 1: + self.vY = 3 + else: + self.vY = -3 + + self.previousX = self.x + self.previousY = self.y + + self.dead = False + + def draw(self): + ugfx.area(int(self.previousX-self.size/2),int(self.previousY-self.size/2),int(self.size),int(self.size),bgColor) + ugfx.area(int(self.x-self.size/2),int(self.y-self.size/2),int(self.size),int(self.size),ballColor) + + def update(self, topPaddle, bottomPaddle): + self.previousX = self.x + self.previousY = self.y + + self.x += self.vX + self.y += self.vY + + if self.x > SCREEN_WIDTH: + self.x = SCREEN_WIDTH + self.vX = -self.vX + + if self.x < 0: + self.x = 0 + self.vX = -self.vX + + if self.y > (SCREEN_HEIGHT - self.yDeathOffset): + if (self.x > (bottomPaddle.x - bottomPaddle.width/2)) and (self.x < (bottomPaddle.x + bottomPaddle.width/2)): + self.y = SCREEN_HEIGHT - self.yDeathOffset + self.vY = -self.vY + bottomPaddle.needsRedraw = True + else: + self.dead = True + + + if self.y < self.yDeathOffset: + if (self.x > (topPaddle.x - topPaddle.width/2)) and (self.x < (topPaddle.x + topPaddle.width/2)): + self.y = self.yDeathOffset + self.vY = -self.vY + topPaddle.needsRedraw = True + else: + self.dead = True + + def isDead(self): + return self.dead + +def one_round(): + ball = Ball() + topPaddle = Paddle(0) + bottomPaddle = Paddle(1) + + ugfx.clear(bgColor) + ugfx.backlight(100) + + ugfx.set_default_font(ugfx.FONT_TITLE) + + while True: + topPaddle.update() + bottomPaddle.update() + ball.update(topPaddle, bottomPaddle) + + if ball.isDead(): + if(ball.y > SCREEN_HEIGHT/2): + return [1,0] + else: + return [0,1] + + topPaddle.draw() + bottomPaddle.draw() + ball.draw() + + #draw the net + for i in range(0,7): + ugfx.area(int(i*2*SCREEN_WIDTH/13), int(SCREEN_HEIGHT/2-1), int(SCREEN_WIDTH/13), 3, netColor) + + ugfx.orientation(0) + ugfx.text(130, 0, "%d " % (points[0]),netColor) + ugfx.text(170, 0, "%d " % (points[1]),netColor) + ugfx.orientation(270) + + time.sleep_ms(1) + +minScore = 9 + +points = [0,0] +playing = 1 +while playing: + points[0] = 0 + points[1] = 0 + + while (points[0] < minScore) and (points[1] < minScore): + score = one_round() + + points[0] = points[0] + score[0] + points[1] = points[1] + score[1] + + ugfx.area(0,0,ugfx.width(),ugfx.height(),0) + + ugfx.orientation(90) + ugfx.set_default_font(ugfx.FONT_TITLE) + ugfx.text(30, 138, "GAME ",ballColor) + ugfx.text(30, 158, "OVER ",ballColor) + + ugfx.set_default_font(ugfx.FONT_SMALL) + ugfx.text(70, 220, "Score: %d - %d " % (points[0], points[1]), ballColor) + ugfx.text(36, 260, "Press A to play again ", ballColor) + ugfx.text(40, 280, "Press MENU to quit " , ballColor) + + ugfx.orientation(270) + ugfx.set_default_font(ugfx.FONT_TITLE) + ugfx.text(30, 138, "GAME ",ballColor) + ugfx.text(30, 158, "OVER ",ballColor) + + ugfx.set_default_font(ugfx.FONT_SMALL) + ugfx.text(70, 220, "Score: %d - %d " % (points[1], points[0]), ballColor) + ugfx.text(36, 260, "Press A to play again ", ballColor) + ugfx.text(40, 280, "Press MENU to quit ", ballColor) + + while True: + sleep.wfi() + if buttons.is_triggered(Buttons.BTN_A): + break + + if buttons.is_triggered(Buttons.BTN_Menu): + playing = 0 + break + +app.restart_to_default() +