крестики-нолики


19

Напишите программу на выбранном вами языке, которая отлично играет в крестики-нолики на доске 3 * 3 против игрока-человека. Однако каждый шаг должен быть другой программой , сгенерированной из предыдущей итерации.

Как и в какой форме вы оцениваете человеческий вклад, зависит от вас, но это должно быть прочитано из стандартного ввода. Точно так же вы можете свободно выбирать метод, которым вы будете определять, какой игрок запускает (например, вы сначала спрашиваете, или вы позволяете человеку вводить неверный ход, чтобы сигнализировать, что компьютер запускается, или другие идеи).

Подтверждать ходы не нужно, вы можете предположить, что человек играет честно.

По сути, у вас есть программа, которая соответствует состоянию доски. Состояние печатается любым узнаваемым способом, но ожидается, по крайней мере, следующий уровень детализации:

X..
00X
x..

После того, как человек-игрок вошел в свои ходы, ваша программа должна сгенерировать следующую итерацию в виде исходного файла на том же языке (либо для стандартного вывода, либо для файла) и завершиться. Вам не разрешено хранить информацию где-либо еще за пределами этого исходного файла. (вашей программе не обязательно собирать и запускать сгенерированную программу, это может сделать пользователь - однако, это не запрещено). Когда сгенерированная программа собирается и запускается, она будет вести себя аналогично, отображать состояние, ждать ввода пользователя и т. Д.

В конце игры вы должны распечатать результат (независимо от того, выиграл он или нет) любым однозначно идентифицируемым способом.

Под идеальной игрой я имею в виду, что программа не должна проигрывать, и если есть возможность добиться победы, она должна выиграть.

Самый короткий код выигрывает , победитель выбирается как минимум через 10 дней после первой действительной записи.

Вы получите на 10% меньше баллов, если ваша программа справится со сборкой и запуском следующей итерации. (Я знаю, что, скорее всего, оно того не стоит). Конечно, сама программа должна быть завершена к тому времени, когда следующая итерация примет ходы от пользователя.

Если вы используете какие-то странные уловки, пожалуйста, опубликуйте краткое объяснение с вашим кодом.


2
Хороший вызов, но я думаю, что я собираюсь отказаться.
Джон Дворак

«Каждый шаг должен быть другой программой». Вы имеете в виду, что «каждая игра должна быть инициирована и управляться новым отдельным экземпляром оригинальной программы»?
DavidC

1
@DavidCarraher: Нет. Каждый ход, а не только каждая игра. Проверьте описание под примером платы. Когда компьютер должен сделать ход (так что состояние платы меняется), ваша программа должна сгенерировать исходный файл, который при сборке и запуске станет следующим состоянием. Исходная программа затем выходит. Вновь созданная программа при перемещении будет вести себя аналогично: она создает исходный файл, который при сборке и запуске станет следующим состоянием и т. Д. Поскольку хранение информации не допускается, кроме как в сгенерированном исходном файле, это похоже на квинну с различиями между итерациями.
вс

Ответы:


13

Perl, 933 символа

$m=<<'';$_='         ';
sub h{/^(?:...)*(\d)\1\1/|/^.?.?(\d)..\1..\1/|/(\d)...\1...\1/|/^..(\d).\1.\1/&&$1}
sub r{substr($_,$p-1,1)=pop}sub p{my$w=pop;my@b=(0,h==$w||h&&-1);if(!$b[1]&&/ /){$b[1]=-9;
while(/ /g){local($_,$p)=($_,pos);r$w;$r=-(p($w^1))[1];@b=($p,$r)if$r>$b[1]}}@b}
if(($w=h||!/ /)||!@ARGV){$w--&&print+(nobody,X,O)[$w]," wins\n";s/(...)/$1\n/g;
tr/ 23/.XO/;print}else{$w=3;$w^=1for/\d/g;($p=pop)?r($w^1)&&!h&&(($p)=p$w)&&r$w:s/ /2/;
print"\$m=<<'';\$_='$_';\n$m\n$m"}

sub h{/^(?:...)*(\d)\1\1/|/^.?.?(\d)..\1..\1/|/(\d)...\1...\1/|/^..(\d).\1.\1/&&$1}
sub r{substr($_,$p-1,1)=pop}sub p{my$w=pop;my@b=(0,h==$w||h&&-1);if(!$b[1]&&/ /){$b[1]=-9;
while(/ /g){local($_,$p)=($_,pos);r$w;$r=-(p($w^1))[1];@b=($p,$r)if$r>$b[1]}}@b}
if(($w=h||!/ /)||!@ARGV){$w--&&print+(nobody,X,O)[$w]," wins\n";s/(...)/$1\n/g;
tr/ 23/.XO/;print}else{$w=3;$w^=1for/\d/g;($p=pop)?r($w^1)&&!h&&(($p)=p$w)&&r$w:s/ /2/;
print"\$m=<<'';\$_='$_';\n$m\n$m"}

Обратите внимание, что на самом деле требуется пустая строка в середине скрипта. (Разрывы строк в конце длинных строк не требуются, за исключением разборчивости и не учитываются при подсчете символов.)

Использование: Когда программа запускается без аргументов, она отображает текущее состояние игры. Так как в начале доска пуста, вывод будет:

...
...
...

Запустите программу с аргументом от 1 до 9, чтобы получить этот квадрат в качестве вашего хода. Программа сделает свой собственный ход, а затем выведет сценарий замены с новым состоянием. Так, например:

$ perl ./qttt 5 > ./qttt-2
$ perl ./qttt-2
O..
.X.
...

Только в самый первый ход вы можете 0указать, что компьютер должен сделать первый шаг. Обратите внимание, что первый игрок всегда будет X.

Когда игра закончится, вывод на дисплей будет содержать примечание об этом:

$ perl ./qttt-4 6 > ./qttt-5
$ perl ./qttt-5
O wins
OXX
OOX
X.O

Программа работает, выполняя стандартный минимаксный поиск по дереву игры. (Крестики-нолики - это достаточно маленькая игра, чтобы при каждом запуске можно было создавать полное игровое дерево.) Исключением является случай, когда компьютер двигается первым - в этом случае начальный ход в верхний левый угол затруднен. закодированы.

Обратите внимание, что эта программа работает в стиле правильного quine - ни в коем случае сценарий не обращается к своему исходному файлу для получения выходных данных.


1
Это прекрасно! Я не осознавал, что смотрю на огромный документ вот уже долгое время, потом сделал двойной дубль.
Джесси Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.