Initial commit, doesn't work atm
This commit is contained in:
commit
9376c1f4fb
130
ticcy.rb
Normal file
130
ticcy.rb
Normal file
|
@ -0,0 +1,130 @@
|
|||
# coding: utf-8
|
||||
|
||||
DEF = " "
|
||||
PLAYS = [DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF]
|
||||
SCENARIOS = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
|
||||
COM = "COM"
|
||||
COM_VAL = " O "
|
||||
PLAYER = "PLAYER"
|
||||
GAME_DONE = false
|
||||
PLAYER_VAL = " X "
|
||||
|
||||
|
||||
class Array
|
||||
def same_values?
|
||||
self.uniq.length == 1
|
||||
end
|
||||
end
|
||||
|
||||
def check_win board, player
|
||||
cur_play = player == PLAYER ? PLAYER_VAL : COM_VAL
|
||||
|
||||
SCENARIOS.each do |s|
|
||||
tmp = s.map {|i| board[i]}
|
||||
# p board
|
||||
if (not tmp.include? " ") and tmp.same_values? and tmp[0] == cur_play then
|
||||
# p tmp
|
||||
# p SCENARIOS
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
def check_full board
|
||||
if not board.include? " " then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def draw_board board
|
||||
return "
|
||||
|#{board[0]}|#{board[1]}|#{board[2]}|
|
||||
-------------
|
||||
|#{board[3]}|#{board[4]}|#{board[5]}|
|
||||
-------------
|
||||
|#{board[6]}|#{board[7]}|#{board[8]}|
|
||||
-------------"
|
||||
end
|
||||
|
||||
def set player, idx
|
||||
if player == PLAYER
|
||||
PLAYS[idx] = PLAYER_VAL
|
||||
elsif
|
||||
PLAYS[idx] = COM_VAL
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
def ai_turn board, player, depth=0
|
||||
if (check_win board, player == PLAYER ? COM : PLAYER) then
|
||||
return -10 + depth
|
||||
end
|
||||
|
||||
if check_full board then
|
||||
return 0
|
||||
end
|
||||
|
||||
max_seen = -(Float::INFINITY)
|
||||
index = 0
|
||||
value = player == PLAYER ? PLAYER_VAL : COM_VAL
|
||||
|
||||
(0...9).each do |x|
|
||||
if board[x] == DEF then
|
||||
new_board = board.dup
|
||||
new_board[x] = value
|
||||
lol = player == PLAYER ? COM : PLAYER
|
||||
move_eval = -(ai_turn new_board, lol, depth+1)
|
||||
|
||||
if move_eval > max_seen then
|
||||
# p [move_eval, x]
|
||||
max_seen = move_eval
|
||||
index = x
|
||||
end
|
||||
end
|
||||
end
|
||||
if depth == 0 then
|
||||
set COM, index
|
||||
end
|
||||
return max_seen
|
||||
end
|
||||
|
||||
|
||||
def play_game
|
||||
while true do
|
||||
# system "clear"
|
||||
|
||||
# if (check_win PLAYS, PLAYER) == true then
|
||||
# print "We have a winner!\n"
|
||||
# break
|
||||
# end
|
||||
# if check_full board then
|
||||
# print "Game over!\n"
|
||||
# break
|
||||
# end
|
||||
|
||||
print draw_board PLAYS
|
||||
puts "\nPick one between 0-8"
|
||||
choice = gets
|
||||
|
||||
if PLAYS[choice.to_i] != " " then
|
||||
print "Space is already taken"
|
||||
else
|
||||
set PLAYER, choice.to_i
|
||||
ai_turn PLAYS, COM
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
play_game
|
Loading…
Reference in New Issue
Block a user