You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
4.7 KiB
179 lines
4.7 KiB
8 years ago
|
#!/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)
|
||
|
|
||
|
|
||
|
|