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

 

 

 

 

 

 

 

 

 

 



 
Конструктор сайтов - uCoz