Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/1.pngbin0 -> 5002 bytes
-rw-r--r--src/gui/1selected.pngbin0 -> 4970 bytes
-rw-r--r--src/gui/2.pngbin0 -> 2913 bytes
-rw-r--r--src/gui/2selected.pngbin0 -> 2929 bytes
-rw-r--r--src/gui/3.pngbin0 -> 3238 bytes
-rw-r--r--src/gui/3selected.pngbin0 -> 3356 bytes
-rw-r--r--src/gui/4.pngbin0 -> 5349 bytes
-rw-r--r--src/gui/4selected.pngbin0 -> 5260 bytes
-rw-r--r--src/gui/5.pngbin0 -> 5434 bytes
-rw-r--r--src/gui/5selected.pngbin0 -> 5395 bytes
-rw-r--r--src/gui/6.pngbin0 -> 5372 bytes
-rw-r--r--src/gui/6selected.pngbin0 -> 5387 bytes
-rw-r--r--src/gui/7.pngbin0 -> 5175 bytes
-rw-r--r--src/gui/7selected.pngbin0 -> 5164 bytes
-rw-r--r--src/gui/8.pngbin0 -> 3538 bytes
-rw-r--r--src/gui/8selected.pngbin0 -> 3634 bytes
-rw-r--r--src/gui/9.pngbin0 -> 3307 bytes
-rw-r--r--src/gui/9selected.pngbin0 -> 3358 bytes
-rw-r--r--src/gui/BoardUI.py244
-rw-r--r--src/gui/Button.py28
-rw-r--r--src/gui/Cell.py38
-rw-r--r--src/gui/GameMain.py116
-rw-r--r--src/gui/Player.py9
-rw-r--r--src/gui/__init__.py0
-rw-r--r--src/gui/background.pngbin0 -> 52615 bytes
-rw-r--r--src/gui/instructions.pngbin0 -> 132322 bytes
-rw-r--r--src/gui/instructions.svg252
-rw-r--r--src/gui/instructions_button.pngbin0 -> 4418 bytes
-rw-r--r--src/gui/player_win.pngbin0 -> 1865 bytes
-rw-r--r--src/gui/quinteti-new.pngbin0 -> 4271 bytes
30 files changed, 687 insertions, 0 deletions
diff --git a/src/gui/1.png b/src/gui/1.png
new file mode 100644
index 0000000..c8406dc
--- /dev/null
+++ b/src/gui/1.png
Binary files differ
diff --git a/src/gui/1selected.png b/src/gui/1selected.png
new file mode 100644
index 0000000..d7bb372
--- /dev/null
+++ b/src/gui/1selected.png
Binary files differ
diff --git a/src/gui/2.png b/src/gui/2.png
new file mode 100644
index 0000000..73477b5
--- /dev/null
+++ b/src/gui/2.png
Binary files differ
diff --git a/src/gui/2selected.png b/src/gui/2selected.png
new file mode 100644
index 0000000..394e837
--- /dev/null
+++ b/src/gui/2selected.png
Binary files differ
diff --git a/src/gui/3.png b/src/gui/3.png
new file mode 100644
index 0000000..03a2215
--- /dev/null
+++ b/src/gui/3.png
Binary files differ
diff --git a/src/gui/3selected.png b/src/gui/3selected.png
new file mode 100644
index 0000000..7d52ce8
--- /dev/null
+++ b/src/gui/3selected.png
Binary files differ
diff --git a/src/gui/4.png b/src/gui/4.png
new file mode 100644
index 0000000..8e254cd
--- /dev/null
+++ b/src/gui/4.png
Binary files differ
diff --git a/src/gui/4selected.png b/src/gui/4selected.png
new file mode 100644
index 0000000..9554a85
--- /dev/null
+++ b/src/gui/4selected.png
Binary files differ
diff --git a/src/gui/5.png b/src/gui/5.png
new file mode 100644
index 0000000..1ff2e49
--- /dev/null
+++ b/src/gui/5.png
Binary files differ
diff --git a/src/gui/5selected.png b/src/gui/5selected.png
new file mode 100644
index 0000000..7b35178
--- /dev/null
+++ b/src/gui/5selected.png
Binary files differ
diff --git a/src/gui/6.png b/src/gui/6.png
new file mode 100644
index 0000000..bea0349
--- /dev/null
+++ b/src/gui/6.png
Binary files differ
diff --git a/src/gui/6selected.png b/src/gui/6selected.png
new file mode 100644
index 0000000..72be814
--- /dev/null
+++ b/src/gui/6selected.png
Binary files differ
diff --git a/src/gui/7.png b/src/gui/7.png
new file mode 100644
index 0000000..58af7ad
--- /dev/null
+++ b/src/gui/7.png
Binary files differ
diff --git a/src/gui/7selected.png b/src/gui/7selected.png
new file mode 100644
index 0000000..9eab0ee
--- /dev/null
+++ b/src/gui/7selected.png
Binary files differ
diff --git a/src/gui/8.png b/src/gui/8.png
new file mode 100644
index 0000000..d5031b7
--- /dev/null
+++ b/src/gui/8.png
Binary files differ
diff --git a/src/gui/8selected.png b/src/gui/8selected.png
new file mode 100644
index 0000000..3120ea0
--- /dev/null
+++ b/src/gui/8selected.png
Binary files differ
diff --git a/src/gui/9.png b/src/gui/9.png
new file mode 100644
index 0000000..05d27c9
--- /dev/null
+++ b/src/gui/9.png
Binary files differ
diff --git a/src/gui/9selected.png b/src/gui/9selected.png
new file mode 100644
index 0000000..ab4e6ba
--- /dev/null
+++ b/src/gui/9selected.png
Binary files differ
diff --git a/src/gui/BoardUI.py b/src/gui/BoardUI.py
new file mode 100644
index 0000000..5cf5792
--- /dev/null
+++ b/src/gui/BoardUI.py
@@ -0,0 +1,244 @@
+import pygame
+from pygame.locals import *
+from logic.GameState import GameState
+
+from Button import Button
+from Cell import Cell
+from Player import Player
+
+file_dir = "gui/"
+
+image_fondo = file_dir + "background.png"
+image_tablero = file_dir + "tablero.png"
+image_null = "nulo.bmp"
+image_number = "<N>.png"
+image_disabled_number = "<N>selected.png"
+image_size = pygame.Rect(0, 0, 97, 97)
+
+new_image_coords = (180, 87)
+new_image = "quinteti-new.png"
+
+instructions_coords = (950, 745)
+instructions_button = "instructions_button.png"
+instructions_image = "instructions.png"
+
+player_win_image = "player_win.png"
+
+font_name = "DejaVu Serif" #"DejaVuLGCSerif.ttf" # None to load pygame default font
+font_size = 24
+user_font_color = (255, 255, 255)
+
+class BoardUI:
+
+ # Center of initial number positions
+ number_locations = [
+ ([756+138*0, 231+138*0]),
+ ([756+138*1, 231+138*0]),
+ ([756+138*2, 231+138*0]),
+ ([756+138*0, 231+138*1]),
+ ([756+138*1, 231+138*1]),
+ ([756+138*2, 231+138*1]),
+ ([756+138*0, 231+138*2]),
+ ([756+138*1, 231+138*2]),
+ ([756+138*2, 231+138*2])]
+
+ screen = None
+ # Center of board cells
+ locations = [
+ ([267, 228]),
+ ([404, 228]),
+ ([541, 228]),
+ ([267, 367]),
+ ([404, 367]),
+ ([541, 367]),
+ ([267, 510]),
+ ([404, 510]),
+ ([541, 510])]
+
+ players_name_midleft_location = [
+ (200, 667),
+ (200, 752)]
+
+ players_score_center_location = [
+ (581, 667),
+ (581, 752)]
+
+ players_score_box_location = [
+ (173, 628),
+ (173, 714)]
+
+ def __init__(self, screen, game = None):
+ self.font = None
+ if font_name:
+ self.font = pygame.font.SysFont(font_name, font_size)
+
+ if not self.font:
+ self.font = pygame.font.Font(None, font_size)
+
+ self.screen = screen
+ self.game = game
+ self.showing_instructions = False
+ self.initBoard()
+
+ def initBoard (self):
+ self.new_button = Button(new_image_coords, file_dir + new_image, self.new_game)
+ self.instructions_button = Button(instructions_coords, file_dir + instructions_button, self.show_instructions)
+ self.cells = []
+ self.numbers = []
+ self.lastSelectedBoardCell = None
+ self.lastSelectedNumberCell = None
+
+ self.backgroundImage = pygame.image.load(image_fondo)
+
+ self.initCells()
+ self.initNumbers()
+
+ # Creates a sprite group, with all the board visible elements inside
+ self.paintBackground()
+ self.items = pygame.sprite.Group()
+ self.items.add(self.new_button)
+ self.items.add(self.instructions_button)
+ for c in self.cells:
+ if c.image:
+ self.items.add( c )
+
+ for n in self.numbers:
+ if n.image:
+ self.items.add( n )
+
+ def new_game(self):
+ self.game = GameState("", "")
+ self.initBoard()
+
+ def initCells(self):
+ i = 1
+ for row in range(1,4):
+ for col in range(1,4):
+ if self.game:
+ number = self.game.get_cell(row, col)[0]
+ else:
+ number = None
+ location = self.locations[i-1]
+ self.cells.append( Cell(location, self.get_number_name(number), i, image_size) )
+ i += 1
+
+ def initNumbers(self):
+ k = 0
+ for location in self.number_locations:
+ k += 1
+ self.numbers.append(Cell(location, self.get_number_name(k), k, image_size))
+
+ def setPlayers (self, namePlayer1, namePlayer2):
+ self.game = GameState(namePlayer1, namePlayer2)
+
+ def paintBackground(self):
+ rect = self.backgroundImage.get_rect()
+ rect.topleft = (0, 0)
+ self.screen.blit(self.backgroundImage, rect)
+
+ def paint_winner(self, i):
+ image = pygame.image.load(file_dir + player_win_image)
+ rect = image.get_rect()
+ rect.topleft = self.players_score_box_location[i]
+ self.screen.blit(image, rect)
+
+ def paintPlayersStatus(self):
+ player1Name = ""
+ player2Name = ""
+
+ if (self.game):
+ for i in range(1,3):
+ if self.game.get_enabled_player():
+ if self.game.get_enabled_player() == i:
+ self.font.set_bold(True)
+ else:
+ self.font.set_bold(False)
+ else:
+ if self.game.get_player_score(i) >= self.game.get_player_score(3-i):
+ self.paint_winner(i-1)
+
+ player_name = self.game.get_player_name(i)
+ #str_player = 'Jugador %s: %s' % (i, player_name)
+ str_player = 'Jugador %s' % (i)
+ name_surface = self.font.render(str_player, 1, user_font_color)
+ name_rect = name_surface.get_rect()
+ name_rect.midleft = self.players_name_midleft_location[i-1]
+ self.screen.blit(name_surface, name_rect)
+
+ player_score = self.game.get_player_score(i)
+ str_player_score = '%s' % (player_score)
+ score_surface = self.font.render(str_player_score, 1, user_font_color)
+ score_rect = score_surface.get_rect()
+ score_rect.center = self.players_score_center_location[i-1]
+ self.screen.blit(score_surface, score_rect)
+
+ def paintBoardElements(self):
+ # Using an sprite group all the items are painted:
+
+ #self.items.clear(self.screen, self.backgroundImage) # If only sprites are cleared, players scores remain
+ self.paintBackground() # Instead, the whole background is repainted
+ self.items.draw(self.screen)
+ self.paintPlayersStatus()
+
+ if self.showing_instructions:
+ self.paint_instructions()
+
+ def paint_instructions(self):
+ image = pygame.image.load(file_dir + instructions_image)
+ rect = image.get_rect()
+ rect.center = self.screen.get_rect().center
+ self.screen.blit(image, rect)
+
+ def processXY(self, x, y):
+ # If is showing instructions, it disables them
+ if self.showing_instructions:
+ self.showing_instructions = False
+ return
+ else:
+ if self.instructions_button.coordsIn(x, y):
+ self.instructions_button.callback()
+
+ # Checks if the selected coordinate is a board cell
+ isCell = False
+ for c in self.cells:
+ if c.coordsIn(x,y):
+ isCell = True
+ self.lastSelectedBoardCell = c
+ if self.lastSelectedNumberCell != None:
+ row, col = c.get_pos()
+ player = self.game.get_enabled_player()
+ ok = self.game.make_move(row, col, self.lastSelectedNumberCell.idxCell, player)
+ if ok:
+ self.lastSelectedBoardCell.setImage( self.get_number_name(self.lastSelectedNumberCell.idxCell) )
+ self.items.add(self.lastSelectedBoardCell)
+ self.items.remove(self.lastSelectedNumberCell)
+ self.lastSelectedNumberCell.setImage(None)
+ self.lastSelectedNumberCell = None
+ break
+
+ # Checks if the selected coordinate is a number
+ if isCell == False:
+ for n in self.numbers:
+ if n.coordsIn(x,y):
+ if self.lastSelectedNumberCell:
+ self.lastSelectedNumberCell.setImage( self.get_number_name(self.lastSelectedNumberCell.idxCell) )
+ self.lastSelectedNumberCell = n
+ n.setImage( self.get_disabled_number_name(n.idxCell) )
+
+ if self.new_button.coordsIn(x, y):
+ self.new_button.callback()
+
+ def show_instructions(self):
+ self.showing_instructions = True
+
+ def get_number_name(self, number):
+ if (number == None) or (number == 0):
+ return None
+ else:
+ return file_dir + image_number.replace("<N>", str(number))
+
+ def get_disabled_number_name(self, number):
+ if (number == None) or (number == 0):
+ return None
+ else:
+ return file_dir + image_disabled_number.replace("<N>", str(number))
diff --git a/src/gui/Button.py b/src/gui/Button.py
new file mode 100644
index 0000000..fb5b53d
--- /dev/null
+++ b/src/gui/Button.py
@@ -0,0 +1,28 @@
+import pygame
+
+class Button(pygame.sprite.Sprite):
+ def __init__(self, initial_position, nomImage, callback):
+
+ pygame.sprite.Sprite.__init__(self)
+
+ self.setImage(nomImage)
+ self.rect = self.image.get_rect()
+ self.rect.topleft = initial_position # Moves the recteangle to its predetermined center
+
+ self.callback = callback
+
+ def coordsIn(self, x, y):
+ #print "Test x: %s < %s < %s Test y: %s < %s < %s" % (self.rect.left, x, self.rect.right, self.rect.top, y, self.rect.bottom)
+ if ( self.rect.collidepoint(x, y) ):
+ return True
+ return False
+
+ def setImage(self, nomImage):
+ if nomImage:
+ self.image = pygame.image.load(nomImage)
+ else:
+ self.image = None
+
+# Codigo para debug de este modulo:
+#if __name__ == "__main__":
+
diff --git a/src/gui/Cell.py b/src/gui/Cell.py
new file mode 100644
index 0000000..12adf05
--- /dev/null
+++ b/src/gui/Cell.py
@@ -0,0 +1,38 @@
+import pygame
+
+class Cell(pygame.sprite.Sprite):
+ def __init__(self, initial_position, nomImage, idxCell, size):
+
+ pygame.sprite.Sprite.__init__(self)
+
+ self.idxCell = idxCell
+
+ self.rect = size.move(0, 0) # Attemping to move creates a copy
+ self.rect.center = initial_position # Moves the recteangle to its predetermined center
+
+ self.setImage(nomImage)
+
+ def coordsIn(self, x, y):
+ #print "Test x: %s < %s < %s Test y: %s < %s < %s" % (self.rect.left, x, self.rect.right, self.rect.top, y, self.rect.bottom)
+ if ( self.rect.collidepoint(x, y) ):
+ return True
+ return False
+
+ def setImage(self, nomImage):
+ if nomImage:
+ self.image = pygame.image.load(nomImage)
+ self.nameImage = nomImage
+ else:
+ self.image = None
+ self.nameImage = None
+
+ def get_pos(self):
+ row = (self.idxCell - 1) / 3 + 1
+ col = (self.idxCell - 1) % 3 + 1
+ return row, col
+
+# Codigo para debug de este modulo:
+if __name__ == "__main__":
+ cell = Cell([0, 0], "nulo.bmp", 6)
+ row, col = cell.get_pos()
+ print "%s %s" % (row, col)
diff --git a/src/gui/GameMain.py b/src/gui/GameMain.py
new file mode 100644
index 0000000..a842923
--- /dev/null
+++ b/src/gui/GameMain.py
@@ -0,0 +1,116 @@
+import pygame, olpcgames, logging
+from olpcgames import pausescreen
+from pygame.locals import *
+
+from BoardUI import BoardUI
+
+from logic.GameState import GameState
+
+#import logic.Mesh
+
+import os
+
+log = logging.getLogger( 'quinteti run' )
+log.setLevel( logging.DEBUG )
+
+MAX_FPS = 25 # Max frames per second
+SLEEP_TIMEOUT = 25 # Seconds until the PauseScreen if no events show up
+
+# El modulo se llama desde run.py.
+def main():
+ pygame.init()
+
+ internal_size = (1200, 825) # The game is designed to work in this size (xo display size)
+ target_size = (900, 619) # The game will be sown in this size, useful for testing in regular PCs with less resolution than xo
+
+ flags = 0
+ if olpcgames.ACTIVITY:
+ # Running as Activity
+ target_size = olpcgames.ACTIVITY.game_size
+ #logic.Mesh.init_mesh(log) # Mesh isn't ready in this version
+ #else:
+ # Uncomment this if want to execute fullscreen on regular PCs
+ # flags = pygame.FULLSCREEN
+ real_screen = pygame.display.set_mode(target_size, flags)
+
+ # The scale factor beetween internal and target
+ if internal_size == target_size:
+ scale = None
+ internal_screen = real_screen # The game works directly on the real screen
+ else:
+ # Running on regular PC, the screen its scaled to te target_size
+ internal_screen = pygame.Surface(internal_size)
+ scale = (internal_size[0] / float(target_size[0]), internal_size[1] / float(target_size[1]) )
+
+ # Creates a new logic game, player names aren't used without mesh
+ game = GameState("Jugador1", "Jugador2")
+ boardUI = BoardUI(internal_screen, game)
+ boardUI.paintBoardElements()
+
+ pygame.display.update()
+
+ clock = pygame.time.Clock()
+
+ # Comienza el bucle principal
+ update = True # La primera vez tiene que pintar la pantalla
+ running = True
+ while running:
+
+ # Waits for events, if none the game pauses:
+ # http://wiki.laptop.org/go/Game_development_HOWTO#Reducing_CPU_Load
+ milliseconds = clock.tick(MAX_FPS) # waits if the game is running faster than MAX_FPS
+ events = pausescreen.get_events(SLEEP_TIMEOUT) # Event-management loop with support for pausing after X seconds (20 here)
+
+ if events:
+ for event in events:
+ if event.type == pygame.QUIT:
+ running = False
+ elif event.type == pygame.KEYDOWN and (event.key == pygame.K_q or event.key == pygame.K_ESCAPE):
+ running = False
+
+ if event.type == pygame.MOUSEBUTTONDOWN:
+ if scale:
+ [x, y] = [coord*s for (coord, s) in zip(event.pos, scale)] # Multiplica las coordenadas realeas por el factor
+ # para llevarlas a coordenadas internas
+ else:
+ (x, y) = event.pos
+
+ boardUI.processXY(x, y)
+ update = True
+
+ if event.type == pygame.USEREVENT:
+ if event.code == olpcgames.FILE_READ_REQUEST:
+ game = read_file(event.filename)
+ log.debug("Loaded:" + game.serialization())
+ boardUI = BoardUI(internal_screen, game)
+ update = True
+ if event.code == olpcgames.FILE_WRITE_REQUEST:
+ save_file(event.filename, game)
+
+ if update == True:
+ boardUI.paintBoardElements()
+ if scale:
+ pygame.transform.scale(internal_screen, target_size, real_screen)
+ update = False
+
+ pygame.display.update()
+
+ # Una vez que sale del loop manda la senal de quit para que cierre la ventana
+ pygame.quit()
+
+def save_file(file, game):
+ string = game.serialization()
+ fsock = open(file, 'w')
+ fsock.write(string)
+ fsock.close()
+
+def read_file(file):
+ fsock = open(file, "r")
+ string = fsock.read()
+ fsock.close()
+ return GameState.fromString(string)
+
+# Codigo para debug de este modulo:
+if __name__ == "__main__":
+ logging.basicConfig()
+ main()
diff --git a/src/gui/Player.py b/src/gui/Player.py
new file mode 100644
index 0000000..051b2a7
--- /dev/null
+++ b/src/gui/Player.py
@@ -0,0 +1,9 @@
+
+class Player:
+ name = None
+
+ def __init__(self, name):
+ self.name = name
+
+ def getName(self):
+ return self.name \ No newline at end of file
diff --git a/src/gui/__init__.py b/src/gui/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/gui/__init__.py
diff --git a/src/gui/background.png b/src/gui/background.png
new file mode 100644
index 0000000..231a526
--- /dev/null
+++ b/src/gui/background.png
Binary files differ
diff --git a/src/gui/instructions.png b/src/gui/instructions.png
new file mode 100644
index 0000000..946b9da
--- /dev/null
+++ b/src/gui/instructions.png
Binary files differ
diff --git a/src/gui/instructions.svg b/src/gui/instructions.svg
new file mode 100644
index 0000000..5cd917a
--- /dev/null
+++ b/src/gui/instructions.svg
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="800"
+ height="500"
+ id="svg3656"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ version="1.0"
+ sodipodi:docname="instructions.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/pmoleri/quin-te-ti.activity/src/gui/instructions.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs3658">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective3664" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.79"
+ inkscape:cx="415.98232"
+ inkscape:cy="208.49925"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1219"
+ inkscape:window-height="728"
+ inkscape:window-x="51"
+ inkscape:window-y="25" />
+ <metadata
+ id="metadata3661">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ d="M 66.466056,2.9999985 C 31.471654,2.9999985 3.0000001,20.712973 3.0000001,42.48634 L 3.0000001,457.51364 C 3.0000001,479.287 31.469936,497 66.466056,497 L 733.53565,497 C 768.53178,497 796.99999,479.287 796.99999,457.51364 L 796.99999,42.48634 C 796.99999,20.71405 768.53178,2.9999985 733.53565,2.9999985 L 66.466056,2.9999985 z"
+ id="path892"
+ style="fill:#f8601f;fill-opacity:1;stroke:#000000;stroke-width:6;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#fdfdfd;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Metal;-inkscape-font-specification:Metal"
+ x="62.300049"
+ y="111.77754"
+ id="text4967"><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="111.77754"
+ id="tspan2441">El objetivo del juego es ubicar las fichas en</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="111.77754"
+ id="tspan2445">el tablero de forma de sumar 15 tanto en</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="134.27754"
+ id="tspan4989">filas como en columnas.</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="156.77754"
+ id="tspan4991" /><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="179.27754"
+ id="tspan4993">El juego es para dos participantes y se inicia</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="201.77754"
+ id="tspan4995">con el tablero vacío y los números afuera.</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="224.27754"
+ id="tspan5009">Éstos van alternando sus turnos, jugando</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="246.77754"
+ id="tspan2425">en cada caso el participante que aparece</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="269.27753"
+ id="tspan5075">resaltado en la pantalla.</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="291.77753"
+ id="tspan5093" /><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="314.27753"
+ id="tspan5015">Cuando un jugador ubica una ficha que</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="336.77753"
+ id="tspan5017">suma 15 en cualquiera de las dos direcciones,</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="359.27753"
+ id="tspan5019">éste gana un punto. Si logra sumar quince</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="381.77753"
+ id="tspan5021">en ambas direcciones a la vez, gana 2 puntos.</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="404.27753"
+ id="tspan6414" /><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="426.77753"
+ id="tspan6416">Los jugadores deben usar la misma computadora</tspan><tspan
+ sodipodi:role="line"
+ x="62.300049"
+ y="449.27753"
+ id="tspan6418">ya que aún no está habilitado el juego por red.</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 519.30061,22.86701 L 519.30061,473.05054"
+ id="path5023" />
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Metal;-inkscape-font-specification:Metal"
+ x="556.71631"
+ y="51.842243"
+ id="text5029"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="51.842243"
+ id="tspan5059">Quin-te-ti 0.1 fue desarrollada</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="71.842239"
+ id="tspan6422">en Ceibal JAM</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="91.842239"
+ id="tspan5061">www.ceibaljam.org</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="111.84224"
+ id="tspan5063" /><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="131.84224"
+ id="tspan5057">Propuesta:</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="151.84224"
+ id="tspan6410"> Caryl Bigenho</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="171.84224"
+ id="tspan5039" /><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="191.84224"
+ id="tspan5041">Desarrollo:</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="211.84224"
+ id="tspan5033"> Pablo Moleri</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="231.84224"
+ id="tspan5035"> Juan Manuel Picerno</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="251.84224"
+ id="tspan5053"> Leonardo Val</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="271.84225"
+ id="tspan6412"> Pablo Garin</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="291.84225"
+ id="tspan5055" /><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="311.84225"
+ id="tspan5121">Diseño gráfico:</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="331.84225"
+ id="tspan5123"> Magdalena Sayagués</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="351.84225"
+ id="tspan5125" /><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="371.84225"
+ id="tspan5069">Colaboración:</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="391.84225"
+ id="tspan5071"> Silvio Sisto</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="411.84225"
+ id="tspan5047" /><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="431.84225"
+ id="tspan5049">Consultas y sugerencias:</tspan><tspan
+ sodipodi:role="line"
+ x="556.71631"
+ y="451.84225"
+ id="tspan5051"> pmoleri@gmail.com</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Metal;-inkscape-font-specification:Metal Bold"
+ x="59.980049"
+ y="64.556961"
+ id="text5111"><tspan
+ sodipodi:role="line"
+ id="tspan5113"
+ x="59.980049"
+ y="64.556961">Instrucciones</tspan></text>
+ </g>
+</svg>
diff --git a/src/gui/instructions_button.png b/src/gui/instructions_button.png
new file mode 100644
index 0000000..8271cab
--- /dev/null
+++ b/src/gui/instructions_button.png
Binary files differ
diff --git a/src/gui/player_win.png b/src/gui/player_win.png
new file mode 100644
index 0000000..e9e6be2
--- /dev/null
+++ b/src/gui/player_win.png
Binary files differ
diff --git a/src/gui/quinteti-new.png b/src/gui/quinteti-new.png
new file mode 100644
index 0000000..1659917
--- /dev/null
+++ b/src/gui/quinteti-new.png
Binary files differ