Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

211
LINES

< > BotCompany Repo | #1007370 // Player VS Player [WORKS]

JavaX source code (desktop) [tags: use-pretranspiled] - run with: x30.jar

Download Jar. Uses 4489K of libraries. Click here for Pure Java version (7322L/51K).

1  
!7
2  
3  
static CirclesAndLines cal;
4  
static Thinker thinker;
5  
6  
!include #1007377 // traits
7  
8  
p-pretty {
9  
  cal = new CirclesAndLines;
10  
  makeGraph();
11  
  Canvas canvas = cal.show(900, 600);
12  
  (thinker = nu(Thinker, +cal, +canvas,
13  
    resetGraph := f makeGraph, think := f think)).init();
14  
}
15  
16  
svoid makeGraph {
17  
  mergedNodes = 0;
18  
  cal.clear();
19  
  Circle a = cal.circle_autoVis("PLAYER", "Chess Player", 0.25, 0.7);
20  
  Circle b = cal.circle_autoVis("PLAYER", "Chess Player", 0.75, 0.7);
21  
  cal.arrow(a, "VS", b);
22  
  cal.circle_autoVis("MAGNUS CARLSEN", 0.25, 0.25);
23  
  cal.circle_autoVis("HIKARU NAKAMURA", 0.75, 0.25);
24  
}
25  
26  
sbool think() {
27  
  // Find an isolated node and try to merge it with another node
28  
  if (!anyIsolatedNodes()) false;
29  
  Pair<Circle, Circle> p = findTwoRandomNodes();
30  
  if (p != null && isIsolated(p.a) && nodesAttract(p.a, p.b))
31  
    mergeNodes(p.a, p.b);
32  
  true;
33  
}
34  
35  
sbool traitsAttract(S a, S b) {
36  
  ret isPair(a, b, "player", "magnus carlsen")
37  
    || isPair(a, b, "player", "hikaru nakamura");
38  
}
39  
40  
sbool traitsDiverge(S a, S b) {
41  
  ret isPair(a, b, "magnus carlsen", "hikaru nakamura");
42  
}
43  
44  
sbool anyIsolatedNodes() {
45  
  for (Circle c : cal.circles) if (isIsolated(c)) true; false;
46  
}
47  
48  
sbool isIsolated(Circle c) {
49  
  for (Line l : cal.lines)
50  
    if (l.a == c || l.b == c)
51  
      false;
52  
  true;
53  
}
54  
55  
static Pair<Circle, Circle> findTwoRandomNodes() {
56  
  ret selectRandomPair(cal.circles);
57  
}
58  
59  
sbool nodesAttract(Circle a, Circle b) {
60  
  if (nodesDiverge(a, b)) false;
61  
  for (S x : a.traits())
62  
    for (S y : b.traits())
63  
      if (traitsAttract(x, y))
64  
        true;
65  
  false;
66  
}
67  
68  
sbool nodesDiverge(Circle a, Circle b) {
69  
  for (S x : a.traits())
70  
    for (S y : b.traits())
71  
      if (traitsDiverge(x, y))
72  
        true;
73  
  false;
74  
}
75  
76  
sbool isPair(S a, S b, S x, S y) {
77  
  ret eqic(a, x) && eqic(b, y)
78  
    || eqic(a, y) && eqic(b, x);
79  
}
80  
81  
static int mergedNodes;
82  
83  
svoid mergeNodes(Circle a, Circle b) {
84  
  assertTrue("Circle must be isolated to merge", isIsolated(a));
85  
  b.img = a.img;
86  
  b.addTraits(a.traits());
87  
  cal.circles.remove(a);
88  
  thinker.status("Merged " + n(mergedNodes += 2, "node") + ".");
89  
}
90  
91  
sclass Thinker {
92  
  double delay = 0.1; // seconds
93  
  bool continueOnError = true;
94  
  CirclesAndLines cal;
95  
  Canvas canvas;
96  
  JTextArea textArea;
97  
  JButton btnThink;
98  
  volatile bool thinking;
99  
  S status, initialStatus = "Initial state.";
100  
  int step;
101  
  bool inited;
102  
  O think; // func -> bool
103  
  O resetGraph; // runnable
104  
  Throwable error;
105  
  
106  
  void init {
107  
    if (inited) ret;
108  
    inited = true;
109  
    addControls();
110  
    thread "Think" { Thinker.this.run(); }
111  
  }
112  
  
113  
  void addControls {
114  
    swing {
115  
      addToWindowRight(canvas, withMargin(vstackWithSpacing(
116  
        jMaxWidth(167,
117  
          jMinHeight(180, jscroll(textArea = setFontSize(16, makeBold(wordWrapTypeWriterTextArea()))))),
118  
        btnThink = fatButton(100, "Think!", r { thinkOrStop() }),
119  
        fatButton(60, "Think again!", r { thinkAgain() }),
120  
        fatButton(60, "Reset", r { reset() })
121  
        )));
122  
      increaseFrameWidth(canvas, 180);
123  
      status(initialStatus);
124  
    }
125  
  }
126  
  
127  
  void startOver {
128  
    lock(cal.lock, "StartOver", 2000);
129  
    try {
130  
      step = 0; status(initialStatus);
131  
      callF(resetGraph);
132  
    } finally {
133  
      unlock(cal.lock, "StartOver");
134  
    }
135  
    if (canvas != null) canvas.update();
136  
  }
137  
  
138  
  void thinkAgain {
139  
    startOver();
140  
    thinking(true);
141  
  }
142  
  
143  
  void reset {
144  
    thinking(false);
145  
    startOver();
146  
  }
147  
  
148  
  void run {
149  
    repeat {
150  
      sleepSeconds(delay);
151  
      if (thinking) pcall {
152  
        print("Thinking");
153  
        bool t;
154  
        time { t = think(); }
155  
        if (!t) {
156  
          thinking(false);
157  
          print("Done");
158  
        } else {
159  
          print("Updating");
160  
          if (canvas != null) canvas.update();
161  
        }
162  
      }
163  
    }
164  
  }
165  
  
166  
  void thinking(bool b) {
167  
    thinking = b; status();
168  
    setText(btnThink, b ? "<html><center>Stop<br>thinking</center></html>" : "Think!");
169  
  }
170  
  
171  
  void status(S s) {
172  
    status = s; status();
173  
  }
174  
  
175  
  void thinkOrStop {
176  
    thinking(!thinking);
177  
  }
178  
  
179  
  bool think() {
180  
    if (think == null) false;
181  
    lock(cal.lock, "Thinking", 5000);
182  
    try {
183  
      step++; status();
184  
      if (isFalse(callF(think))) {
185  
        step--; status();
186  
        false;
187  
      }
188  
      true;
189  
    } catch e {
190  
      printStackTrace(e);
191  
      error = getInnerException(e);
192  
      ret continueOnError;
193  
    } finally {
194  
      unlock(cal.lock, "Done thinking");
195  
    }
196  
  }
197  
  
198  
  JButton fatButton(int h, S text, O action) {
199  
    JButton btn = jbutton(text, action);
200  
    btn.setFont(sansSerifBold(16));
201  
    ret jMinSize(167, h, btn);
202  
  }
203  
  
204  
  void status {
205  
    setText(textArea, status + "\n\n" +
206  
      (thinking ? "Thinking...\n\n" : "") +
207  
      (step == 0 ? "No thoughts made yet."
208  
        : "Thoughts made: " + step) +
209  
      (error == null ? "" : "\n\nERROR: " + exceptionToStringShort(error)));
210  
  }
211  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt

No comments. add comment

Snippet ID: #1007370
Snippet name: Player VS Player [WORKS]
Eternal ID of this version: #1007370/70
Text MD5: b509dbf9497084f5f25c446989e38fef
Transpilation MD5: fc94b8766506fe7f94bb20459cd3a887
Author: stefan
Category: javax / a.i. / gui
Type: JavaX source code (desktop)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2017-03-19 18:02:03
Source code size: 5030 bytes / 211 lines
Pitched / IR pitched: No / No
Views / Downloads: 670 / 1563
Version history: 69 change(s)
Referenced in: [show references]