Uses 3874K of libraries. Click here for Pure Java version (5061L/35K/132K).
1 | !7 |
2 | |
3 | !include #1007303 // CirclesAndLines |
4 | |
5 | static CirclesAndLines cal; |
6 | static Circle a, b, c, d; |
7 | static Canvas canvas; |
8 | static JButton btnThink, btnStartOver; |
9 | static JTextArea textArea; |
10 | volatile sbool thinking; |
11 | static int step; |
12 | static S status, initial = "I wonder: Is Donald good or bad?"; |
13 | |
14 | extend Base { |
15 | new L<S> traits; |
16 | bool hasTrait(S t) { ret containsIC(traits(), t); } |
17 | L<S> traits() { if (text != null && neq(first(traits), text)) traits.add(0, text); ret traits; } |
18 | |
19 | S textForRender() { |
20 | L<S> traits = traits(); |
21 | if (l(traits) <= 1) ret text; |
22 | ret text + " [" + join(", ", dropFirst(traits)) + "]"; |
23 | } |
24 | } |
25 | |
26 | p { |
27 | substance("Magellan"); |
28 | cal = new CirclesAndLines; |
29 | a = cal.addCircle(#1007291, 0.25, 0.25, "DONALD"); |
30 | b = cal.addCircle(#1007292, 0.75, 0.25, "BOMBS"); |
31 | c = cal.addCircle(#1007314, 0.25, 0.715, "GOOD"); |
32 | d = cal.addCircle(#1007319, 0.75, 0.8, "BAD"); |
33 | addArrows(); |
34 | canvas = cal.showAsFrame(1000, 600); |
35 | swing { |
36 | addToWindowRight(canvas, withMargin(vstackWithSpacing( |
37 | jMaxWidth(167, |
38 | jMinHeight(180, jscroll(textArea = setFontSize(16, makeBold(wordWrapTypeWriterTextArea()))))), |
39 | btnThink = fatButton(100, "Think!", f action), |
40 | btnStartOver = fatButton(60, "Start over", f startOver)))); |
41 | status = initial; status(); |
42 | } |
43 | |
44 | hideConsole(); |
45 | |
46 | repeat { |
47 | sleepSeconds(2); |
48 | if (thinking) pcall { |
49 | print("Thinking"); |
50 | bool t; |
51 | time { t = think(); } |
52 | if (!t) { |
53 | thinking(false); |
54 | print("Done"); |
55 | } else { |
56 | print("Updating"); |
57 | canvas.update(); |
58 | } |
59 | } |
60 | } |
61 | } |
62 | |
63 | svoid startOver { |
64 | cal.lock.lock(); |
65 | step = 0; status = initial; status(); |
66 | try { |
67 | for (Circle c : cal.circles) c.traits.clear(); |
68 | cal.lines.clear(); |
69 | addArrows(); |
70 | } finally { |
71 | cal.lock.unlock(); |
72 | } |
73 | canvas.update(); |
74 | } |
75 | |
76 | svoid addArrows { |
77 | cal.addArrow(a, b, "MAKES"); |
78 | cal.addArrow(b, d, "ARE"); |
79 | } |
80 | |
81 | svoid thinking(bool b) { |
82 | thinking = b; status(); |
83 | setText(btnThink, b ? "<html><center>Stop<br>thinking</center></html>" : "Think!"); |
84 | } |
85 | |
86 | svoid action { |
87 | thinking(!thinking); |
88 | } |
89 | |
90 | // for (X is Y): addTrait(X, Y); |
91 | // for (X makes bad): addLink(X is bad); |
92 | sbool think() { |
93 | cal.lock.lock(); |
94 | try { |
95 | step++; status(); |
96 | bool change = false; |
97 | for (Line l : cloneList(cal.lines)) { |
98 | if (l.hasTrait("is") || l.hasTrait("are")) { |
99 | int n = l(l.a.traits()); |
100 | // l.a.traits().addAll(l.b.traits()); // funny version |
101 | setAddAll(l.a.traits(), l.b.traits()); |
102 | change |= l(l.a.traits()) > n; |
103 | } |
104 | if (eqic(l.text, "makes") && l.b.hasTrait("bad")) { |
105 | change |= addLink(l.a, "IS", cal.findCircle("bad")); |
106 | } |
107 | } |
108 | if (a.hasTrait("bad")) |
109 | status = "Donald is bad!"; |
110 | else if (a.hasTrait("good")) |
111 | status = "Donald is good!"; |
112 | status(); |
113 | ret change; |
114 | } finally { |
115 | cal.lock.unlock(); |
116 | } |
117 | } |
118 | |
119 | sbool addLink(Circle a, S link, Circle b) { |
120 | Arrow arrow = cal.findArrow(a, b); |
121 | if (arrow == null) { |
122 | arrow = cal.addArrow(a, b, link); |
123 | true; |
124 | } else { |
125 | if (arrow.hasTrait(link)) false; |
126 | arrow.traits().add(link); |
127 | true; |
128 | } |
129 | } |
130 | |
131 | static JButton fatButton(int h, S text, O action) { |
132 | JButton btn = jbutton(text, action); |
133 | btn.setFont(sansSerifBold(16)); |
134 | ret jMinSize(167, h, btn); |
135 | } |
136 | |
137 | svoid status { |
138 | setText(textArea, status + "\n\n" + |
139 | (thinking ? "Thinking...\n\n" : "") + |
140 | (step == 0 ? "No thoughts made yet." |
141 | : "Thoughts made: " + step)); |
142 | } |
Began life as a copy of #1007312
download show line numbers debug dex old transpilations
Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt, wtqryiryparv
No comments. add comment
Snippet ID: | #1007323 |
Snippet name: | Is Donald Good Or Bad? [WORKS] |
Eternal ID of this version: | #1007323/63 |
Text MD5: | 524a198dfbff67e986f0e33f55feeef8 |
Transpilation MD5: | bec7b2072da0adac7f26f40755cb22a0 |
Author: | stefan |
Category: | javax / gui |
Type: | JavaX source code |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2017-03-16 01:37:29 |
Source code size: | 3596 bytes / 142 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 691 / 1029 |
Version history: | 62 change(s) |
Referenced in: | [show references] |