Guest User

tictactoe_pve

a guest
Aug 5th, 2021
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.57 KB | None | 0 0
  1. require 'pry'
  2. class Game
  3.   attr_accessor :players, :mark
  4.  
  5.   @@win_possitions = [
  6.     [0, 1, 2],
  7.     [3, 4, 5],
  8.     [6, 7, 8],
  9.     [0, 3, 6],
  10.     [1, 4, 7],
  11.     [2, 5, 8],
  12.     [0, 4, 8],
  13.     [6, 4, 2]
  14.   ]
  15.  
  16.   def self.board=(board)
  17.     @@board = board
  18.   end
  19.  
  20.   def self.board
  21.     @@board
  22.   end
  23.  
  24.   def initialize
  25.     @players = []
  26.     @@board = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
  27.   end
  28.  
  29.   def display_field
  30.     puts "#{@@board[0]} | #{@@board[1]} | #{@@board[2]}"
  31.     puts '---------'
  32.     puts "#{@@board[3]} | #{@@board[4]} | #{@@board[5]}"
  33.     puts '---------'
  34.     puts "#{@@board[6]} | #{@@board[7]} | #{@@board[8]}"
  35.     puts
  36.   end
  37.  
  38.   def clear
  39.     system('clear')
  40.   end
  41.  
  42.   def check_first_turn
  43.     puts 'Чем будете играть? 1 - Х, 2 - О'
  44.     input = $stdin.gets.chomp.to_i
  45.     if input == 1
  46.       @players << Bot.new('O')
  47.       @players << Human.new('X')
  48.     else
  49.       @players << Human.new('O')
  50.       @players << Bot.new('X')
  51.     end
  52.   end
  53.  
  54.   def position_taken?(input)
  55.     @@board[input] == "X" || @@board[input] == "O"
  56.   end
  57.  
  58.   def won?
  59.     @@win_possitions.detect do |combo|
  60.       @@board[combo[0]] == @@board[combo[1]] && @@board[combo[1]] == @@board[combo[2]] && position_taken?(combo[0])
  61.     end
  62.   end
  63.  
  64.   def winner
  65.     won = nil
  66.     if winner = won?
  67.       won = @@board[winner.first]
  68.     end
  69.   end
  70.  
  71.   def start
  72.     check_first_turn
  73.     loop do
  74.       @players.each do |player|
  75.           player.turn
  76.           clear
  77.           display_field
  78.           if won?
  79.             winner = winner()
  80.             puts "Победил игрок: #{winner}"
  81.             exit
  82.           end
  83.           if !@@board.include?(' ')
  84.             puts 'Ничья'
  85.             exit
  86.           end
  87.       end
  88.     end
  89.   end
  90. end
  91.  
  92. class Players
  93.   attr_accessor :mark
  94.  
  95.   def check_cell?(cell)
  96.     cell >= 1 && cell <= 9 && Game.board[cell - 1] == ' '
  97.   end
  98. end
  99.  
  100. class Human < Players
  101.   def initialize(mark)
  102.     @mark = mark
  103.   end
  104.  
  105.   def turn
  106.     puts
  107.     puts 'введите ячейку 1-9'
  108.     cell = $stdin.gets.chomp.to_i
  109.     if check_cell?(cell) # проверка на ввод в диапозоне от 1-9 и что не пустое значение
  110.       Game.board[cell - 1] = mark
  111.     else
  112.       puts 'Выберите свободную ячейку'
  113.       turn
  114.     end
  115.   end
  116. end
  117.  
  118. class Bot < Players
  119.   def initialize(mark)
  120.     @mark = mark
  121.   end
  122.  
  123.   def turn
  124.     cell = rand(1..9)
  125.     if check_cell?(cell)
  126.       Game.board[cell-1] = mark
  127.     else
  128.       turn
  129.     end
  130.   end
  131. end
  132.  
  133.  
Advertisement
Add Comment
Please, Sign In to add comment