SHOW:
|
|
- or go back to the newest paste.
1 | ;Coded by errorseven | |
2 | #Persistent | |
3 | #SingleInstance, Force | |
4 | SetBatchLines -1 | |
5 | ; Loading Word lists into Variables | |
6 | if (FileExist(A_ScriptDir . "\sorted.txt") && FileExist(A_ScriptDir . "\alpha.txt")) { | |
7 | FileRead, wordList, %A_ScriptDir%\sorted.txt | |
8 | FileRead, alphaList, %A_ScriptDir%\alpha.txt | |
9 | } | |
10 | Else { ; If Word lists don't exist download, sort, and create files | |
11 | MsgBox, 64, Downloading Dictionary File, Downloading a large Dictionary and running cutom sorting functions. `nThis can take some time... Please be patient. | |
12 | whr := ComObjCreate("WinHttp.WinHttpRequest.5.1") | |
13 | whr.Open("GET", "https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt", true) | |
14 | whr.Send() | |
15 | ; Using 'true' above and the call below allows the script to remain responsive. | |
16 | whr.WaitForResponse() | |
17 | words := whr.ResponseText | |
18 | Sort, words, F SortFunc | |
19 | FileAppend, %Words%, %A_ScriptDir%\sorted.txt | |
20 | For each, Line in StrSplit(Words, "`n", "`r" ) { | |
21 | x .= AlphaSort(Line) . "`n" | |
22 | } | |
23 | FileAppend, %x%, %A_ScriptDir%\alpha.txt | |
24 | FileRead, wordList, %A_ScriptDir%\sorted.txt | |
25 | FileRead, alphaList, %A_ScriptDir%\alpha.txt | |
26 | } | |
27 | ||
28 | InputBox, Mode, Daily Programmer Challenge #198, Please enter [Easy] [Intermediate] or [Hard] , 640, 480 | |
29 | If (ErrorLevel = 1) ;If Cancel or Close Exit | |
30 | ExitApp | |
31 | ||
32 | If !(Mode == "Easy" Or Mode == "Intermediate" or Mode == "Hard") { ;If not Easy, Intermediate, or Hard Reload! | |
33 | Reload | |
34 | } | |
35 | ||
36 | Game := New WWE(wordList, alphaList, Mode) | |
37 | ||
38 | Gui, Font, s15, Consolas ;Gui stuff | |
39 | Gui, Add, Edit, x0 y0 w500 h500 Disabled Border -VScroll vDisplay | |
40 | Gui, Add, Edit, x0 y500 w500 h100 Disabled Border -VScroll -Wrap vWordDisplay | |
41 | Gui, Font, s10, Consolas | |
42 | Gui, Add, Edit, Uppercase x0 y601 w500 h25 vUserinput | |
43 | ||
44 | Gui, Show, w500 h625, Words With Enemies | |
45 | ||
46 | SetTimer, Running, 1000 ;Updates Display ever 100ms | |
47 | ||
48 | Running: | |
49 | GuiControl,, Display, % Game.Display | |
50 | GuiControl,, WordDisplay, % "Your Score Enemy Score`n`n" . Game.Score . " " . Game.EnemyScore | |
51 | If (Game.Round > 5) { | |
52 | MsgBox % Game.FinalScore() | |
53 | Reload | |
54 | } | |
55 | Return | |
56 | ||
57 | #IfWinActive Words With Enemies ;If Gui is active | |
58 | ~Enter:: | |
59 | Gui, Submit, NoHide | |
60 | If (Game.IsWord(UserInput) && Game.InLetters(UserInput) && UserInput != "") { | |
61 | Game.Play(UserInput) | |
62 | } | |
63 | else { | |
64 | MsgBox, 4144, Invalid Input, The word you submitted: %UserInput% is invalid.`nYou either used characters that were not present in the selected game`nor your word does not appear in the dictionary. Please try again. | |
65 | } | |
66 | GuiControl,, Userinput, % "" ;Clears UserInput | |
67 | Return | |
68 | ||
69 | ||
70 | Class WWE { | |
71 | ||
72 | __New(x, y, z) { ;Declare Globals | |
73 | Global | |
74 | this.Round := 1 | |
75 | this.wList := x | |
76 | this.aList := y | |
77 | this.Mode := z | |
78 | this.Word := | |
79 | this.EnemyWord := | |
80 | this.DLetters := | |
81 | this.Letters := this.SetLetters() | |
82 | this.Display := "Your Letters:`n" . this.DLetters | |
83 | this.Score := 0 | |
84 | this.EnemyScore := 0 | |
85 | } | |
86 | ||
87 | Play(x) { ;Determined order in which to run the various methods that make this game work. | |
88 | this.EnemyWord := Format("{:U}", this.setEnemyWord()) | |
89 | this.battle(this.Word, this.EnemyWord) | |
90 | this.Letters := this.SetLetters() | |
91 | this.Display := this.UpdateDisplay() | |
92 | this.Round++ | |
93 | Return | |
94 | } | |
95 | ||
96 | battle(x, y) { ;Meat and bones of the Words With Enemies Easy Challenge, Cut down to fit this challenge. | |
97 | For each, Char in StrSplit(x,,"`n") { | |
98 | if InStr(y, SubStr(Char, 1,1)) { | |
99 | x := StrReplace(x, Char,,, 1) | |
100 | y := StrReplace(y, Char,,, 1) | |
101 | } | |
102 | } | |
103 | this.Update_Score(StrLen(x)) | |
104 | this.Update_EnemyScore(StrLen(y)) | |
105 | Return | |
106 | } | |
107 | ||
108 | InLetters(x) { | |
109 | y := this.Letters | |
110 | For Each, Char in StrSplit(x,,"`r") { | |
111 | if InStr(y, SubStr(Char, 1,1)) { | |
112 | x := StrReplace(x, Char,,, 1) | |
113 | y := StrReplace(y, Char,,, 1) | |
114 | } | |
115 | } | |
116 | If (StrLen(x) != 0) { | |
117 | Return False | |
118 | } | |
119 | Return True | |
120 | } | |
121 | ||
122 | SetLetters() { ;Random selection of letters | |
123 | vowels := "aeiouy" | |
124 | consonants := "bcdfghjkllmnpqrstvwxz" | |
125 | vowels := StrSplit(vowels,, "`r") | |
126 | consonants := StrSplit(consonants,, "`r") | |
127 | ||
128 | Loop, 14 { | |
129 | Random, out, 1, % consonants.MaxIndex() | |
130 | letters .= consonants[out] | |
131 | } | |
132 | ||
133 | Loop, 6 { | |
134 | Random, out, 1, % vowels.MaxIndex() | |
135 | letters .= vowels[out] | |
136 | letters := Format("{:U}", letters) | |
137 | } | |
138 | For each, Char in StrSplit(letters,, "`r") { | |
139 | y .= Char . " " | |
140 | } | |
141 | ||
142 | this.DLetters := y | |
143 | Return letters | |
144 | } | |
145 | ||
146 | UpdateDisplay() { ;Main game window | |
147 | x := this.Display | |
148 | If (this.Round = 5) { | |
149 | x .= "`nYour Word:" . this.Word . " vs Enemy Word:" . this.EnemyWord | |
150 | Return x | |
151 | } | |
152 | x := this.Display | |
153 | x .= "`nYour Word:" . this.Word . " vs Enemy Word:" . this.EnemyWord . "`n`nYour Letters:`n" . this.DLetters | |
154 | Return x | |
155 | } | |
156 | ||
157 | IsWord(x) { ;If UserInput is a Word in List Return True | |
158 | For each, Line in StrSplit(this.wList, "`n", "`r") { | |
159 | If (x = Line) { | |
160 | this.Word := Format("{:U}", x) | |
161 | Return True | |
162 | } | |
163 | } | |
164 | Return False | |
165 | } | |
166 | ||
167 | setEnemyWord() { ;Returns selected word based on Alpha Sorted list and Mode selected | |
168 | sortedletters := AlphaSort(this.Letters) | |
169 | z := StrSplit(this.wList, "`n", "`r") | |
170 | For each, Line in StrSplit(this.aList, "`n", "`r") { | |
171 | Count++ | |
172 | If (InStr(sortedletters, Line) && StrLen(Line) > 1) { | |
173 | x .= z[Count] . "`n" | |
174 | } | |
175 | } | |
176 | x := StrSplit(x, "`n", "`r") | |
177 | y := x.MaxIndex() ;Get the Number of words in list | |
178 | ||
179 | If (this.Mode == "Hard") { | |
180 | Out := (y - 1) | |
181 | } | |
182 | If (this.Mode == "Intermediate") { | |
183 | Out := (y / 2) | |
184 | } | |
185 | If (this.Mode == "Easy") { | |
186 | Out := (y / 4) | |
187 | } | |
188 | Out := Round(Out) | |
189 | Return x[Out] | |
190 | } | |
191 | ||
192 | Update_Score(x) { ;Update Player Score | |
193 | this.Score += x | |
194 | Return | |
195 | } | |
196 | ||
197 | Update_EnemyScore(x) { ;Updates Enemy Score | |
198 | this.EnemyScore += x | |
199 | Return | |
200 | } | |
201 | ||
202 | FinalScore() { ;Compares score declares winner | |
203 | Return x ((this.Score > this.EnemyScore) ? "You Won with a score of: " . this.Score | |
204 | : (this.Score < this.EnemyScore) ? "The Enemy Won with a score of: " . this.EnemyScore | |
205 | : "The Game was a Tie!") | |
206 | } | |
207 | } | |
208 | ||
209 | AlphaSort(n) { ;Sort function used to sort var by alphabet | |
210 | delimiter := Chr(1) | |
211 | delimited := RegExReplace(n, "(.)", "$1" . delimiter) | |
212 | option = D%delimiter% | |
213 | Sort delimited, %option% | |
214 | StringReplace result, delimited, %delimiter%, , All | |
215 | return result | |
216 | } | |
217 | ||
218 | SortFunc(lineA, lineB, offset) { ;Sort function used to sort list smallest to largest | |
219 | if (StrLen(lineA) != StrLen(lineB) && StrLen(lineA) > 1) | |
220 | return StrLen(lineA)-StrLen(lineB) | |
221 | return -offset | |
222 | } | |
223 | ||
224 | GuiClose: | |
225 | ExitApp | |
226 | return |