From 9c8d04114c13da9f6048e080c2a4e388de249b18 Mon Sep 17 00:00:00 2001 From: Jeena Paradies Date: Tue, 12 Apr 2011 17:50:34 +0200 Subject: [PATCH] added initial pong bots --- games/Pong-bots/ggs-delegate.rb | 15 ++++++ games/Pong-bots/ggs-network.rb | 83 +++++++++++++++++++++++++++++++++ games/Pong-bots/pong-bot.rb | 29 ++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 games/Pong-bots/ggs-delegate.rb create mode 100644 games/Pong-bots/ggs-network.rb create mode 100644 games/Pong-bots/pong-bot.rb diff --git a/games/Pong-bots/ggs-delegate.rb b/games/Pong-bots/ggs-delegate.rb new file mode 100644 index 0000000..be4cc47 --- /dev/null +++ b/games/Pong-bots/ggs-delegate.rb @@ -0,0 +1,15 @@ +module GGSDelegate + + def ggsNetworkReady(ggs_network, ready) + raise "ggsNetworkReady(ggs_network, ready) must be overridden" + end + + def ggsNetworkDefined(ggs_network, defined) + raise "ggsNetworkDefined(ggs_network, defined) must be overridden" + end + + def ggsNetworkReceivedCommandWithArgs(ggs_network, command, args) + raise "ggsNetworkReceivedCommandWithArgs(ggs_network, command, args) must be overridden" + end + +end \ No newline at end of file diff --git a/games/Pong-bots/ggs-network.rb b/games/Pong-bots/ggs-network.rb new file mode 100644 index 0000000..1a1e820 --- /dev/null +++ b/games/Pong-bots/ggs-network.rb @@ -0,0 +1,83 @@ +require 'socket' + +class GGSNetwork + + SERVER = "Server" + CLIENT = "Client" + + public + + attr_accessor :delegate + + def initialize(delegate, host='localhost', port=9000) + connect(host, port) + @delegate = delegate + end + + def define(source_code) + write( makeMessage(SERVER, "define", source_code) ) + end + + def sendCommand(command, args="") + write( makeMessage(CLIENT, command, args) ) + end + + protected + + def connect(host, port) + gs = TCPSocket.open(host, port) + @socket = gs.accept + Thread.start(@socket) { |s| read(s) } + end + + def write(message) + @socket.write(message) + end + + def read(s) + loop do + headers = {} + size = 0 + args = "" + + while (line = @socket.gets) != "\n" + key, value = line.split(": ") + headers[key] = value + end + + if headers.contains?("Content-Size") + headers["Content-Size"].to_i.times do + args << @socket.recv + end + end + + receivedCommand(headers, args) + end + end + + def receivedCommand(headers, data) + if headers.contains? "Client-Command" + command = headers["Client-Command"] + case command + when "hello" + @delegate.ggsNetworkReady(self, true) + when "defined" + @delegate.ggsNetworkDefined(self, true) + else + @delegate.ggsNetworkReceivedCommandWithArgs(self, command, data) + end + end + end + + def makeMessage(serverOrGame, command, args) + message =<