Цей простий алгоритм штучного інтелекту знав ще зі школи. Про нього було написано в якійсь радянській книжечці типу "Наука і Техніка". Тож після десятирічь забуття, про нього згадав після наступної статті на Хабрі - http://habrahabr.ru/blogs/artificial_intelligence/84125/ (раджу прочитати зараз).
Позавчора ввечері потратив аж півгодинки свого часу і в результаті вийшов скриптик на пітоні з 75 строчок(хоча сам алгоритм гри лише 30 строчок), що реалізує цей алгоритм. Що найдивовижніше - це те що воно ще й працювало )
Зняв відео про це, точніше кажучи зняв 2 відео, бо перше не сподобалося, але потім здуру на Вімео залив першу поганеньку версію, за що вибачаюсь, і прийдеться терпіти мій сонний голос :)
Self-Education Python Script from presidentua on Vimeo.
import random
class Game(object):
memory = {}
one_game = {}
def __init__(self, sticks_count):
self.sticks_count = sticks_count
for i in xrange(self.sticks_count+1):
self.memory[i] = {1:2, 2:2, 3:2}
def start(self):
self.one_game = {}
def finish_win(self):
for i in self.one_game:
self.memory[i][self.one_game[i]] += 1
def finish_loos(self):
self.memory[ max(self.one_game) ][self.one_game[ max(self.one_game) ]] -= 1
def one_move(self, stick):
ch = []
for i in self.memory[stick]:
for _ in xrange(self.memory[stick][i]):
ch.append(i)
if not ch:
ch.append(1)
self.one_game[stick] = random.choice( ch )
return self.one_game[stick]
g = Game(random.randint(15,20))
for _ in xrange(20000):
g.start()
s = g.sticks_count
while 1:
if s<=3:
g.finish_win()
break
s -= g.one_move(s)
if s<=3:
g.finish_loos()
break
s -= random.randint(1,3)
c = i = 0
for _ in xrange(5):
g.start()
s = g.sticks_count
while 1:
print ''.join([ '!' for _ in xrange(s)])
if s<=3:
g.finish_win()
c += 1
print 'C WIN!!!'
break
s -= g.one_move(s)
print ''.join([ '!' for _ in xrange(s)])
if s<=3:
g.finish_loos()
i += 1
print 'C lose ('
break
try:
r_m = int(raw_input('i:'))
if (r_m > 3) or (r_m < 1):
r_m = 1
except:
r_m = 1
s -= r_m
print 'C: %s'%c
print 'I: %s'%i
