tic_tac_doh 0.1.1 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e10b90e82af068949f73309b6aae63a73c6aaeb3
4
- data.tar.gz: 017cf3cb2aecf5387686e96eb808ab08a95fbf9f
3
+ metadata.gz: b924772e319fc4d5374b71f0e6fe6914787bcf57
4
+ data.tar.gz: 83f9604b459ffd185bb9fbc74b9dfc3d053b7cc5
5
5
  SHA512:
6
- metadata.gz: 166d06be2f90a69f1d0a340399e3d3feb39d3c89817c3dde01f2d86c1a5566d0fdb167b4dd1021dc80bc877750e75c4453931146d6a3df138bbb93feca29167a
7
- data.tar.gz: 8526283be5f20ed301f73c03c2a57103a7b10956bb8bdeb68220571776f8c673d646c9d45fa16771b70a5e4cb72b2f000af9b31b3286ecc77ea06a5dab72efe6
6
+ metadata.gz: 96686ecba3a7f20821f0b0775ad44f69b03773d60ac5ed7c7fda4fbf31d3a31478b884b2bc92a740fb3b3014283a753283cabfc8a0bd31cc3968cc419277c8a9
7
+ data.tar.gz: 71f905f7011e7b38a098ab0d1291d33ac92c3e7d7b75a02fd14de7e77659918cb7edfb8baf6466c46be6445604056983c3442e076a2ba63aada62825d663fbdd
data/lib/tic_tac_doh.rb CHANGED
@@ -2,60 +2,84 @@ require 'tic_tac_doh/version'
2
2
 
3
3
  module TicTacDoh
4
4
  class Game
5
- # X starts
6
- # Previous winner starts new game
7
- # or which turn would have followed if draw
8
5
 
9
- attr_reader :players, :grid, :turn
10
- attr_accessor :players
6
+ attr_reader :players, :grid
11
7
 
12
8
  def initialize(args={})
13
9
  @players = []
14
- @turn = 1
15
- # @players << args[:player1] << args[:player2]
10
+ @turn = 0
16
11
  args.fetch(:board_size, 3).times do
17
12
  @grid = Array.new(3) {}
18
13
  end
19
14
  end
20
15
 
16
+ def reset
17
+ prepare_grid
18
+ @turn = rand(0..players.count)
19
+ end
20
+
21
+ def next_turn(cell_position)
22
+ insert_player_move_in_grid(calculate_cell(cell_position))
23
+ end
24
+
25
+ def who_is_next
26
+ { nickname: players[player_turn].nickname, mark: players[player_turn].mark }
27
+ end
28
+
29
+ def player_turn
30
+ @turn % players.count
31
+ end
32
+
21
33
  def set_board_size(size)
22
34
  prepare_grid(size)
23
35
  end
24
36
 
25
- def play
26
- # puts grid.length
27
- # puts players.count
28
- prepare_grid
29
- player_turn ||= 0
30
- until game_over
31
- clear_screen
32
- print_grid
33
- # puts "turn: #{@turn}"
34
- turn(players[player_turn])
35
- player_turn = player_turn == (players.count - 1) ? 0 : player_turn + 1
36
- @turn = @turn + 1 unless game_over
37
+ def scoreboard
38
+ scoreboard = []
39
+ players.each do |player|
40
+ scoreboard << { nickname: player.nickname, score: player.score }
37
41
  end
38
- clear_screen
39
- print_grid
40
- puts "Game Over"
41
- # puts @turn
42
+ scoreboard
42
43
  end
43
44
 
44
- def add_player(mark)
45
- if game_over && valid_mark
46
- players << Player.new(mark: mark)
45
+ def add_player(args)
46
+ if valid_mark(args[:mark])
47
+ players << Player.new(args)
47
48
  true
48
49
  else
49
50
  false
50
51
  end
51
52
  end
52
53
 
54
+ def game_over?
55
+ # Winner
56
+ if symbol_winner?
57
+ return true
58
+ end
59
+ return false unless free_cells?
60
+ true
61
+ end
62
+
63
+ def free_cells?
64
+ @grid.each do |row|
65
+ row.each do |cell|
66
+ return false if cell.is_a? Numeric
67
+ end
68
+ end
69
+ true
70
+ end
71
+
72
+ def winner
73
+ return find_player_by(mark: symbol_winner?) if symbol_winner?
74
+ false
75
+ end
76
+
53
77
  private
