Игра "Быки-коровы” заключается в том,что первым игроком задумывается четырёхзначное число все цифры которого разные. Второй игрок пытается угадать задуманное число,предлагая свои варианты.Если в предложенном и задуманном числах какая-либо цифра совпадает по значению и месту расположения, то первый игрок говорит, что есть бык, а если совпадает только значение – корова.Если на 1-е место не ставить 0, то число возможных вариантов 9*9*8*7=4536.Иногда допускается 0 на первом месте, тогда вариантов 5040. Здесь предлагается программа, когда компьютер отгадывает число в роли второго игрока. Алгоритм заключается в том, что число генерируется случайным образом, но сверяется с прежними ответами.Программа предлагает вариант, который даёт с прежними ответами столько же быков и коров, как и задуманное число.За несколько сотен игр ни разу программа не затратила больше 7-и ходов на угадывание.(Здесь 0 на 1-е место не ставим, если надо ставить стираем указанную строку). Кстати, доказано, что не существует алгоритма, который гарантированно всегда угадывает быстрее чем за семь ходов (хотя случайно можно угадать и за один ход). Данная программа тратит, как правило, на угадывание 5 или 6 ходов, реже 7 и 4. Когда в он-лайн играх всегда угадывают за 4 хода после того, как вы ввели в специальном окошке своё задуманное число- это по-моему обман. Также приведена программа , которая выдаёт следующий ход, проанализировав уже сделанные. ПРОГРАММА ИГРА CLS PRINT " Задумайте число и нажмите любую клавишу” 0 IF INKEY$ = "” THEN 0 5 RANDOMIZE TIMER 1 a = RND(1) * 10 a = INT(a) IF a = 0 THEN 1 ‘ если нужен 0 на 1-м месте эта строчка стирается 2 b = RND(1) * 10 b = INT(b) IF b = a THEN 2 3 c = RND(1) * 10 c = INT(c) IF c = a THEN 3 IF c = b THEN 3 4 d = RND(1) * 10 d = INT(d) IF d = a THEN 4 IF d = b THEN 4 IF d = c THEN 4 i = 0 7 i = i + 1: IF i > m THEN 8 BK = 0: k = 0 IF x(i) = a THEN BK = BK + 1 IF x(i) = b THEN k = k + 1 IF x(i) = c THEN k = k + 1 IF x(i) = d THEN k = k + 1 IF y(i) = a THEN k = k + 1 IF y(i) = b THEN BK = BK + 1 IF y(i) = c THEN k = k + 1 IF y(i) = d THEN k = k + 1 IF z(i) = a THEN k = k + 1 IF z(i) = b THEN k = k + 1 IF z(i) = c THEN BK = BK + 1 IF z(i) = d THEN k = k + 1 IF u(i) = a THEN k = k + 1 IF u(i) = b THEN k = k + 1 IF u(i) = c THEN k = k + 1 IF u(i) = d THEN BK = BK + 1 IF BK <> BK(i) OR k <> k(i) THEN 5 IF BK = BK(i) AND k = k(i) THEN 7 8 PRINT " "; a, b, c, d; " n="; m + 1 x(m + 1) = a: y(m + 1) = b: z(m + 1) = c: u(m + 1) = d m = m + 1 INPUT " B="; BK(i) IF BK(i) = 4 THEN 6 INPUT " k="; k(i) GOTO 5 6 PRINT " Я ВЫИГРАЛ!": END
Важно не ошибаться при определении числа быков и коров т.к. ошибка приведёт к зацикливанию. Если на 7-м ходу(или даже раньше) программа "думает” больше 3-х минут, проверьте свои ответы. Пример игры: Задумано число 2013
Ходы программы: 1: 5310 Б-1 К-2
2:5143 Б-1 К-1
3:5071 Б-1 К-1
4:8013 Б-3 К-0
5:2013 Б-4
Можно переделать программу так, чтобы она находила следующий ход, анализируя уже сделанные ходы. Например сделаны ходы:
1)3067 Быки-0 Коровы-1
2)9583 Быки-1 Коровы-0
3)2140 Быки-1 Коровы-1
4)2396 Быки-0 Коровы-2
5)5086 Быки-0 Коровы-1
Программа находит ход 9641. Если он будет повторятся при повторных запусках программы – это окончательное решение. ПРОГРАММА АНАЛИЗ ХОДОВ CLS INPUT "число сделанных ходов"; m FOR i = 1 TO m PRINT "ход"; i INPUT " x(i)="; x(i) INPUT " y(i)="; y(i) INPUT " z(i)="; z(i) INPUT " u(i)="; u(i) INPUT "число быков"; bk(i) INPUT "число коров"; k(i) NEXT 5 RANDOMIZE TIMER 1 a = RND(1) * 10 a = INT(a) 2 b = RND(1) * 10 b = INT(b) IF b = a THEN 2 3 c = RND(1) * 10 c = INT(c) IF c = a THEN 3 IF c = b THEN 3 4 d = RND(1) * 10 d = INT(d) IF d = a THEN 4 IF d = b THEN 4 IF d = c THEN 4 i = 0 7 i = i + 1: IF i > m THEN 8 bk = 0: k = 0 IF x(i) = a THEN bk = bk + 1 IF x(i) = b THEN k = k + 1 IF x(i) = c THEN k = k + 1 IF x(i) = d THEN k = k + 1 IF y(i) = a THEN k = k + 1 IF y(i) = b THEN bk = bk + 1 IF y(i) = c THEN k = k + 1 IF y(i) = d THEN k = k + 1 IF z(i) = a THEN k = k + 1 IF z(i) = b THEN k = k + 1 IF z(i) = c THEN bk = bk + 1 IF z(i) = d THEN k = k + 1 IF u(i) = a THEN k = k + 1 IF u(i) = b THEN k = k + 1 IF u(i) = c THEN k = k + 1 IF u(i) = d THEN bk = bk + 1 IF bk <> bk(i) OR k <> k(i) THEN 5 IF bk = bk(i) AND k = k(i) THEN 7 8 PRINT " "; a, b, c, d END
Конечно, можно генерировать ходы программы путём перебора размещений,(без использования генератора случайных чисел)но такая игра будет менее интересной.Первый ход всегда будет 1023(0123,если можно 0 на 1-м месте),а каждое конкретное задуманное число будет угадываться одной и той-же последовательностью ходов. Тут можно сразу предсказать,что число 1289 будет угадано быстрее,чем 1982 и тем более 9281(4,6 и 7 ходов соответственно), в связи с последовательностью генерации соответствующих размещений.Для полноты раскрытия темы публикуем и эту программу. CLS PRINT "Задумайте число и нажмите любую клавишу." 0 IF INKEY$ = "" THEN 0 DIM BK(20), k(20) FOR a = 1 TO 9 ' или FOR 0 TO 9,если 0 ставим на 1-м месте FOR b = 0 TO 9 IF b = a THEN 2 FOR c = 0 TO 9 IF c = a THEN 3 IF c = b THEN 3 FOR d = 0 TO 9 IF d = a THEN 4 IF d = b THEN 4 IF d = c THEN 4 i = 0 GOTO 5 4 NEXT d 3 NEXT c 2 NEXT b 1 NEXT a 5 i = i + 1: IF i > m THEN 8 BK = 0: k = 0 IF x(i) = a THEN BK = BK + 1 IF x(i) = b THEN k = k + 1 IF x(i) = c THEN k = k + 1 IF x(i) = d THEN k = k + 1 IF y(i) = a THEN k = k + 1 IF y(i) = b THEN BK = BK + 1 IF y(i) = c THEN k = k + 1 IF y(i) = d THEN k = k + 1 IF z(i) = a THEN k = k + 1 IF z(i) = b THEN k = k + 1 IF z(i) = c THEN BK = BK + 1 IF z(i) = d THEN k = k + 1 IF u(i) = a THEN k = k + 1 IF u(i) = b THEN k = k + 1 IF u(i) = c THEN k = k + 1 IF u(i) = d THEN BK = BK + 1 IF BK <> BK(i) OR k <> k(i) THEN 4 IF BK = BK(i) AND k = k(i) THEN 5 8 PRINT " "; a, b, c, d; " n="; m + 1 x(m + 1) = a: y(m + 1) = b: z(m + 1) = c: u(m + 1) = d m = m + 1 INPUT " B="; BK(i) IF BK(i) = 4 THEN 6 INPUT " k="; k(i) GOTO 4 6 PRINT " Я ВЫИГРАЛ!": END
|