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