add source
This commit is contained in:
commit
acec768a9a
104
tttt.rb
Normal file
104
tttt.rb
Normal file
@ -0,0 +1,104 @@
|
||||
require "socket"
|
||||
|
||||
@server = TCPServer.new(5678)
|
||||
@players = [@server.accept, @server.accept]
|
||||
@labels = %w[X O]
|
||||
@board = [[nil] * 3, [nil] * 3, [nil] * 3]
|
||||
@turn = 0
|
||||
@winner = nil
|
||||
|
||||
def write(msg)
|
||||
@players[@turn].write(msg)
|
||||
end
|
||||
|
||||
def print_board
|
||||
position = 0
|
||||
3.times do |y|
|
||||
write("+---+---+---+\r\n")
|
||||
3.times do |row|
|
||||
3.times do |x|
|
||||
last = x == 2 ? "|\r\n" : ""
|
||||
case row
|
||||
when 0
|
||||
position = y * 3 + x + 1
|
||||
write("|#{position} #{last}")
|
||||
when 1
|
||||
entry = @board[y][x] || " "
|
||||
write("| #{entry} #{last}")
|
||||
when 2
|
||||
write("| #{last}")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
write("+---+---+---+\r\n")
|
||||
end
|
||||
|
||||
def get_selection
|
||||
loop do
|
||||
write("Select a position:\r\n")
|
||||
input = @players[@turn].gets
|
||||
position = input.to_i
|
||||
if position >= 1 && position <= 9
|
||||
y = (position - 1) / 3
|
||||
x = (position - 1) % 3
|
||||
return x, y if @board[y][x].nil?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def take_turn
|
||||
print_board
|
||||
x, y = get_selection
|
||||
@board[y][x] = @labels[@turn]
|
||||
print_board
|
||||
end
|
||||
|
||||
def check_win_row(y)
|
||||
if @board[y][0] && @board[y][0] == @board[y][1] && @board[y][0] == @board[y][2]
|
||||
return @board[y][0]
|
||||
end
|
||||
end
|
||||
|
||||
def check_win_col(x)
|
||||
if @board[0][x] && @board[0][x] == @board[1][x] && @board[0][x] == @board[2][x]
|
||||
return @board[0][x]
|
||||
end
|
||||
end
|
||||
|
||||
def check_end
|
||||
3.times do |i|
|
||||
if @winner = check_win_row(i)
|
||||
return
|
||||
elsif @winner = check_win_col(i)
|
||||
return
|
||||
end
|
||||
end
|
||||
if @board[0][0] && @board[0][0] == @board[1][1] && @board[0][0] == @board[2][2]
|
||||
return @winner = @board[0][0]
|
||||
end
|
||||
if @board[0][2] && @board[0][2] == @board[1][1] && @board[0][2] == @board[2][0]
|
||||
return @winner = @board[0][2]
|
||||
end
|
||||
end
|
||||
|
||||
def print_end
|
||||
if @winner
|
||||
win_msg = "#{@winner} wins!"
|
||||
else
|
||||
win_msg = "Tie game!"
|
||||
end
|
||||
@players.each do |client|
|
||||
client.write("Game over. #{win_msg}\r\n")
|
||||
end
|
||||
end
|
||||
|
||||
9.times do
|
||||
take_turn
|
||||
@turn ^= 1
|
||||
check_end
|
||||
break if @winner
|
||||
end
|
||||
|
||||
print_board
|
||||
print_end
|
Loading…
x
Reference in New Issue
Block a user