icons
This commit is contained in:
1 parent
3f8e15f36c
commit
0f8393bb2e
14 files changed
+344
-298
No files matched your search
@@ -1,12 +1,11 @@
|
|||||||
This repository includes:
|
This repository includes:
|
||||||
|
|
||||||
1. binaries for 'KataGo', which is Copyright 2019 David J Wu et al.
|
1. Binaries for 'KataGo', which is Copyright 2019 David J Wu et al.
|
||||||
For on related licenses for these binaries and libraries see https://github.com/lightvector/KataGo
|
For on related licenses for these binaries and libraries see https://github.com/lightvector/KataGo
|
||||||
2. Icons from www.flaticon.com
|
2. Icons from www.flaticon.com, used with permission with the following attributions:
|
||||||
- New game/Load game/Config icons: made by Freepik from www.flaticon.com
|
- New game/Load game/Config icons: made by Freepik from www.flaticon.com
|
||||||
- Save icon: made by Pixel perfect from www.flaticon.com
|
- Save icon: made by Pixel perfect from www.flaticon.com
|
||||||
|
- Next/Previous icon: made by RoundIcons from www.flaticon.com - other next/previous icons are derived work.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Aside from the above, the license for all other content in this repository is as follows:
|
Aside from the above, the license for all other content in this repository is as follows:
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ class Game:
|
|||||||
# select move
|
# select move
|
||||||
ai_moves = self.current_node.candidate_moves
|
ai_moves = self.current_node.candidate_moves
|
||||||
pos_moves = [
|
pos_moves = [
|
||||||
[d["move"], d["scoreLead"], d["pointsLost"]] for i, d in enumerate(ai_moves) if i == 0 or int(d["visits"]) >= self.config["balance_play_min_visits"]
|
[d["move"], d["scoreLead"], d["pointsLost"]] for i, d in enumerate(ai_moves) if i == 0 or int(d["visits"]) >= train_settings["balance_play_min_visits"]
|
||||||
] # TODO: lcb based ?
|
] # TODO: lcb based ?
|
||||||
sel_moves = pos_moves[:1]
|
sel_moves = pos_moves[:1]
|
||||||
# don't play suicidal to balance score - pass when it's best
|
# don't play suicidal to balance score - pass when it's best
|
||||||
|
|||||||
+306
-264
@@ -33,13 +33,25 @@
|
|||||||
button_color: 0.71, 0.78, 0.81, 1
|
button_color: 0.71, 0.78, 0.81, 1
|
||||||
icon_margin: 0.15 * self.size[0]
|
icon_margin: 0.15 * self.size[0]
|
||||||
icon: 'missing.png'
|
icon: 'missing.png'
|
||||||
icon_size: min(self.size[0]-2*self.margin[0]-2*self.icon_margin,self.size[1]-2*self.margin[1]-2*self.icon_margin)
|
icon_size: min(self.size[0]-self.margin[0]-self.margin[2]-2*self.icon_margin,self.size[1]-self.margin[1]-self.margin[3]-2*self.icon_margin)
|
||||||
#EffectWidget: effects: [ew.FXAAEffect()]
|
#EffectWidget: effects: [ew.FXAAEffect()]
|
||||||
Image:
|
Image:
|
||||||
size: (root.icon_size or 0,root.icon_size or 0) # square
|
size: (root.icon_size or 0,root.icon_size or 0) # square
|
||||||
pos: [root.pos[i] + (root.size[i] - root.icon_size)/2 for i in [0,1]] if root.icon_size else [0,0]
|
pos: [root.pos[i] + (root.size[i] - root.icon_size)/2 for i in [0,1]] if root.icon_size else [0,0]
|
||||||
source: root.icon
|
source: root.icon
|
||||||
|
|
||||||
|
<TransparentIconButton@Button>
|
||||||
|
background_normal: ''
|
||||||
|
background_color: (0,0,0,0)
|
||||||
|
margin: (1,1,1,1)
|
||||||
|
icon_size: min(self.size[0]-self.margin[0]-self.margin[2],self.size[1]-self.margin[1]-self.margin[3])
|
||||||
|
icon: 'missing.png'
|
||||||
|
Image:
|
||||||
|
size: (root.icon_size or 0,root.icon_size or 0) # square
|
||||||
|
pos: [root.pos[i] + (root.size[i] - root.icon_size)/2 for i in [0,1]] if root.icon_size else [0,0]
|
||||||
|
source: root.icon
|
||||||
|
|
||||||
|
|
||||||
<DarkLabel@Label>:
|
<DarkLabel@Label>:
|
||||||
color: (0.05,0.05,0.05,1)
|
color: (0.05,0.05,0.05,1)
|
||||||
|
|
||||||
@@ -99,7 +111,6 @@
|
|||||||
active: root.default_active
|
active: root.default_active
|
||||||
on_active: root.dispatch('on_active')
|
on_active: root.dispatch('on_active')
|
||||||
|
|
||||||
# TODO no need for this anymore
|
|
||||||
<CensorableLabel>
|
<CensorableLabel>
|
||||||
orientation: 'horizontal'
|
orientation: 'horizontal'
|
||||||
text: ''
|
text: ''
|
||||||
@@ -134,39 +145,308 @@
|
|||||||
|
|
||||||
<WhiteCircleWithText@BaseCircleWithText>
|
<WhiteCircleWithText@BaseCircleWithText>
|
||||||
color: 0.05,0.05,0.05,1
|
color: 0.05,0.05,0.05,1
|
||||||
|
outline: True
|
||||||
|
canvas.before:
|
||||||
|
Color:
|
||||||
|
rgba: 0.95,0.95,0.95,1
|
||||||
|
Ellipse:
|
||||||
|
pos: self.pos[0] + self.width/2 - min(self.height,self.width) * 0.48, self.pos[1] + self.height/2 - min(self.height,self.width) * 0.48
|
||||||
|
size: min(self.height,self.width) * 0.96, min(self.height,self.width) * 0.96
|
||||||
canvas.after:
|
canvas.after:
|
||||||
Color:
|
Color:
|
||||||
rgba: 0.05,0.05,0.05,1
|
rgba: 0.05,0.05,0.05,1
|
||||||
Line:
|
Line:
|
||||||
circle: self.pos[0] + self.width/2, self.pos[1] + self.height/2, min(self.height,self.width)*0.45
|
circle: self.pos[0] + self.width/2, self.pos[1] + self.height/2, min(self.height,self.width)*0.47
|
||||||
width: 1.1
|
width: 1.1 if root.outline else 0.0001
|
||||||
|
|
||||||
|
<BadukPanWidget>:
|
||||||
|
size: self.parent.height, self.parent.height
|
||||||
|
katrain: self.parent.parent
|
||||||
|
|
||||||
|
|
||||||
<CensorableScoreLabel>
|
<BadukPanControls>:
|
||||||
orientation: 'horizontal'
|
katrain: self.parent.parent
|
||||||
text: ''
|
black_prisoners: black_prisoners
|
||||||
label: ''
|
white_prisoners: white_prisoners
|
||||||
black: black
|
pass_btn: pass_btn
|
||||||
white: white
|
canvas.before:
|
||||||
|
Color:
|
||||||
|
rgb: 0.85, 0.68, 0.40
|
||||||
|
Rectangle:
|
||||||
|
pos: root.pos
|
||||||
|
size: root.size
|
||||||
|
Label:
|
||||||
|
size_hint: 0.05, 1
|
||||||
|
StyledButton:
|
||||||
|
text: 'Pass'
|
||||||
|
id: pass_btn
|
||||||
|
on_press: root.katrain("play",None)
|
||||||
|
size_hint: 0.1, 1
|
||||||
|
margin: (0, self.size[1]/5, 0, self.size[1]/5)
|
||||||
|
Label:
|
||||||
|
size_hint: 0.1, 1
|
||||||
|
TransparentIconButton:
|
||||||
|
icon: 'img/flaticon/previous999.png'
|
||||||
|
margin: (3, self.size[1]/3, 3, self.size[1]/3)
|
||||||
|
size_hint: 0.1, 1
|
||||||
|
on_press: root.katrain('undo',999)
|
||||||
|
TransparentIconButton:
|
||||||
|
icon: 'img/flaticon/previous5.png'
|
||||||
|
margin: (3, self.size[1]/3, 3, self.size[1]/3)
|
||||||
|
size_hint: 0.1, 1
|
||||||
|
on_press: root.katrain('undo',5)
|
||||||
|
TransparentIconButton:
|
||||||
|
icon: 'img/flaticon/previous.png'
|
||||||
|
margin: (3, self.size[1]/3, 3, self.size[1]/3)
|
||||||
|
size_hint: 0.1, 1
|
||||||
|
on_press: root.katrain('undo')
|
||||||
|
BoxLayout:
|
||||||
|
size_hint: 0.25, 1
|
||||||
BlackCircleWithText:
|
BlackCircleWithText:
|
||||||
id: black
|
id: black_prisoners
|
||||||
size_hint: 0.15,1
|
|
||||||
text: '0'
|
|
||||||
CheckBoxHintLabel:
|
|
||||||
size_hint: 0.3,1
|
size_hint: 0.3,1
|
||||||
text: root.label
|
|
||||||
font_size: self.height * 0.6
|
|
||||||
on_press: value.opacity = 1 if value.opacity==0 else 0
|
|
||||||
WhiteCircleWithText:
|
|
||||||
id: white
|
|
||||||
size_hint: 0.15,1
|
|
||||||
text: '0'
|
text: '0'
|
||||||
DarkLabel:
|
WhiteCircleWithText:
|
||||||
size_hint: 0.4,1
|
id: white_prisoners
|
||||||
text: root.text
|
size_hint: 0.3,1
|
||||||
font_size: self.height * 0.6
|
text: '0'
|
||||||
id: value
|
outline: False
|
||||||
bold: True
|
TransparentIconButton:
|
||||||
|
icon: 'img/flaticon/next.png'
|
||||||
|
margin: (3, self.size[1]/3, 3, self.size[1]/3)
|
||||||
|
size_hint: 0.1, 1
|
||||||
|
on_press: root.katrain('redo')
|
||||||
|
TransparentIconButton:
|
||||||
|
icon: 'img/flaticon/next5.png'
|
||||||
|
margin: (3, self.size[1]/3, 3, self.size[1]/3)
|
||||||
|
size_hint: 0.1, 1
|
||||||
|
on_press: root.katrain('redo',5)
|
||||||
|
TransparentIconButton:
|
||||||
|
icon: 'img/flaticon/next999.png'
|
||||||
|
margin: (3, self.size[1]/3, 3, self.size[1]/3)
|
||||||
|
size_hint: 0.1, 1
|
||||||
|
on_press: root.katrain('redo',999)
|
||||||
|
Label:
|
||||||
|
size_hint: 0.25, 1
|
||||||
|
|
||||||
|
|
||||||
|
<Controls>
|
||||||
|
orientation: 'vertical'
|
||||||
|
play_tab_button: play_tab_button
|
||||||
|
analyze_tab_button: analyze_tab_button
|
||||||
|
info: info
|
||||||
|
win_rate: win_rate
|
||||||
|
points_lost: points_lost
|
||||||
|
score: score
|
||||||
|
hints: hints
|
||||||
|
ownership: ownership
|
||||||
|
policy: policy
|
||||||
|
eval: eval
|
||||||
|
ai_balance: ai_balance
|
||||||
|
ai_auto: ai_auto
|
||||||
|
ai_fast: ai_fast
|
||||||
|
ai_lock: ai_lock
|
||||||
|
ai_move: ai_move
|
||||||
|
auto_undo: auto_undo
|
||||||
|
katrain: self.parent
|
||||||
|
BoxLayout:
|
||||||
|
size_hint: 1,0.05
|
||||||
|
orientation: 'horizontal'
|
||||||
|
StyledToggleButton:
|
||||||
|
text: 'Analyze'
|
||||||
|
id: analyze_tab_button
|
||||||
|
margin: (3,0,1,3)
|
||||||
|
group: 'tabs'
|
||||||
|
on_press:
|
||||||
|
analyze_tab.size_hint[0] = 1
|
||||||
|
analyze_tab.opacity = 1
|
||||||
|
play_tab.size_hint_x = None
|
||||||
|
play_tab.width = 0
|
||||||
|
play_tab.opacity = 0
|
||||||
|
self.state = 'down'
|
||||||
|
StyledToggleButton:
|
||||||
|
text: 'Play'
|
||||||
|
group: 'tabs'
|
||||||
|
state: 'down'
|
||||||
|
id: play_tab_button
|
||||||
|
margin: (1,0,3,3)
|
||||||
|
on_press:
|
||||||
|
play_tab.size_hint[0] = 1
|
||||||
|
play_tab.opacity = 1
|
||||||
|
analyze_tab.size_hint_x = None
|
||||||
|
analyze_tab.width = 0
|
||||||
|
analyze_tab.opacity = 0
|
||||||
|
self.state = 'down'
|
||||||
|
BoxLayout:
|
||||||
|
size_hint: 1,0.25
|
||||||
|
orientation: 'horizontal'
|
||||||
|
BoxLayout: # ----------- analyze -----------
|
||||||
|
size_hint: 0,1
|
||||||
|
id: analyze_tab
|
||||||
|
opacity: 0
|
||||||
|
orientation: 'vertical'
|
||||||
|
GridLayout:
|
||||||
|
cols: 6
|
||||||
|
rows: 1
|
||||||
|
size_hint: 1, 0.35
|
||||||
|
Label:
|
||||||
|
size_hint: 0.01, 1
|
||||||
|
BoxLayout:
|
||||||
|
orientation: 'vertical'
|
||||||
|
size_hint: 0.1, 0.5
|
||||||
|
Label:
|
||||||
|
size_hint: 1, 0.2
|
||||||
|
BlackCircleWithText:
|
||||||
|
text: 'B'
|
||||||
|
WhiteCircleWithText:
|
||||||
|
text: 'W'
|
||||||
|
BWCheckBoxHint:
|
||||||
|
size_hint: 0.2, 0.5
|
||||||
|
id: eval
|
||||||
|
text: 'all eval'
|
||||||
|
default_active: False
|
||||||
|
on_active: root.katrain.update_state()
|
||||||
|
BWCheckBoxHint:
|
||||||
|
size_hint: 0.2, 0.5
|
||||||
|
id: hints
|
||||||
|
text: 'top move'
|
||||||
|
on_active: root.katrain.update_state()
|
||||||
|
CheckBoxHint:
|
||||||
|
size_hint: 0.2, 0.5
|
||||||
|
id: ownership
|
||||||
|
text: 'show\nowner'
|
||||||
|
on_active: root.katrain.update_state()
|
||||||
|
CheckBoxHint:
|
||||||
|
size_hint: 0.2, 0.5
|
||||||
|
id: policy
|
||||||
|
text: 'show\npolicy'
|
||||||
|
on_active: root.katrain.update_state()
|
||||||
|
LargeLabel:
|
||||||
|
text: 'graph?'
|
||||||
|
size_hint: 1,0.75
|
||||||
|
CensorableLabel:
|
||||||
|
id: win_rate
|
||||||
|
size_hint: 1, 0.15
|
||||||
|
label: 'Win rate'
|
||||||
|
text: '...'
|
||||||
|
CensorableLabel:
|
||||||
|
id: score
|
||||||
|
size_hint: 1, 0.15
|
||||||
|
label: 'Score'
|
||||||
|
text: '...'
|
||||||
|
BoxLayout: # ----------- play -----------
|
||||||
|
orientation: 'vertical'
|
||||||
|
size_hint: 1,1
|
||||||
|
opacity: 1
|
||||||
|
id: play_tab
|
||||||
|
GridLayout:
|
||||||
|
cols: 5
|
||||||
|
rows: 1
|
||||||
|
size_hint: 1, 0.1
|
||||||
|
BoxLayout:
|
||||||
|
orientation: 'vertical'
|
||||||
|
size_hint: 0.1, 0.5
|
||||||
|
Label:
|
||||||
|
size_hint: 1, 0.2
|
||||||
|
BlackCircleWithText:
|
||||||
|
text: 'B'
|
||||||
|
WhiteCircleWithText:
|
||||||
|
text: 'W'
|
||||||
|
BWCheckBoxHint:
|
||||||
|
text: 'ai'
|
||||||
|
id: ai_auto
|
||||||
|
default_active: False
|
||||||
|
size_hint: 0.25, 1
|
||||||
|
BWCheckBoxHint:
|
||||||
|
size_hint: 0.2, 0.5
|
||||||
|
id: auto_undo
|
||||||
|
text: 'undo'
|
||||||
|
on_active: root.katrain.update_state()
|
||||||
|
CheckBoxHint:
|
||||||
|
size_hint: 0.25, 1
|
||||||
|
text: 'fast'
|
||||||
|
id: ai_fast
|
||||||
|
default_active: True
|
||||||
|
CheckBoxHint:
|
||||||
|
size_hint: 0.25, 1
|
||||||
|
text: 'balance\nscore'
|
||||||
|
id: ai_balance
|
||||||
|
default_active: False
|
||||||
|
GridLayout:
|
||||||
|
cols: 4
|
||||||
|
rows: 1
|
||||||
|
size_hint: 1, 0.1
|
||||||
|
StyledButton:
|
||||||
|
id: ai_move
|
||||||
|
size_hint: 0.5, 0.5
|
||||||
|
text: ' AI\nMove'
|
||||||
|
on_press: root.katrain("ai_move")
|
||||||
|
CheckBoxHint:
|
||||||
|
size_hint: 0.25, 1
|
||||||
|
text: 'lock\nAI'
|
||||||
|
id: ai_lock
|
||||||
|
on_active: self.checkbox.disabled = analyze_tab_button.disabled = ai_auto.white = ai_auto.black = ai_move.disabled = True
|
||||||
|
LargeLabel:
|
||||||
|
text: 'free real estate'
|
||||||
|
size_hint: 1,0.2
|
||||||
|
CensorableLabel:
|
||||||
|
id: points_lost
|
||||||
|
size_hint: 1, 0.03
|
||||||
|
label: 'Point loss'
|
||||||
|
text: '...'
|
||||||
|
GridLayout:
|
||||||
|
cols: 2
|
||||||
|
rows: 1
|
||||||
|
size_hint: 1, 0.05
|
||||||
|
TextInput:
|
||||||
|
id: info
|
||||||
|
size_hint: 1, 0.2
|
||||||
|
valign: 'middle'
|
||||||
|
BoxLayout:
|
||||||
|
orientation: 'horizontal'
|
||||||
|
size_hint: 1, None
|
||||||
|
height: self.width * 0.25
|
||||||
|
StyledIconButton:
|
||||||
|
icon: 'img/flaticon/go-game.png'
|
||||||
|
size_hint: 0.25, 1
|
||||||
|
on_press: root.katrain("new-game-popup")
|
||||||
|
StyledIconButton:
|
||||||
|
icon: 'img/flaticon/open-folder.png'
|
||||||
|
size_hint: 0.25, 1
|
||||||
|
on_press: root.katrain("analyze-sgf-popup")
|
||||||
|
StyledIconButton:
|
||||||
|
icon: 'img/flaticon/bar.png'
|
||||||
|
size_hint: 0.25, 1
|
||||||
|
on_press: root.katrain('output-sgf')
|
||||||
|
StyledIconButton:
|
||||||
|
icon: 'img/flaticon/gears.png'
|
||||||
|
size_hint: 0.25, 1
|
||||||
|
on_press: root.katrain('config-popup')
|
||||||
|
|
||||||
|
<KaTrainGui>:
|
||||||
|
board_gui: board_gui
|
||||||
|
controls: controls
|
||||||
|
board_controls: board_controls
|
||||||
|
board_aspect_ratio: 1.075
|
||||||
|
canvas.before:
|
||||||
|
Color:
|
||||||
|
rgba: 0.95, 0.95, 0.95, 1
|
||||||
|
Rectangle:
|
||||||
|
pos: self.pos
|
||||||
|
size: root.size
|
||||||
|
BoxLayout:
|
||||||
|
orientation: 'vertical'
|
||||||
|
size_hint: 1 - controls.size_hint[0], 1
|
||||||
|
BadukPanWidget:
|
||||||
|
id: board_gui
|
||||||
|
size_hint: (1,1)
|
||||||
|
BadukPanControls:
|
||||||
|
id: board_controls
|
||||||
|
size_hint: (1,root.board_aspect_ratio-1)
|
||||||
|
Controls:
|
||||||
|
id: controls
|
||||||
|
size_hint: max(0.25,(root.width - root.height/root.board_aspect_ratio)/root.width), 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<LoadSGFPopup>:
|
<LoadSGFPopup>:
|
||||||
@@ -260,241 +540,3 @@
|
|||||||
size_hint: 0.5, 0.1
|
size_hint: 0.5, 0.1
|
||||||
text: 'Start Game'
|
text: 'Start Game'
|
||||||
on_press: root.new_game()
|
on_press: root.new_game()
|
||||||
|
|
||||||
|
|
||||||
<BadukPanWidget>:
|
|
||||||
size: self.parent.height, self.parent.height
|
|
||||||
katrain: self.parent.parent
|
|
||||||
|
|
||||||
<Controls>
|
|
||||||
orientation: 'vertical'
|
|
||||||
play_tab_button: play_tab_button
|
|
||||||
analyze_tab_button: analyze_tab_button
|
|
||||||
info: info
|
|
||||||
win_rate: win_rate
|
|
||||||
points_lost: points_lost
|
|
||||||
score: score
|
|
||||||
hints: hints
|
|
||||||
ownership: ownership
|
|
||||||
policy: policy
|
|
||||||
eval: eval
|
|
||||||
ai_balance: ai_balance
|
|
||||||
ai_auto: ai_auto
|
|
||||||
ai_fast: ai_fast
|
|
||||||
ai_lock: ai_lock
|
|
||||||
ai_move: ai_move
|
|
||||||
auto_undo: auto_undo
|
|
||||||
pass_btn: pass_btn
|
|
||||||
katrain: self.parent
|
|
||||||
BoxLayout:
|
|
||||||
size_hint: 1,0.05
|
|
||||||
orientation: 'horizontal'
|
|
||||||
StyledToggleButton:
|
|
||||||
text: 'Analyze'
|
|
||||||
id: analyze_tab_button
|
|
||||||
margin: (3,0,1,3)
|
|
||||||
group: 'tabs'
|
|
||||||
on_press:
|
|
||||||
analyze_tab.size_hint[0] = 1
|
|
||||||
analyze_tab.opacity = 1
|
|
||||||
play_tab.size_hint_x = None
|
|
||||||
play_tab.width = 0
|
|
||||||
play_tab.opacity = 0
|
|
||||||
self.state = 'down'
|
|
||||||
StyledToggleButton:
|
|
||||||
text: 'Play'
|
|
||||||
group: 'tabs'
|
|
||||||
state: 'down'
|
|
||||||
id: play_tab_button
|
|
||||||
margin: (1,0,3,3)
|
|
||||||
on_press:
|
|
||||||
play_tab.size_hint[0] = 1
|
|
||||||
play_tab.opacity = 1
|
|
||||||
analyze_tab.size_hint_x = None
|
|
||||||
analyze_tab.width = 0
|
|
||||||
analyze_tab.opacity = 0
|
|
||||||
self.state = 'down'
|
|
||||||
BoxLayout:
|
|
||||||
size_hint: 1,0.25
|
|
||||||
orientation: 'horizontal'
|
|
||||||
BoxLayout: # ----------- analyze -----------
|
|
||||||
size_hint: 0,1
|
|
||||||
id: analyze_tab
|
|
||||||
opacity: 0
|
|
||||||
orientation: 'vertical'
|
|
||||||
GridLayout:
|
|
||||||
cols: 6
|
|
||||||
rows: 1
|
|
||||||
size_hint: 1, 0.35
|
|
||||||
Label:
|
|
||||||
size_hint: 0.01, 1
|
|
||||||
BoxLayout:
|
|
||||||
orientation: 'vertical'
|
|
||||||
size_hint: 0.1, 0.5
|
|
||||||
Label:
|
|
||||||
size_hint: 1, 0.2
|
|
||||||
BlackCircleWithText:
|
|
||||||
text: 'B'
|
|
||||||
WhiteCircleWithText:
|
|
||||||
text: 'W'
|
|
||||||
BWCheckBoxHint:
|
|
||||||
size_hint: 0.2, 0.5
|
|
||||||
id: eval
|
|
||||||
text: 'all eval'
|
|
||||||
default_active: False
|
|
||||||
on_active: root.parent.update_state()
|
|
||||||
BWCheckBoxHint:
|
|
||||||
size_hint: 0.2, 0.5
|
|
||||||
id: hints
|
|
||||||
text: 'top move'
|
|
||||||
on_active: root.parent.update_state()
|
|
||||||
CheckBoxHint:
|
|
||||||
size_hint: 0.2, 0.5
|
|
||||||
id: ownership
|
|
||||||
text: 'show\nowner'
|
|
||||||
on_active: root.parent.update_state()
|
|
||||||
CheckBoxHint:
|
|
||||||
size_hint: 0.2, 0.5
|
|
||||||
id: policy
|
|
||||||
text: 'show\npolicy'
|
|
||||||
on_active: root.parent.update_state()
|
|
||||||
LargeLabel:
|
|
||||||
text: 'graph?'
|
|
||||||
size_hint: 1,0.75
|
|
||||||
CensorableLabel:
|
|
||||||
id: win_rate
|
|
||||||
size_hint: 1, 0.15
|
|
||||||
label: 'Win rate'
|
|
||||||
text: '...'
|
|
||||||
CensorableScoreLabel:
|
|
||||||
id: score
|
|
||||||
size_hint: 1, 0.15
|
|
||||||
label: 'Score'
|
|
||||||
text: '...'
|
|
||||||
BoxLayout: # ----------- play -----------
|
|
||||||
orientation: 'vertical'
|
|
||||||
size_hint: 1,1
|
|
||||||
opacity: 1
|
|
||||||
id: play_tab
|
|
||||||
GridLayout:
|
|
||||||
cols: 5
|
|
||||||
rows: 1
|
|
||||||
size_hint: 1, 0.1
|
|
||||||
BoxLayout:
|
|
||||||
orientation: 'vertical'
|
|
||||||
size_hint: 0.1, 0.5
|
|
||||||
Label:
|
|
||||||
size_hint: 1, 0.2
|
|
||||||
BlackCircleWithText:
|
|
||||||
text: 'B'
|
|
||||||
WhiteCircleWithText:
|
|
||||||
text: 'W'
|
|
||||||
BWCheckBoxHint:
|
|
||||||
text: 'ai'
|
|
||||||
id: ai_auto
|
|
||||||
default_active: False
|
|
||||||
size_hint: 0.25, 1
|
|
||||||
BWCheckBoxHint:
|
|
||||||
size_hint: 0.2, 0.5
|
|
||||||
id: auto_undo
|
|
||||||
text: 'undo'
|
|
||||||
on_active: root.parent.update_state()
|
|
||||||
CheckBoxHint:
|
|
||||||
size_hint: 0.25, 1
|
|
||||||
text: 'fast'
|
|
||||||
id: ai_fast
|
|
||||||
default_active: True
|
|
||||||
CheckBoxHint:
|
|
||||||
size_hint: 0.25, 1
|
|
||||||
text: 'balance\nscore'
|
|
||||||
id: ai_balance
|
|
||||||
default_active: False
|
|
||||||
GridLayout:
|
|
||||||
cols: 4
|
|
||||||
rows: 1
|
|
||||||
size_hint: 1, 0.1
|
|
||||||
StyledButton:
|
|
||||||
id: ai_move
|
|
||||||
size_hint: 0.5, 0.5
|
|
||||||
text: ' AI\nMove'
|
|
||||||
on_press: root.katrain("ai_move")
|
|
||||||
CheckBoxHint:
|
|
||||||
size_hint: 0.25, 1
|
|
||||||
text: 'lock\nAI'
|
|
||||||
id: ai_lock
|
|
||||||
on_active: self.checkbox.disabled = analyze_tab_button.disabled = ai_auto.white = ai_auto.black = ai_move.disabled = True
|
|
||||||
LargeLabel:
|
|
||||||
text: 'free real estate'
|
|
||||||
size_hint: 1,0.2
|
|
||||||
CensorableLabel:
|
|
||||||
id: points_lost
|
|
||||||
size_hint: 1, 0.03
|
|
||||||
label: 'Point loss'
|
|
||||||
text: '...'
|
|
||||||
GridLayout:
|
|
||||||
cols: 2
|
|
||||||
rows: 1
|
|
||||||
size_hint: 1, 0.05
|
|
||||||
StyledButton:
|
|
||||||
id: undo
|
|
||||||
text: 'Undo'
|
|
||||||
on_press: root.katrain("undo")
|
|
||||||
default_active: True
|
|
||||||
StyledButton:
|
|
||||||
text: 'Pass'
|
|
||||||
id: pass_btn
|
|
||||||
on_press: root.katrain("play",None)
|
|
||||||
TextInput:
|
|
||||||
id: info
|
|
||||||
size_hint: 1, 0.2
|
|
||||||
valign: 'middle'
|
|
||||||
BoxLayout:
|
|
||||||
orientation: 'horizontal'
|
|
||||||
size_hint: 1, None
|
|
||||||
height: self.width * 0.25
|
|
||||||
StyledIconButton:
|
|
||||||
icon: 'img/flaticon/go-game.png'
|
|
||||||
size_hint: 0.25, 1
|
|
||||||
on_press: root.katrain("new-game-popup")
|
|
||||||
StyledIconButton:
|
|
||||||
icon: 'img/flaticon/open-folder.png'
|
|
||||||
size_hint: 0.25, 1
|
|
||||||
on_press: root.katrain("analyze-sgf-popup")
|
|
||||||
StyledIconButton:
|
|
||||||
icon: 'img/flaticon/bar.png'
|
|
||||||
size_hint: 0.25, 1
|
|
||||||
on_press: root.katrain('output-sgf')
|
|
||||||
StyledIconButton:
|
|
||||||
icon: 'img/flaticon/gears.png'
|
|
||||||
size_hint: 0.25, 1
|
|
||||||
on_press: root.katrain('config-popup')
|
|
||||||
|
|
||||||
<BadukPanControls>:
|
|
||||||
StyledIconButton:
|
|
||||||
icon: 'img/flaticon/go-game.png'
|
|
||||||
size_hint: 0.25, 1
|
|
||||||
on_press: root.katrain("new-game-popup")
|
|
||||||
|
|
||||||
<KaTrainGui>:
|
|
||||||
board_gui: board_gui
|
|
||||||
controls: controls
|
|
||||||
board_aspect_ratio: 1.1
|
|
||||||
canvas.before:
|
|
||||||
Color:
|
|
||||||
rgba: 0.95, 0.95, 0.95, 1
|
|
||||||
Rectangle:
|
|
||||||
pos: self.pos
|
|
||||||
size: root.size
|
|
||||||
BoxLayout:
|
|
||||||
orientation: 'vertical'
|
|
||||||
size_hint: 1 - controls.size_hint[0], 1
|
|
||||||
BadukPanWidget:
|
|
||||||
id: board_gui
|
|
||||||
size_hint: (1,1)
|
|
||||||
BadukPanControls:
|
|
||||||
id: board_controls
|
|
||||||
size_hint: (1,root.board_aspect_ratio-1)
|
|
||||||
Controls:
|
|
||||||
id: controls
|
|
||||||
size_hint: max(0.25,(root.width - root.height/root.board_aspect_ratio)/root.width), 1
|
|
||||||
|
|
||||||
@@ -3,7 +3,6 @@ from gui.controls import Controls
|
|||||||
from gui.kivyutils import (
|
from gui.kivyutils import (
|
||||||
BWCheckBoxHint,
|
BWCheckBoxHint,
|
||||||
CensorableLabel,
|
CensorableLabel,
|
||||||
CensorableScoreLabel,
|
|
||||||
CheckBoxHint,
|
CheckBoxHint,
|
||||||
LabelledFloatInput,
|
LabelledFloatInput,
|
||||||
LabelledIntInput,
|
LabelledIntInput,
|
||||||
|
|||||||
+17
-15
@@ -29,8 +29,8 @@ class BadukPanWidget(Widget):
|
|||||||
def on_touch_down(self, touch):
|
def on_touch_down(self, touch):
|
||||||
if not self.gridpos_x:
|
if not self.gridpos_x:
|
||||||
return
|
return
|
||||||
xd, xp = self._find_closest(touch.x,self.gridpos_x)
|
xd, xp = self._find_closest(touch.x, self.gridpos_x)
|
||||||
yd, yp = self._find_closest(touch.y,self.gridpos_y)
|
yd, yp = self._find_closest(touch.y, self.gridpos_y)
|
||||||
prev_ghost = self.ghost_stone
|
prev_ghost = self.ghost_stone
|
||||||
if max(yd, xd) < self.grid_size / 2 and (xp, yp) not in [m.coords for m in self.katrain.game.stones]:
|
if max(yd, xd) < self.grid_size / 2 and (xp, yp) not in [m.coords for m in self.katrain.game.stones]:
|
||||||
self.ghost_stone = (xp, yp)
|
self.ghost_stone = (xp, yp)
|
||||||
@@ -49,8 +49,8 @@ class BadukPanWidget(Widget):
|
|||||||
if self.ghost_stone:
|
if self.ghost_stone:
|
||||||
katrain("play", self.ghost_stone)
|
katrain("play", self.ghost_stone)
|
||||||
else:
|
else:
|
||||||
xd, xp = self._find_closest(touch.x,self.gridpos_x)
|
xd, xp = self._find_closest(touch.x, self.gridpos_x)
|
||||||
yd, yp = self._find_closest(touch.y,self.gridpos_y)
|
yd, yp = self._find_closest(touch.y, self.gridpos_y)
|
||||||
|
|
||||||
nodes_here = [node for node in katrain.game.current_node.nodes_from_root if node.single_move and node.single_move.coords == (xp, yp)]
|
nodes_here = [node for node in katrain.game.current_node.nodes_from_root if node.single_move and node.single_move.coords == (xp, yp)]
|
||||||
if nodes_here and max(yd, xd) < self.grid_size / 2: # load old comment
|
if nodes_here and max(yd, xd) < self.grid_size / 2: # load old comment
|
||||||
@@ -101,12 +101,12 @@ class BadukPanWidget(Widget):
|
|||||||
self.canvas.before.clear()
|
self.canvas.before.clear()
|
||||||
with self.canvas.before:
|
with self.canvas.before:
|
||||||
# board
|
# board
|
||||||
sz = min(self.width, self.height)
|
board_px_size = min(self.width, self.height)
|
||||||
Color(*self.ui_config["board_color"])
|
Color(*self.ui_config["board_color"])
|
||||||
board_rectangle = Rectangle(pos=self.pos, size=(sz, sz))
|
Rectangle(pos=self.pos, size=(self.width, self.height))
|
||||||
# grid lines
|
# grid lines
|
||||||
margin = 1.5
|
margin = 1.5
|
||||||
self.grid_size = board_rectangle.size[0] / (board_size - 1 + 1.5 * margin)
|
self.grid_size = board_px_size / (board_size - 1 + 1.5 * margin)
|
||||||
self.stone_size = self.grid_size * self.ui_config["stone_size"]
|
self.stone_size = self.grid_size * self.ui_config["stone_size"]
|
||||||
self.gridpos_x = [self.pos[0] + math.floor((margin + i) * self.grid_size + 0.5) for i in range(board_size)]
|
self.gridpos_x = [self.pos[0] + math.floor((margin + i) * self.grid_size + 0.5) for i in range(board_size)]
|
||||||
self.gridpos_y = [self.pos[1] + math.floor((margin + i) * self.grid_size + 0.5) for i in range(board_size)]
|
self.gridpos_y = [self.pos[1] + math.floor((margin + i) * self.grid_size + 0.5) for i in range(board_size)]
|
||||||
@@ -115,7 +115,7 @@ class BadukPanWidget(Widget):
|
|||||||
Color(*line_color)
|
Color(*line_color)
|
||||||
for i in range(board_size):
|
for i in range(board_size):
|
||||||
Line(points=[(self.gridpos_x[i], self.gridpos_y[0]), (self.gridpos_x[i], self.gridpos_y[-1])])
|
Line(points=[(self.gridpos_x[i], self.gridpos_y[0]), (self.gridpos_x[i], self.gridpos_y[-1])])
|
||||||
Line(points=[( self.gridpos_x[0], self.gridpos_y[i]), ( self.gridpos_x[-1], self.gridpos_y[i])])
|
Line(points=[(self.gridpos_x[0], self.gridpos_y[i]), (self.gridpos_x[-1], self.gridpos_y[i])])
|
||||||
|
|
||||||
# star points
|
# star points
|
||||||
star_point_pos = 3 if board_size <= 11 else 4
|
star_point_pos = 3 if board_size <= 11 else 4
|
||||||
@@ -128,7 +128,7 @@ class BadukPanWidget(Widget):
|
|||||||
Color(0.25, 0.25, 0.25)
|
Color(0.25, 0.25, 0.25)
|
||||||
coord_offset = self.grid_size * margin / 2
|
coord_offset = self.grid_size * margin / 2
|
||||||
for i in range(board_size):
|
for i in range(board_size):
|
||||||
draw_text(pos=(self.gridpos_x[i], self.gridpos_y[0] -coord_offset), text=Move.GTP_COORD[i], font_size=self.grid_size / 1.5)
|
draw_text(pos=(self.gridpos_x[i], self.gridpos_y[0] - coord_offset), text=Move.GTP_COORD[i], font_size=self.grid_size / 1.5)
|
||||||
draw_text(pos=(self.gridpos_x[0] - coord_offset, self.gridpos_y[i]), text=str(i + 1), font_size=self.grid_size / 1.5)
|
draw_text(pos=(self.gridpos_x[0] - coord_offset, self.gridpos_y[i]), text=str(i + 1), font_size=self.grid_size / 1.5)
|
||||||
|
|
||||||
def draw_board_contents(self, *args):
|
def draw_board_contents(self, *args):
|
||||||
@@ -177,14 +177,15 @@ class BadukPanWidget(Widget):
|
|||||||
Rectangle(pos=(self.gridpos_x[x] - rsz / 2, self.gridpos_y[y] - rsz / 2), size=(rsz, rsz))
|
Rectangle(pos=(self.gridpos_x[x] - rsz / 2, self.gridpos_y[y] - rsz / 2), size=(rsz, rsz))
|
||||||
ix = ix + 1
|
ix = ix + 1
|
||||||
|
|
||||||
policy = current_node.policy
|
# likewise for policy, although it makes slightly less sense here
|
||||||
|
policy = current_node.policy or (current_node.parent and current_node.parent.policy)
|
||||||
if katrain.controls.policy.active and policy and not katrain.controls.ownership.active:
|
if katrain.controls.policy.active and policy and not katrain.controls.ownership.active:
|
||||||
n_legal_moves = sum([p > 0 for p in policy])
|
n_legal_moves = sum([p > 0 for p in policy])
|
||||||
avg_policy = 1.0 / n_legal_moves
|
avg_policy = 1.0 / n_legal_moves
|
||||||
best_move_policy = max(policy) # num legal moves scale?
|
best_move_policy = max(policy) # num legal moves scale?
|
||||||
rsz = self.grid_size * 0.2
|
rsz = self.grid_size * 0.2
|
||||||
ix = 0
|
ix = 0
|
||||||
for y in range(board_size-1,-1,-1):
|
for y in range(board_size - 1, -1, -1):
|
||||||
for x in range(board_size):
|
for x in range(board_size):
|
||||||
if policy[ix] > 0:
|
if policy[ix] > 0:
|
||||||
policy_delta = best_move_policy - policy[ix]
|
policy_delta = best_move_policy - policy[ix]
|
||||||
@@ -193,7 +194,7 @@ class BadukPanWidget(Widget):
|
|||||||
Rectangle(pos=(self.gridpos_x[x] - rsz / 2, self.gridpos_y[y] - rsz / 2), size=(rsz, rsz))
|
Rectangle(pos=(self.gridpos_x[x] - rsz / 2, self.gridpos_y[y] - rsz / 2), size=(rsz, rsz))
|
||||||
ix = ix + 1
|
ix = ix + 1
|
||||||
policy_delta = best_move_policy - policy[ix]
|
policy_delta = best_move_policy - policy[ix]
|
||||||
katrain.controls.pass_btn.face_color = (*self.eval_color(100*policy_delta),1)
|
katrain.board_controls.pass_btn.face_color = (*self.eval_color(100 * policy_delta), 1)
|
||||||
|
|
||||||
# children of current moves in undo / review
|
# children of current moves in undo / review
|
||||||
undo_coords = set()
|
undo_coords = set()
|
||||||
@@ -234,11 +235,12 @@ class BadukPanWidget(Widget):
|
|||||||
else:
|
else:
|
||||||
text = "pass"
|
text = "pass"
|
||||||
Color(0.45, 0.05, 0.45, 0.5)
|
Color(0.45, 0.05, 0.45, 0.5)
|
||||||
center = (self.pos[0] + self.width/2,self.pos[1]+self.height/2)
|
center = (self.pos[0] + self.width / 2, self.pos[1] + self.height / 2)
|
||||||
size = min(self.width, self.height) * 0.22
|
size = min(self.width, self.height) * 0.22
|
||||||
Ellipse(pos=(center[0] - size/2, center[1] - size/2), size=(size,size))
|
Ellipse(pos=(center[0] - size / 2, center[1] - size / 2), size=(size, size))
|
||||||
Color(0.15, 0.15, 0.15)
|
Color(0.15, 0.15, 0.15)
|
||||||
draw_text(pos=center, text=text, font_size=size*0.25, halign="center", outline_color=[0.95, 0.95, 0.95])
|
draw_text(pos=center, text=text, font_size=size * 0.25, halign="center", outline_color=[0.95, 0.95, 0.95])
|
||||||
|
|
||||||
|
|
||||||
class BadukPanControls(BoxLayout):
|
class BadukPanControls(BoxLayout):
|
||||||
pass
|
pass
|
||||||
@@ -38,7 +38,6 @@ class Controls(BoxLayout):
|
|||||||
def update_evaluation(self):
|
def update_evaluation(self):
|
||||||
current_node = self.parent.game.current_node
|
current_node = self.parent.game.current_node
|
||||||
move = current_node.single_move
|
move = current_node.single_move
|
||||||
self.score.set_prisoners(self.parent.game.prisoner_count)
|
|
||||||
current_player_is_human_or_both_robots = True # move not self.ai_auto.active(current_node.player) or self.ai_auto.active(1 - current_node.player) # TODO FIX
|
current_player_is_human_or_both_robots = True # move not self.ai_auto.active(current_node.player) or self.ai_auto.active(1 - current_node.player) # TODO FIX
|
||||||
|
|
||||||
info = ""
|
info = ""
|
||||||
|
|||||||
@@ -107,15 +107,6 @@ class CensorableLabel(BoxLayout):
|
|||||||
return self.value.text
|
return self.value.text
|
||||||
|
|
||||||
|
|
||||||
class CensorableScoreLabel(BoxLayout):
|
|
||||||
@property
|
|
||||||
def text(self):
|
|
||||||
return self.value.text
|
|
||||||
|
|
||||||
def set_prisoners(self, bw):
|
|
||||||
self.black.text = str(bw[1])
|
|
||||||
self.white.text = str(bw[0])
|
|
||||||
|
|
||||||
|
|
||||||
def draw_text(pos, text, **kw):
|
def draw_text(pos, text, **kw):
|
||||||
label = CoreLabel(text=text, bold=True, **kw)
|
label = CoreLabel(text=text, bold=True, **kw)
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 8.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 6.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
+17
-3
@@ -16,9 +16,11 @@ from constants import OUTPUT_DEBUG, OUTPUT_ERROR, OUTPUT_EXTRA_DEBUG, OUTPUT_INF
|
|||||||
from engine import KataGoEngine
|
from engine import KataGoEngine
|
||||||
from game import Game, IllegalMoveException, KaTrainSGF, Move
|
from game import Game, IllegalMoveException, KaTrainSGF, Move
|
||||||
from gui import *
|
from gui import *
|
||||||
from gui import LabelledSpinner
|
|
||||||
from gui.popups import NewGamePopup, ConfigPopup
|
from gui.popups import NewGamePopup, ConfigPopup
|
||||||
|
|
||||||
|
from kivy.lang import Builder
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class KaTrainGui(BoxLayout):
|
class KaTrainGui(BoxLayout):
|
||||||
"""Top level class responsible for tying everything together"""
|
"""Top level class responsible for tying everything together"""
|
||||||
@@ -83,6 +85,11 @@ class KaTrainGui(BoxLayout):
|
|||||||
self("ai-move", cn)
|
self("ai-move", cn)
|
||||||
if cn.analysis_ready and self.controls.auto_undo.active(cn.next_player):
|
if cn.analysis_ready and self.controls.auto_undo.active(cn.next_player):
|
||||||
self.game.analyze_undo(cn, self.config("trainer")) # not via message loop
|
self.game.analyze_undo(cn, self.config("trainer")) # not via message loop
|
||||||
|
|
||||||
|
prisoners = self.game.prisoner_count
|
||||||
|
self.board_controls.black_prisoners.text = str(prisoners[1])
|
||||||
|
self.board_controls.white_prisoners.text = str(prisoners[0])
|
||||||
|
|
||||||
if redraw_board:
|
if redraw_board:
|
||||||
Clock.schedule_once(self.board_gui.draw_board, -1) # main thread needs to do this
|
Clock.schedule_once(self.board_gui.draw_board, -1) # main thread needs to do this
|
||||||
Clock.schedule_once(self.board_gui.draw_board_contents, -1)
|
Clock.schedule_once(self.board_gui.draw_board_contents, -1)
|
||||||
@@ -246,7 +253,6 @@ class KaTrainApp(App):
|
|||||||
|
|
||||||
def on_start(self):
|
def on_start(self):
|
||||||
self.gui.start()
|
self.gui.start()
|
||||||
signal.signal(signal.SIGINT, self.signal_handler)
|
|
||||||
|
|
||||||
def on_request_close(self, *args):
|
def on_request_close(self, *args):
|
||||||
self.gui.engine.shutdown()
|
self.gui.engine.shutdown()
|
||||||
@@ -268,4 +274,12 @@ class KaTrainApp(App):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
KaTrainApp().run()
|
with open("gui.kv", encoding='utf-8') as f: # avoid windows using another encoding
|
||||||
|
Builder.load_string(f.read())
|
||||||
|
app = KaTrainApp()
|
||||||
|
signal.signal(signal.SIGINT, app.signal_handler)
|
||||||
|
try:
|
||||||
|
app.run()
|
||||||
|
except Exception:
|
||||||
|
app.on_request_close()
|
||||||
|
raise
|
||||||
Reference in new issue
Block a user