added initial pong bots
This commit is contained in:
parent
865c963ad6
commit
9c8d04114c
3 changed files with 127 additions and 0 deletions
15
games/Pong-bots/ggs-delegate.rb
Normal file
15
games/Pong-bots/ggs-delegate.rb
Normal file
|
@ -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
|
83
games/Pong-bots/ggs-network.rb
Normal file
83
games/Pong-bots/ggs-network.rb
Normal file
|
@ -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 =<<MESSAGE
|
||||||
|
Token: #{@game_t oken}
|
||||||
|
#{serverOrGame}-Command: #{command}
|
||||||
|
Content-Length: #{args.length}
|
||||||
|
|
||||||
|
#{args}
|
||||||
|
MESSAGE
|
||||||
|
message
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
29
games/Pong-bots/pong-bot.rb
Normal file
29
games/Pong-bots/pong-bot.rb
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#!/usr/bin/env ruby -wKU
|
||||||
|
|
||||||
|
require 'ggs-network.rb'
|
||||||
|
require 'ggs-delegate.rb'
|
||||||
|
|
||||||
|
class PongBot
|
||||||
|
include GGSDelegate
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@ggs_network = GGSNetwork.new(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
def ggsNetworkReady(ggs_network, ready)
|
||||||
|
@ggs_network.sendCommand("ready")
|
||||||
|
end
|
||||||
|
|
||||||
|
def ggsNetworkDefined(ggs_network, defined)
|
||||||
|
# do nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
def ggsNetworkReceivedCommandWithArgs(ggs_network, command, args)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
if __FILE__ == $0
|
||||||
|
PongBot.new
|
||||||
|
end
|
Reference in a new issue