upwords 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +83 -30
- data/exe/upwords +1 -1
- data/lib/upwords.rb +8 -4
- data/lib/upwords/board.rb +4 -12
- data/lib/upwords/cursor.rb +4 -4
- data/lib/upwords/game.rb +70 -232
- data/lib/upwords/move.rb +45 -30
- data/lib/upwords/move_manager.rb +11 -3
- data/lib/upwords/player.rb +55 -48
- data/lib/upwords/shape.rb +11 -2
- data/lib/upwords/ui.rb +360 -0
- data/lib/upwords/version.rb +1 -1
- data/lib/upwords/word.rb +10 -9
- metadata +3 -3
- data/lib/upwords/graphics.rb +0 -149
data/lib/upwords/version.rb
CHANGED
data/lib/upwords/word.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
module Upwords
|
2
2
|
class Word
|
3
|
-
|
4
|
-
# MIN_WORD_LENGTH = 2
|
5
|
-
|
6
3
|
attr_reader :score, :length
|
7
4
|
|
8
5
|
def initialize(posns, board)
|
9
6
|
posns = posns.uniq if posns.is_a?(Array)
|
7
|
+
|
10
8
|
@text = Word.make_string(board, posns)
|
11
9
|
@score = Word.calc_score(board, posns)
|
12
10
|
@length = @text.length
|
@@ -20,11 +18,14 @@ module Upwords
|
|
20
18
|
dict.legal_word?(self.to_s)
|
21
19
|
end
|
22
20
|
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
21
|
+
# Calculate the score of word on board
|
22
|
+
# NOTE: this method assumes that the word has already been played on the board
|
23
|
+
#
|
24
|
+
# A word's score is calculated as follows:
|
25
|
+
# - Sum tile heights of all positions in word
|
26
|
+
# - Multiple score by 2 if all positions in word are only 1 tile high
|
27
|
+
# - Add two points for all 'Qu' tiles in word, if all positions in word are only 1 tile high (somewhat strange rule but whatever)
|
28
|
+
# NOTE: players get a 20 point bonus for using all of their tiles in a move -> this logic is in a separate class
|
28
29
|
def self.calc_score(board, posns)
|
29
30
|
stack_heights = posns.map{|row, col| board.stack_height(row, col)}
|
30
31
|
|
@@ -46,5 +47,5 @@ module Upwords
|
|
46
47
|
posns.map{|row, col| board.top_letter(row, col)}.join
|
47
48
|
end
|
48
49
|
|
49
|
-
end
|
50
50
|
end
|
51
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: upwords
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maxim Pertsov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: curses
|
@@ -118,13 +118,13 @@ files:
|
|
118
118
|
- lib/upwords/cursor.rb
|
119
119
|
- lib/upwords/dictionary.rb
|
120
120
|
- lib/upwords/game.rb
|
121
|
-
- lib/upwords/graphics.rb
|
122
121
|
- lib/upwords/letter_bank.rb
|
123
122
|
- lib/upwords/letter_rack.rb
|
124
123
|
- lib/upwords/move.rb
|
125
124
|
- lib/upwords/move_manager.rb
|
126
125
|
- lib/upwords/player.rb
|
127
126
|
- lib/upwords/shape.rb
|
127
|
+
- lib/upwords/ui.rb
|
128
128
|
- lib/upwords/version.rb
|
129
129
|
- lib/upwords/word.rb
|
130
130
|
- upwords.gemspec
|
data/lib/upwords/graphics.rb
DELETED
@@ -1,149 +0,0 @@
|
|
1
|
-
# require 'colored'
|
2
|
-
|
3
|
-
module Upwords
|
4
|
-
class Graphics < Curses::Window
|
5
|
-
|
6
|
-
def initialize(game)
|
7
|
-
super(0,0,0,0)
|
8
|
-
@game = game
|
9
|
-
@board = @game.board
|
10
|
-
@cursor = @game.cursor
|
11
|
-
@message = ''
|
12
|
-
@rack_visibility = false
|
13
|
-
end
|
14
|
-
|
15
|
-
def refresh
|
16
|
-
clear
|
17
|
-
self << self.to_s
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_s
|
22
|
-
(draw_board + draw_message).zip(draw_stats).map do |board_row, stats_row|
|
23
|
-
(board_row.to_s) + (stats_row.to_s)
|
24
|
-
end.join("\n")
|
25
|
-
end
|
26
|
-
|
27
|
-
def message=(new_message)
|
28
|
-
if new_message.nil?
|
29
|
-
@message = ""
|
30
|
-
else
|
31
|
-
@message = new_message
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def show_rack
|
36
|
-
@rack_visibility = true
|
37
|
-
end
|
38
|
-
|
39
|
-
def hide_rack
|
40
|
-
@rack_visibility = false
|
41
|
-
end
|
42
|
-
|
43
|
-
def toggle_rack_visibility
|
44
|
-
@rack_visibility = !@rack_visibility
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def format_letter(row, col)
|
50
|
-
letter = @board.top_letter(row, col)
|
51
|
-
if letter.nil?
|
52
|
-
letter = " "
|
53
|
-
# add blank space after all other letters except Qu
|
54
|
-
elsif letter != "Qu"
|
55
|
-
letter += " "
|
56
|
-
end
|
57
|
-
letter
|
58
|
-
end
|
59
|
-
|
60
|
-
def draw_player_name
|
61
|
-
"#{@game.current_player.name}'s turn"
|
62
|
-
end
|
63
|
-
|
64
|
-
def draw_score(player)
|
65
|
-
"#{player.name}'s Score: #{player.score}"
|
66
|
-
end
|
67
|
-
|
68
|
-
def draw_last_turn(player)
|
69
|
-
"Last Move: #{player.last_turn}"
|
70
|
-
end
|
71
|
-
|
72
|
-
def draw_letter_rack
|
73
|
-
"Letters: #{@game.current_player.show_rack(!@rack_visibility)} "
|
74
|
-
end
|
75
|
-
|
76
|
-
def draw_space(row, col, cursor_posn)
|
77
|
-
cursor = cursor_posn == [row, col] ? "*" : " "
|
78
|
-
"#{cursor}#{format_letter(row, col)} "
|
79
|
-
end
|
80
|
-
|
81
|
-
def draw_row(row, cursor_posn)
|
82
|
-
["|",
|
83
|
-
(0...@board.num_columns).map do |col|
|
84
|
-
draw_space(row, col, cursor_posn)
|
85
|
-
end.join("|"),
|
86
|
-
"|"].join
|
87
|
-
end
|
88
|
-
|
89
|
-
# This will also display the stack height for now
|
90
|
-
def draw_divider(row, col, show_height=true)
|
91
|
-
height = @board.stack_height(row, col)
|
92
|
-
if show_height && height > 0
|
93
|
-
height = height.to_s
|
94
|
-
else
|
95
|
-
height = "-"
|
96
|
-
end
|
97
|
-
"---#{height}"
|
98
|
-
end
|
99
|
-
|
100
|
-
def draw_row_divider(row, show_height=true)
|
101
|
-
["+",
|
102
|
-
(0...@board.num_columns).map do |col|
|
103
|
-
draw_divider(row, col, show_height)
|
104
|
-
end.join("+"),
|
105
|
-
"+"].join
|
106
|
-
end
|
107
|
-
|
108
|
-
# print grid of top letter on each stack and stack height
|
109
|
-
def draw_board
|
110
|
-
b = [draw_row_divider(0, false)]
|
111
|
-
|
112
|
-
(0...@board.num_rows).each do |i|
|
113
|
-
b << draw_row(i, @cursor.posn)
|
114
|
-
b << draw_row_divider(i)
|
115
|
-
end
|
116
|
-
|
117
|
-
b.to_a
|
118
|
-
end
|
119
|
-
|
120
|
-
def draw_message
|
121
|
-
["", @message.to_s]
|
122
|
-
end
|
123
|
-
|
124
|
-
def draw_stats
|
125
|
-
["--------------------",
|
126
|
-
draw_score(@game.players[0]),
|
127
|
-
"",
|
128
|
-
draw_letter_rack,
|
129
|
-
"--------------------",
|
130
|
-
"",
|
131
|
-
@game.player_count > 1 ?draw_score(@game.players[1]) : "",
|
132
|
-
"",
|
133
|
-
@game.player_count > 2 ? draw_score(@game.players[2]) : "",
|
134
|
-
"",
|
135
|
-
@game.player_count > 3 ? draw_score(@game.players[3]) : "",
|
136
|
-
"",
|
137
|
-
"----------------------",
|
138
|
-
"| Controls |",
|
139
|
-
"----------------------",
|
140
|
-
"Show Letters [SPACE]",
|
141
|
-
"Undo Last Move [DEL]",
|
142
|
-
"Submit Move [ENTER]",
|
143
|
-
"Swap Letter [+]",
|
144
|
-
"Skip Turn [-]",
|
145
|
-
"Quit Game [SHIFT+Q]"].map{|s| " #{s}"} # Left padding
|
146
|
-
end
|
147
|
-
|
148
|
-
end
|
149
|
-
end
|