-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgamma.h
195 lines (175 loc) · 9.42 KB
/
gamma.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/** @file
* Interfejs klasy przechowującej stan gry gamma
*
* @author Marcin Peczarski <marpe@mimuw.edu.pl>
* @author Szymon Czyżmański 417797
* @copyright Uniwersytet Warszawski
* @date 18.03.2020
*/
#ifndef GAMMA_H
#define GAMMA_H
#include <stdbool.h>
#include <stdint.h>
#include "field.h"
/**
* Struktura przechowująca stan gry.
*/
typedef struct gamma gamma_t;
/** @brief Tworzy strukturę przechowującą stan gry.
* Alokuje pamięć na nową strukturę przechowującą stan gry.
* Inicjuje tę strukturę tak, aby reprezentowała początkowy stan gry.
* @param[in] width – szerokość planszy, liczba dodatnia,
* @param[in] height – wysokość planszy, liczba dodatnia,
* @param[in] players – liczba graczy, liczba dodatnia,
* @param[in] areas – maksymalna liczba obszarów,
* jakie może zająć jeden gracz, liczba dodatnia.
* @return Wskaźnik na utworzoną strukturę lub NULL, gdy nie udało się
* zaalokować pamięci lub któryś z parametrów jest niepoprawny.
*/
gamma_t *gamma_new(uint32_t width, uint32_t height,
uint32_t players, uint32_t areas);
/** @brief Usuwa strukturę przechowującą stan gry.
* Usuwa z pamięci strukturę wskazywaną przez @p g.
* Nic nie robi, jeśli wskaźnik ten ma wartość NULL.
* @param[in] g – wskaźnik na usuwaną strukturę.
*/
void gamma_delete(gamma_t *g);
/** @brief Wykonuje ruch.
* Ustawia pionek gracza @p player na polu (@p x, @p y).
* @param[in,out] g – wskaźnik na strukturę przechowującą stan gry,
* @param[in] player – numer gracza, liczba dodatnia niewiększa od wartości
* @p players z funkcji @ref gamma_new,
* @param[in] x – numer kolumny, liczba nieujemna mniejsza od wartości
* @p width z funkcji @ref gamma_new,
* @param[in] y – numer wiersza, liczba nieujemna mniejsza od wartości
* @p height z funkcji @ref gamma_new.
* @return Wartość @p true, jeśli ruch został wykonany, a @p false,
* gdy ruch jest nielegalny lub któryś z parametrów jest niepoprawny.
*/
bool gamma_move(gamma_t *g, uint32_t player, uint32_t x, uint32_t y);
/** @brief Wykonuje złoty ruch.
* Ustawia pionek gracza @p player na polu (@p x, @p y) zajętym przez innego
* gracza, usuwając pionek innego gracza.
* @param[in,out] g – wskaźnik na strukturę przechowującą stan gry,
* @param[in] player – numer gracza, liczba dodatnia niewiększa od wartości
* @p players z funkcji @ref gamma_new,
* @param[in] x – numer kolumny, liczba nieujemna mniejsza od wartości
* @p width z funkcji @ref gamma_new,
* @param[in] y – numer wiersza, liczba nieujemna mniejsza od wartości
* @p height z funkcji @ref gamma_new.
* @return Wartość @p true, jeśli ruch został wykonany, a @p false,
* gdy gracz wykorzystał już swój złoty ruch, ruch jest nielegalny
* lub któryś z parametrów jest niepoprawny.
*/
bool gamma_golden_move(gamma_t *g, uint32_t player, uint32_t x, uint32_t y);
/** @brief Podaje liczbę pól zajętych przez gracza.
* Podaje liczbę pól zajętych przez gracza @p player.
* @param[in] g – wskaźnik na strukturę przechowującą stan gry,
* @param[in] player – numer gracza, liczba dodatnia niewiększa od wartości
* @p players z funkcji @ref gamma_new.
* @return Liczba pól zajętych przez gracza lub zero,
* jeśli któryś z parametrów jest niepoprawny.
*/
uint64_t gamma_busy_fields(gamma_t *g, uint32_t player);
/** @brief Podaje liczbę pól, jakie jeszcze gracz może zająć.
* Podaje liczbę wolnych pól, na których w danym stanie gry gracz @p player może
* postawić swój pionek w następnym ruchu.
* @param[in] g – wskaźnik na strukturę przechowującą stan gry,
* @param[in] player – numer gracza, liczba dodatnia niewiększa od wartości
* @p players z funkcji @ref gamma_new.
* @return Liczba pól, jakie jeszcze może zająć gracz lub zero,
* jeśli któryś z parametrów jest niepoprawny.
*/
uint64_t gamma_free_fields(gamma_t *g, uint32_t player);
/** @brief Sprawdza, czy gracz może wykonać złoty ruch.
* Sprawdza, czy gracz @p player jeszcze nie wykonał w tej rozgrywce złotego
* ruchu oraz istnieje takie pole zajęte przez przeciwnika, że po zajęciu
* go przez gracza zarówno liczba obszarów zajętych przez gracza, jak
* i liczba obszarów zajętych przez przeciwnika nie przekroczy maksymalnej
* liczby zajętych obszarów.
* @param[in] g – wskaźnik na strukturę przechowującą stan gry,
* @param[in] player – numer gracza, liczba dodatnia niewiększa od wartości
* @p players z funkcji @ref gamma_new.
* @return Wartość @p true, jeśli gracz jeszcze nie wykonał w tej rozgrywce
* złotego ruchu i istnieje takie pole zajęte przez przeciwnika, że po zajęciu
* go przez gracza zarówno liczba obszarów zajętych przez gracza, jak
* i liczba obszarów zajętych przez przeciwnika nie przekroczy maksymalnej
* liczby zajętych obszarów.
*/
bool gamma_golden_possible(gamma_t *g, uint32_t player);
/** @brief Daje napis opisujący stan planszy.
* Alokuje w pamięci bufor, w którym umieszcza napis zawierający tekstowy
* opis aktualnego stanu planszy. Przykład znajduje się w pliku gamma_test.c.
* Funkcja wywołująca musi zwolnić ten bufor.
* @param[in] g – wskaźnik na strukturę przechowującą stan gry.
* @return Wskaźnik na zaalokowany bufor zawierający napis opisujący stan
* planszy lub NULL, jeśli nie udało się zaalokować pamięci.
*/
char *gamma_board(gamma_t *g);
/** @brief Podaje wysokość planszy w jej tekstowym opisie.
* Podaje wysokość planszy w napisie otrzymywanym w wyniku wywołania funkcji
* @ref gamma_board.
* @param[in] g – wskaźnik na strukturę przechowującą stan gry.
* @return Wysokość planszy w napisie otrzymywanym w wyniku wywołania funkcji
* @ref gamma_board lub 0, gdy wskaźnik @p g jest równy NULL.
*/
uint32_t gamma_board_height(gamma_t *g);
/** @brief Podaje szerokość planszy w jej tekstowym opisie.
* Podaje szerokość planszy w napisie otrzymywanym w wyniku wywołania funkcji
* @ref gamma_board.
* @param[in] g – wskaźnik na strukturę przechowującą stan gry.
* @return Szerokość planszy w napisie otrzymywanym w wyniku wywołania funkcji
* @ref gamma_board lub 0, gdy wskaźnik @p g jest równy NULL.
*/
uint64_t gamma_board_width(gamma_t *g);
/** @brief Podaje szerokość pola na planszy w jej tekstowym opisie.
* Podaje szerokość pola na planszy w napisie otrzymywanym w wyniku wywołania
* funkcji @ref gamma_board.
* @param[in] g – wskaźnik na strukturę przechowującą stan gry.
* @return Szerokość pola na planszy w napisie otrzymywanym w wyniku wywołania
* funkcji @ref gamma_board lub 0, gdy wskaźnik @p g jest równy NULL.
*/
unsigned gamma_board_field_width(gamma_t *g);
/** @brief Podaje numer gracza zajmującego pole (@p x, @p y).
* Podaje numer gracza, który ma ustawiony pionek na polu (@p x, @p y) lub zero,
* w przypadku gdy pole jest wolne albo któryś z parametrów jest niepoprawny.
* @param[in,out] g – wskaźnik na strukturę przechowującą stan gry,
* @param[in] x – numer kolumny, liczba nieujemna mniejsza od wartości
* @p width z funkcji @ref gamma_new,
* @param[in] y – numer wiersza, liczba nieujemna mniejsza od wartości
* @p height z funkcji @ref gamma_new.
* @return Numer gracza zajmującego pole (@p x, @p y) lub zero, gdy to pole jest
* wolne albo któryś z parametrów jest niepoprawny.
*/
uint32_t gamma_board_field_owner(gamma_t *g, uint32_t x, uint32_t y);
/** @brief Daje napis reprezentujący pole (@p x, @p y).
* Wpisuje do bufora długości @p FIELD_MAX_WIDTH + 1 wskazywanego przez
* @p repr tekstową reprezentację pola (@p x, @p y).
* Znak null jest dopisywany na końcu wpisanej reprezentacji tego pola.
* Nic nie robi, jeżeli wskaźnik @p g jest równy NULL lub któraś ze współrzędnych
* @p x, @p y jest niepoprawna.
* @param[in] g – wskaźnik na strukturę przechowującą stan gry,
* @param[in] x – numer kolumny, liczba nieujemna mniejsza od wartości
* @p width z funkcji @ref gamma_new,
* @param[in] y – numer wiersza, liczba nieujemna mniejsza od wartości
* @p height z funkcji @ref gamma_new.
* @param[in,out] repr – wskaźnik na bufor długości @p FIELD_MAX_WIDTH + 1,
* do którego ma zostać wpisana tekstowa reprezentacja pola.
*/
void gamma_board_field_repr(gamma_t *g, uint32_t x, uint32_t y,
char repr[FIELD_MAX_WIDTH + 1]);
/** @brief Podaje liczbę graczy.
* Podaje liczbę graczy biorących udział w rozgrywce.
* @param[in] g – wskaźnik na strukturę przechowującą stan gry.
* @return Liczba graczy biorących udział w rozgrywce lub 0,
* gdy wskaźnik @p g jest równy NULL.
*/
uint32_t gamma_players(gamma_t *g);
/** @brief Podaje maksymalną liczbę pól zajętych przez jednego gracza.
* Podaje maksymalną liczbę pól, jaka została zajęta przez jednego gracza.
* @param[in] g – wskaźnik na strukturę przechowującą stan gry.
* @return Maksymalna liczba pól, jaka została zajęta przez jednego gracza
* lub 0, gdy wskaźnik @p g jest równy NULL.
*/
uint64_t gamma_max_busy_fields(gamma_t *g);
#endif // GAMMA_H