Практика программирования (Бейсик, Си, Паскаль)


Задачи,советы и ответы - часть 49


end.

Задание 2.28. Игра на вычитание

И фа заключается в последовательном вычитании партнерами из числа, находящегося на кону. Программа генерирует случайное число от 50 до 100 и передает ход человеку. Ходят по очереди. За один ход можно вычесть из оставшегося числа от 1 до 9 (в общем случае от 1 до м). Побеждает тот, кто сумеет оставить на кону нулевое число.

Совет 1 (общий)

Если на кону находится число N+1, то любой ход приводит к выигрышу партнера. Поэтому выигрышная стратегия программы довольно проста. Если на кону находится число м > N+1, то своим ходом программа должна оставить на кону Ml = k* (N+1), т. е. вычесть из м остаток от деления м на N+I. Это не всегда удается, т. к. остаток может оказаться равным 0. Но если это удалось, то последующие ходы делаются по стандартной схеме: если противник вычитает q, то программа должна вычесть N+1-q. В итоге на кону останется N+1 и любой ход человека приведет к его поражению. В том случае, когда программа не может сделать выигрышный ход, надо вычесть 1 в надежде, что противник ошибется, и тогда можно будет перехватить инициативу.

Программа 2_28.bas

RЕМ Программа игры на вычитание до нуля

DEFINT A-Z

ml:

CLS

RANDOMIZE 32767

N = INT(RND * 25) + 26

PRINT "На кону - "; N; " Брать можно от 1 до 5"

m2:

PRINT "Ваш ход. Сколько берем? - "

m4:

a$ = INKEY$: IF a$ = "" THEN GOTO m4

k = ASC(a$) - 48

IF 1 > k OR k > 5 THEN PRINT "Так ходить нельзя!": GOTO m2

N = N - k

PRINT "После Вашего хода осталось "; N

IF N = О THEN PRINT "Поздравляю! Вы выиграли!": GOTO ex

IF (N MOD 6) = 0 THEN k = 1 ELSE k = N MOD 6

N = N - k

PRINT "Я беру "; k; " остается "; N

IF N = 0 THEN

PRINT "К сожалению, Вы проиграли!": GOTO ex

ELSE

GOTO m2

END IF ex: .,

PRINT "Хотите еще? - (y/n) : "

m3:

a$ = INKEY$: IF a$ = "" THEN GOTO m3

IF a$ = "y" THEN GOTO ml

END

Программа 2_28.с




- Начало -  - Назад -  - Вперед -