Unit Play2E;
Interface < br>
Procedure BeginGame (P : Integer);
Procedure EndGame;
Procedure Move (J, C : Integer);
Procedure OppMove (Var J, C : Integer);
Implementation
Const
MaxN = 100;
S : Integer = 0;
Var
P, N, K : Integer;
A : Array [1..MaxN] Of Boolean;
Procedure Error;
Begin
WriteLn ('Нарушены правила игры!');
Halt (1);
End;
Procedure BeginGame (P : Integer);
Var
F : Text;
J : Integer;
Begin
If S <> 0 Then Error;
If (P <> 1) And (P <> 2) Then Error;
Play2E.P := P; S := P;
Assign (F, 'TASK2E.DAT'); ReSet (F);
Read (F, N); K := N;
Close (F);
For J := 1 To N Do A[J] := False;
WriteLn ('Начало игры.');
End;
Procedure Move (J, C : Integer);
Begin
If S <> 1 Tn Error;
If (J < 1) Or ((J+C-1) > N) Or (C < 1) Or (C > 2) Then Error;
If A[J] Or A[J+C-1] Then Error;
A[J] := True; A[J+C-1] := True; K := K-C;
If K > 0 Then S := 2 Else S := 3;
WriteLn (P, '-й игрок исправил ', J, '-й минус на плюс.');
If C = 2 Then
WriteLn (P, '-й игрок исправил ', J+1, '-й минус на плюс.');
End;
Procedure OppMove (Var J, C : Integer);
Begin
If S <> 2 Then Error;
J := 1; While A[J] Do J := J+1;
If (J < N) And Not A[J+1]
Then C := 2
Else C := 1;
A[J] := True; A[J+C-1] := True; K := K-C;
If K > 0 Then S := 1 Else S := 3;
WriteLn (3-P, '-й игрок исправил ', J, '-й минус на плюс.');
If C = 2 Then
WriteLn (3-P, '-й игрок исправил ', J+1, '-й минус на плюс.');
End;
Procedure EndGame;
Begin
If S <> 3 Then Error;
S := 4;
WriteLn ('Конец игры.');
End;
End.
void BeginGame (int p);
void EndGame (void);
void Move (int j, int c);
void OppMove (int * j, int * c);
Задача 2E: PLAY2E.C/PLAY2E.CPP
#include <stdlib.h>
#include <stdio.h>
#include "play2e.h"
static int s = 0;
static int p, n, k;
static int * a;
static void Error (void)
{
printf ("Нарушены правила игры! ");
exit (EXIT_FAILURE);
}
void BeginGame (int r)
{
FILE * f;
int j;
if (s != 0) Error ();
if (r != 1 && r != 2) Error ();
p = r; s = r;
f = fopen ("task2e.dat", "r");
fscanf (f, "%d", & n); k = n;
fclose(f);
a = (int *) malloc (n * sizeof (int));
for(j = 0; j < n; j ++) a[j] = 0;
printf ("Начало игры. ");
}
void Move (int j, int c)
{
if (s != 1) Error ();
if (j < 1 || j+c-1 > n || c < 1 || c > 2) Error ();
j --;
if (a[j] || a[j+c-1]) Error ();
a[j] = 1; a[j+c-1] = 1; k -= c;
s = k > 0 ? 2 : 3;
j ++;
printf ("%d-й игрок исправил %d-й минус на плюс. ", p, j);
if (c == 2)
printf ("%d-й игрок исправил %d-й минус на плюс. ", p, j+1);
}
void OppMove (int * j, int * c)
{
int i;
int d;
if (s != 2) Error ();
for (i = 0; a[i]; i ++);
if (i < n-1 && ! a[i+1]) d = 2;
else d = 1;
a[i] = 1; a[i+d-1] = 1; k -= d;
i ++;
s = k > 0 ? 1 : 3;
printf ("%d-й игрок исправил %d-й минус на плюс. ", 3-p, i);
if (d == 2)
printf ("%d-й игрок исправил %d-й минус на плюс. ", 3-p, i+1);
* j = i;
* c = d;
}
void EndGame (void)
{
if (s != 3) Error ();
s = 4;
free (a);
printf ("Конец игры. ");
}
|