"Игра Баше"
Когда очень скучно на уроке и спичек нет, то часто рисуют на парте палочки и играют с соседом в эту игру. Но лучше написать программу и играть с ней, сохраняя школьное имущество. На столе лежит N спичек. Два игрока по очереди забирают со стола несколько спичек (от 1 до M). Выигрывает тот, кто берет последнюю спичку. Напишите программу, которая играет в эту игру. Вы должны использовать дополнительные функции для получения хода соперника. Описание и примеры этих функций находятся в файлах PLAY1D.PAS (для языка Pascal) и PLAY1D.H, PLAY1D.C, PLAY1D.CPP (для языков C/C++). Данные функции строго проверяют выполнение правил игры, но играют за соперника не лучшим образом. Ваша программа должна считать исходные данные из файла TASK1D.DAT. В первой строке этого файла находится число P -номер игрока, за которого играет ваша программа. Во второйстроке файла находится число N - количество спичек на столе (2<=N<=10000). В третьей строке находится число M -максимальное число спичек, которое можно взять за раз (1<M<100).Для начала игры Ваша программа должна вызвать функцию BeginGame. Для того, чтобы сделать свой ход, вызовите функцию TakeMatch, передав ей количество спичек, взятых со стола. Для того, чтобы соперник сделал ход, Ваша программа должна вызвать функцию OppTakeMatch. Она возвратит количество спичек, взятых соперником. По окончании игры вызовите функцию EndGame. Запишите в файл TASK1D.SOL количество спичек, взятых Вашей программой в течение игры.
Пример игры:
TASK1D.DAT:
1
10
3
Ход игры:
Начало игры.
1-й игрок взял 2 спички.
2-й игрок взял 2 спички.
1-й игрок взял 2 спички.
2-й игрок взял 3 спички.
1-й игрок взял 1 спичку.
Конец игры.
TASK1D.SOL:
5
Дополнительные файлы к условию задачи:
PLAY1D.PAS
PLAY1D.H
PLAY1D.C
PLAY1D.CPP
Максимальное количество баллов: 20
Unit Play1D;
Interface
Procedure BeginGame;
Procedure EndGame;
Procedure TakeMatch (J : Integer);
Function OppTakeMatch : Integer;
Implementation
Const
S : Integer = 0;
Var
P, N, M : Integer;
J, K : Integer;
Procedure Error;
Begin
WriteLn ('Нарушены правила игры!');
Halt (1);
End;
Procedure BeginGame;
Var
F : Text;
Begin
If S <> 0 Then Error;
Assign (F, 'TASK1D.DAT'); ReSet (F);
Read (F, P); S := P;
Read (F, N); K := N;
Read (F, M); J := 1;
Close (F);
WriteLn ('Начало игры.');
End;
Procedure TakeMatch (J : Integer);
Begin
If S <& gt; 1 Then Error;
If (J <= 0) Or (J > K) Or (J > M) Then Error;
K := K - J;
If K > 0 Then S := 2 Else S := 3;
WriteLn (P, '-й игрок взял ', J, ' спич(ку,ки,ек).');
End;
Function OppTakeMatch : Integer;
Begin
If S <> 2 Then Error;
J := J + 1;
If (J > K) Then J := K;
If (J > M) Then J := 1;
OppTakeMatch := J;
K := K - J;
If K > 0 Then S := 1 Else S := 3;
WriteLn (3-P, '-й игрок взял ', J, ' спич(ку,ки,ек).');
End;
Procedure EndGame;
Begin
If S <> 3 Then Error;
S := 4;
WriteLn ('Конец игры.');
End;
End.
Задача 1D: PLAY1D.H
void BeginGame (void);
void EndGame (void);
void TakeMatch (int j);
int OppTakeMatch (void);
<
Задача 1D: PLAY1D.C/PLAY1D.CPP
#include <stdlib.h>
#include <stdio.h>
#include "play1d.h"
static int s = 0;
static int p, n, m;
static int j, k;
static void Error (void)
{
printf ("Нарушены правила игры! ");
exit (EXIT_FAILURE);
}
void BeginGame (void)
{
FILE * f;
if (s != 0) Error ();
f = fopen ("task1d.dat", "r");
fscanf (f, "%d%d%d", & p, & n, & m);
s = p; k = n; j = 1;
fclose (f);
printf ("Начало игры. ");
}
void TakeMatch (int j)
{
if (s != 1) Error ();
if (j <= 0 || j > k || j > m) Error ();
k -= j;
s = k > 0 ? 2 : 3;
printf ("%d-й игрок взял %d спич(ку,ки,ек). ", p, j);
}
int OppTakeMatch (void)
{
if (s != 2) Error ();
j ++;
if (j > k) j = k;
if (j > m) j = 1;
k -= j;
s = k > 0 ? 1 : 3;
printf ("%d-й игрок взял %d спич(ку,ки,ек). ", 3-p, j);
return j;
}
void EndGame (void)
{
if (s != 3) Error ();
s = 4;
printf ("Конец игры. ");
}
|