Игра "Быки-коровы” заключается в том,что первым игроком задумывается четырёхзначное число все цифры которого разные. Второй игрок пытается угадать задуманное число,предлагая свои варианты.Если в предложенном и задуманном числах какая-либо цифра совпадает по значению и месту расположения, то первый игрок говорит, что есть бык, а если совпадает только значение – корова.Если на 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