#!/usr/bin/python import time import threading import sys import blup.frame import blup.output sys.path.append('/var/tmp/r0ket/tools/game') #sys.path.append('/var/tmp/r0ket_misc/game_noprint') import r0ketrem0te.game import pong logo = [ [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0], [1,0,1,0,1,0,0,1,0,1,1,0,1,0,1,0,0,1], [1,0,1,0,1,0,0,1,0,1,0,1,1,0,1,0,0,0], [1,1,1,0,1,0,0,1,0,1,0,0,1,0,1,0,1,1], [1,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1], [1,0,0,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ] onePlayer = [ [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0], [0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0], [0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0], [0,0,0,1,0,0,1,1,1,1,0,0,0,0,1,0,0,0], [0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ] def convertPixels(dimension, pixels): p = [] maxval = dimension.depth - 1 for i in range(len(pixels)): row = [] for j in range(len(pixels[i])): if pixels[i][j] == 1: row.append((maxval, maxval, maxval)) else: row.append((0,0,0)) p.append(row) return p class R0ketPongPlayer(object): def __init__(self, playground, ownPaddle, r0ketPlayer): self.__playground = playground self.__ownPaddle = ownPaddle self.__r0ketPlayer = r0ketPlayer self.__ready = False @property def ownPaddle(self): return self.__ownPaddle @property def ready(self): return self.__ready def receivedPacket(self, packet): if self.__r0ketPlayer is not None: if packet.id == self.__r0ketPlayer.id: if isinstance(packet, r0ketrem0te.packets.Button): print 'button=', packet.button if packet.button == 1: self.__ownPaddle.nextMoveUp() print 'up' if packet.button == 2: self.__ownPaddle.nextMoveDown() print 'down' if packet.button == 16: self.__ready = True class R0ketPong(object): def __init__(self, out, color=False, port='/dev/ttyACM0', gameName='pong'): self.__playground = None self.__out = out self.__rem0te = r0ketrem0te.game.Game(port, gameName, 83, 87, [ord(x) for x in 'REM0T'], 2, False) self.__rem0te.registerPlayerCallback(self.playerCallback) self.__color = color self.__players = [] self.__playersChangedCondition = threading.Condition() if color: self.__dimension = blup.frame.FrameDimension(18, 8, 8, 3) else: self.__dimension = blup.frame.FrameDimension(18, 8, 2, 1) def playerCallback(self, action, player): if self.__playground is None: return print '\n\n\n\nplayer added',player,'\n\n\n\n' if action == 'added' and len(self.__players) < 2: if len(self.__players) == 0: playerPaddle = self.__playground.leftPaddle else: playerPaddle = self.__playground.rightPaddle player = R0ketPongPlayer(self.__playground, playerPaddle, player) self.__rem0te.bridge.registerCallback(player.receivedPacket) self.__players.append(player) with self.__playersChangedCondition: self.__playersChangedCondition.notifyAll() def runGame(self): print 'starting a game...' scoreLeft = 0 scoreRight = 0 self.__playground = pong.Playground(18, 8) pp = pong.PlaygroundPainter(out, self.__dimension, self.__playground) while len(self.__players) == 0: print 'waiting for player...' with self.__playersChangedCondition: self.__playersChangedCondition.wait() frame = blup.frame.Frame(self.__dimension) global onePlayer if self.__color: frame.pixels = convertPixels(self.__dimension, onePlayer) else: frame.pixels = onePlayer self.__out.sendFrame(frame) while len(self.__players) == 1 and not self.__players[0].ready: print 'waiting for another player...' time.sleep(1) self.__out.sendFrame(frame) frame = blup.frame.Frame(self.__dimension) global logo if self.__color: frame.pixels = convertPixels(self.__dimension, logo) else: frame.pixels = logo self.__out.sendFrame(frame) time.sleep(1) if len(self.__players) == 1: bot = pong.PongBot(self.__playground, self.__playground.rightPaddle, 2) self.__players.append(bot) while max(scoreLeft, scoreRight) < 9: winner = self.__playground.play() if winner is self.__players[0].ownPaddle: scoreLeft += 1 else: scoreRight += 1 pong.displayScore(self.__out, self.__dimension, scoreLeft, scoreRight, 3000) for i in range(3): frame = blup.frame.Frame(self.__dimension) self.__out.sendFrame(frame) time.sleep(0.5) pong.displayScore(self.__out, self.__dimension, scoreLeft, scoreRight, 500) frame = blup.frame.Frame(self.__dimension) self.__out.sendFrame(frame) self.__playground = None self.__players = [] out = blup.output.getOutput('e3blp:localhost:4242') p0ng = R0ketPong(out, color=True) while True: p0ng.runGame() sys.exit(0)