-
Notifications
You must be signed in to change notification settings - Fork 2
/
ttt.rb
101 lines (86 loc) · 1.85 KB
/
ttt.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
class Board
attr_accessor :squares
def initialize
@squares = { a: [nil, nil, nil], b: [nil, nil, nil], c: [nil, nil, nil] }
@turn = 'X'
@winner = nil
@game_over = false
end
def start_game
prompt_user until @game_over
end
def prompt_user
print_board
print 'Give me the coordinates (eg. A0):'
coords = gets.chomp.split('')
mark_board(coords[0], coords[1].to_i)
check_for_winner
end
def print_row(array)
array.join('\t')
end
def mark_board(x, y)
x = x.downcase.to_sym
if @squares[x][y].nil?
@squares[x][y] = @turn
toggle_turn
else
puts 'Sorry, this position is already taken. Try again'
end
end
def check_for_winner
if theres_a_winner?
print_board
@game_over = true
puts 'Game Over!'
puts "#{@winner} wins!"
end
end
def check_array(row)
@winner = row[0] if row.uniq.length == 1 && !row[0].nil?
end
def theres_a_winner?
# checks for rows first
@squares.values.each { |row| check_array(row) }
# checking columns
cols = []
(0..2).each do |idx|
cols << [
@squares[:a][idx],
@squares[:b][idx],
@squares[:c][idx]
]
end
cols.each { |col| check_array(col) }
# checks cross
cross = [
[@squares[:a][0],
@squares[:b][1],
@squares[:c][2]],
[@squares[:a][2],
@squares[:b][1],
@squares[:c][0]]
]
cross.each { |n| check_array(n) }
return true unless @winner.nil?
false
end
def toggle_turn
@turn = if @turn == 'X'
'O'
else
'X'
end
end
def print_board
clear_screen
puts "\t0\t1\t2"
puts "A:\t#{@squares[:a]}"
puts "B:\t#{@squares[:b]}"
puts "C:\t#{@squares[:c]}"
end
def clear_screen
system 'clear'
end
end
# Board.new.start_game