Browse Source

Update the client and GUI to receive coordinates of all live stones

master
Peter J. Jones 7 years ago
parent
commit
1b7d2cd755
3 changed files with 56 additions and 12 deletions
  1. 1
    0
      .gitignore
  2. 15
    5
      lib/freeplay/client.rb
  3. 40
    7
      lib/freeplay/gui.rb

+ 1
- 0
.gitignore View File

@@ -15,3 +15,4 @@ spec/reports
test/tmp
test/version_tmp
tmp
/freeplay.log

+ 15
- 5
lib/freeplay/client.rb View File

@@ -142,12 +142,16 @@ class Freeplay::Client < EM::Connection

##############################################################################
# Game over.
def game (status)
logger.info(status)
def game (info)
logger.info("game over")

s = StringIO.new
@player.board.dump(s)
logger.debug("Final board state: \n#{s.string}")
if (data = info.split(/\s*,\s*/)).size == 3
winner, white_live, black_live = data
logger.info("#{winner} won")
gui.live(parse_live(white_live), parse_live(black_live)) if gui
else
error("invalid game over command from server")
end
end

##############################################################################
@@ -157,6 +161,12 @@ class Freeplay::Client < EM::Connection
EventMachine.stop
end

##############################################################################
# Parse the live stone coordinates from the server.
def parse_live (info)
info.split(/\s*;\s*/).map {|s| s.split(/\s+/).map {|n| n.to_i}}
end

##############################################################################
# Output an error message and die!
def error (message)

+ 40
- 7
lib/freeplay/gui.rb View File

@@ -5,8 +5,14 @@ class Freeplay::GUI

##############################################################################
COLORS_NORMAL = {
:black => Gdk::Color.parse("#000000"),
:white => Gdk::Color.parse("#ffffff"),
:black => Gdk::Color.parse("#000000"),
}

##############################################################################
COLORS_LIVE = {
:white => Gdk::Color.parse("#f0e68c"),
:black => Gdk::Color.parse("#8b5a2b"), # ("#532f00"),
}

##############################################################################
@@ -26,16 +32,19 @@ class Freeplay::GUI
##############################################################################
def move (player, x, y)
opponent = player == :black ? :white : :black
x, y = @board.send(:transform, x, y)

cell = @grid[x][y]
cell[:label].text = @counts[player].to_s
cell[:box].modify_bg(Gtk::STATE_NORMAL, COLORS_NORMAL[player])
cell[:label].modify_fg(Gtk::STATE_NORMAL, COLORS_NORMAL[opponent])
x, y = transform(x, y)
bg, fg = COLORS_NORMAL[player], COLORS_NORMAL[opponent]

update_color(x, y, bg, fg, @counts[player])
@counts[player] += 1
end

##############################################################################
def live (white_live, black_live)
update_live_stones(:white, white_live)
update_live_stones(:black, black_live)
end

##############################################################################
private

@@ -72,4 +81,28 @@ class Freeplay::GUI

table
end

##############################################################################
def update_live_stones (color, coordinates)
opposite = color == :white ? :black : :white

coordinates.each do |(x, y)|
tx, ty = transform(x, y)
update_color(tx, ty, COLORS_LIVE[color], COLORS_NORMAL[opposite])
end
end

##############################################################################
def update_color (x, y, bg, fg, count=nil)
cell = @grid[x][y]
cell[:box].modify_bg(Gtk::STATE_NORMAL, bg)
cell[:label].modify_fg(Gtk::STATE_NORMAL, fg)
cell[:label].text = count.to_s if count
end

##############################################################################
# Translates game board coordinates to GTK table coordinates.
def transform (x, y)
[x, @board.size - 1 - y]
end
end

Loading…
Cancel
Save