Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
sergiy
6 лет назад

15 FreeBASIC - Игра "Быки и коровы"

В одной из книг о настольных играх я увидел игру "Быки и коровы" много я играл в неё с друзьями да одноклассниками, а когда в школе появились компьютеры я решил её запрограммировать. Компьютер загадывал - человек отгадывал. Правила игры: один игрок загадывает четырёхзначное число в котором нет одинаковых цифр, первая цифра может быть ноль. Другой игрок его отгадывает называя свой вариант числа. Первый игрок проанализировав эти числа сообщает о количестве быков и коров. Быком считается если второй игрок угадал цифру и она стоит на своей позиции, например если задуманное число 5290, а второй игрок при попытке отгадать назвал 1234, то ответ будет 1 бык. А если цифра угадана, но она стоит не на своём месте, то это корова. Например второй игрок делает следующий ход и называет 8259 - ответом будет 1бык 2коровы, или сокращенно 1б2к. И так до того момента пока задуманное число не будет отгадано. Само собой число нужно отгадать за минимальное количество попыток. при соревнованиях кто сделал меньше попыток - тот и лучше играет.

В институте мне снова встретилась эта задача, но ещё нужно было решить её и за второго игрока, т.е. в роли отгадывающего выступал компьютер))) ох и поломал голову я над таким решением...

Так как цифр здесь 4 массив можно и не исспользовать, a1,a2,a3,a4 - и будут цифрами задуманного компьютером числа.

На первую цифру у нас никаких ограничений нет - a1- число от 0 до 9
a1=int(rnd()*10)

Вторая цифра не должна быть равна первой
do
a2=int(rnd()*10)
loop while a2=a1

А третья цифра не должна быть равна первой или второй
do
a3=int(rnd()*10)
loop while a3=a1 or a3=a2

И самое большее количество проверок у четвёртой цифры - три проверки
do
a4=int(rnd()*10)
loop while a4=a1 or a4=a2 or a4=a3

можно эти цифры сложитьв переменную z
z=a11000+a2100+a3*10+a4

теперь попросим игрока назвать вариант ответа

input "введите число";o

Его нужно разложить на составляющие-цифры b1,b2,b3,b4 проверить нет ли одинаковых цифр, а перед этим необходимо сделать ещё одну проверку - чтобы число было в диапазоне 123-9876(это минималоное и максимальное число которые подходят под условия задачи)

do
flag=0
input "введите число";o
b1=int(o/1000)
b2=int(o/100) mod 10
b3=int (o/10) mod 10
b4=o mod 10
if b1=b2 or b1=b3 or b1=b4 or b2=b3 or b2=b4 or b3=b4 or o<123 or o>9876 then flag=1:print"повторите ввод"
loop while flag=1
Так как при неверноем вводе числа нужно не только поворить его ввод но и сообщить об этом чтобы не делать проверку дважды здесь использовали переменную flag

Теперь число прошло проверку, введено корректно - можно подсчитать быков ...
bk=0:cow=0
if a1=b1 then bk=bk+1
if a2=b2 then bk=bk+1
if a3=b3 then bk=bk+1
if a4=b4 then bk=bk+1

... и коров

if a1=b2 or a1=b3 or a1=b4 then cow=cow+1
if a2=b1 or a2=b3 or a2=b4 then cow=cow+1
if a3=b1 or a3=b2 or a3=b4 then cow=cow+1
if a4=b1 or a4=b2 or a4=b3 then cow=cow+1

Не потеряем ли мы коров при подсчёте? нет, ведь если например a1=b2, то a1=b3 и/или a1=b4 уже не будет никогда.

print ;o;" - ";bk;"б";cow;"к"

и закрываем цикл,

loop while bk<4

а мы ведь его и не открыли))) - впереди do цикла ввода ответа откроем ещё цикл следующего хода второго игрока

Текст программы получился большим, пришлось его немного укоротить, чтоб поместился в экран. Я убрал перед 2,3,6,9,12,13,24,25,29,33,34 пустые строки, которые были установлены для более удобного восприятия программы, опять же повторюсь - это дело вкуса и своего стиля)))

Ещё в 12 строке я добавил вывод задуманного компьютером числа, чтобы проверить верно ли программа подсчитывает быков и коров

В программу можно добавить учёт и вывод ходов за которые игрок угадает число.

Есть ли минимальное количество ходов за которое гарантирвоанно можно угадать число?

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

14 FreeBASIC - тасуем карты (массивы-задачи ч2)
13 FreeBASIC - массивы(задачи)
12 FreeBASIC - массивы
11 FreeBASIC - задачки
10 FreeBASIC - Игра угадай число
09 FreeBASIC - случайные числа, RND
08 FreeBASIC - случайные числа, RND
07 FreeBASIC - циклы
06 FreeBASIC - условный оператор
05 FreeBASIC - первые простые задачки
04 FreeBasic - графика
03 FreeBASIC. Текстовые переменные и операции с ними
02 FreeBASIC Переменные в Бейсике
01 Начинаем изучать FreeBasic
00 FreeBASIC лучший из диалектов бейсика

@sergiy

4
536.457 GOLOS
На Golos с October 2016
Комментарии (8)
Сортировать по:
Сначала старые