54
78
 
55
79
  def valid_mark(mark)
56
- players.each |player| do
80
+ players.each do |player|
57
81
  if player.mark == mark[0]
58
- false
82
+ return false
59
83
  end
60
84
  end
61
85
  true
@@ -73,22 +97,6 @@ module TicTacDoh
73
97
  end
74
98
  end
75
99
 
76
- def game_over
77
- # Winner
78
- if symbol_winner?
79
- return true
80
- end
81
- # No more free cells
82
- @grid.each do |row|
83
- row.each do |cell|
84
- return false if cell.is_a? Numeric
85
- end
86
- end
87
- clear_screen
88
- print_grid
89
- true
90
- end
91
-
92
100
  def symbol_winner?
93
101
  winner_mark = nil
94
102
  grid.length.times do |n|
@@ -102,8 +110,13 @@ module TicTacDoh
102
110
  return winner_mark
103
111
  end
104
112
 
113
+ def find_player_by(args={})
114
+ players.each { |player| return { nickname: player.nickname, mark: player.mark } if player.mark == args[:mark] }
115
+ false
116
+ end
117
+
105
118
  def secuential_mark(mark, row, col, row_step, col_step, counter=1)
106
- return nil unless in_range?(row, col)
119
+ return nil unless within_grid_range?(row, col)
107
120
  if grid[row][col] == mark
108
121
  return grid[row][col] if counter == 3
109
122
  return secuential_mark(mark, row + row_step, col + col_step, row_step, col_step, counter+1)
@@ -112,7 +125,7 @@ module TicTacDoh
112
125
  end
113
126
  end
114
127
 
115
- def in_range? (arg, col)
128
+ def within_grid_range? (arg, col)
116
129
  if arg.is_a? Hash
117
130
  return true if arg[:row] < grid.length && arg[:col] < grid.length if arg[:row] >= 0 && arg[:col] >= 0
118
131
  else
@@ -121,28 +134,6 @@ module TicTacDoh
121
134
  false
122
135
  end
123
136
 
124
- def print_grid
125
- grid.each do |row|
126
- puts row.join('|')
127
- end
128
- end
129
-
130
- def turn(player)
131
- player_action player
132
- end
133
-
134
- def player_action (player)
135
- valid_move = false
136
- until valid_move == true do
137
- position = calculate_cell(player_move player)
138
- valid_move = insert_player_move_in_grid(position, player_mark(player))
139
- end
140
- end
141
-
142
- def clear_screen
143
- # system 'clear' or system 'cls'
144
- end
145
-
146
137
  def calculate_cell(cell_number)
147
138
  row = 0
148
139
  for n in 0..cell_number
@@ -152,26 +143,18 @@ module TicTacDoh
152
143
  {row: row, column: column}
153
144
  end
154
145
 
155
- def insert_player_move_in_grid(position, mark)
146
+ def insert_player_move_in_grid(position)
156
147
  return false unless valid_move? position
157
- @grid[position[:row]][position[:column]] = mark
148
+ @grid[position[:row]][position[:column]] = who_is_next[:mark]
149
+ @turn += 1
158
150
  true
159
151
  end
160
152
 
161
153
  def valid_move?(position)
162
- return false if position[:row] < 0 || position[:row] > (@grid.length) -1
163
- return false if position[:column] < 0 || position[:column] > (@grid.length) -1
154
+ return false if position[:row] < 0 || position[:row] > (@grid.length) - 1
155
+ return false if position[:column] < 0 || position[:column] > (@grid.length) - 1
164
156
  return false unless @grid[position[:row]][position[:column]].is_a? Numeric
165
157
  true
166
-
167
- end
168
-
169
- def player_move(player)
170
- player.move()
171
- end
172
-
173
- def player_mark(player)
174
- player.mark
175
158
  end
176
159
  end
177
160
 
@@ -184,12 +167,6 @@ module TicTacDoh
184
167
  @mark = args[:mark]
185
168
  end
186
169
 
187
- def move()
188
- puts "#{self.mark} turn "
189
- puts "Pick a position"
190
- gets.chomp.to_i
191
- end
192
-
193
170
  def add_to_score(score)
194
171
  @score += score
195
172
  end
@@ -1,3 +1,3 @@
1
1
  module TicTacDoh
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tic_tac_doh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cuadra Quevedo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-04-26 00:00:00.000000000 Z
11
+ date: 2015-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler