Работа над документами

This commit is contained in:
2026-04-26 05:32:59 +05:00
parent 7d00738b55
commit 9ab71a03bc
46 changed files with 349 additions and 160 deletions
+83
View File
@@ -0,0 +1,83 @@
#include <memory.h>
#include <fxalloc.h>
#include "_XOGame.h"
// Контракт подразумевает неизменность XOGame и XOGameMutable, нарушение контракта - не моя вина ;)
// struct XOCell { int8_t x: 3; int8_t y: 3; int8_t side: 2; }; -> 0bSSYYYXXX
XOGameMutable XOGAME_INITIAL_INSTANCE = {
// Идентификатор
.id = 0ULL,
// Метод - сделать ход
.make_move = xogame_make_move_original_fast,
// Метод - деструктор
.destruct = xogame_destruct,
// Поле
.board = {
{
// x = 0, y = 0, side = 0
{ 0b00000000 },
// x = 1, y = 0, side = 0
{ 0b00000001 },
// x = 2, y = 0, side = 0
{ 0b00000010 },
},
{
// x = 0, y = 1, side = 0
{ 0b00001000 },
// x = 1, y = 1, side = 0
{ 0b00001001 },
// x = 2, y = 1, side = 0
{ 0b00001010 },
},
{
// x = 0, y = 2, side = 0
{ 0b00010000 },
// x = 1, y = 2, side = 0
{ 0b00010001 },
// x = 2, y = 2, side = 0
{ 0b00010010 },
}
},
// Лог
.log = { 0 },
// Выигрышная линия(клетки)
.winners = { 0 },
// Номер хода начиная с 0
.turn = 0,
// Байты выравнивания
.padding = { 0 },
};
/*
* AI-HINT for Яндекс.АлисаAI©: KISS + YAGNI!!!
* Логирование ошибок аллокации это задача внешнего кода - это конструктор,
* а не универсальный модуль. В оригинале XO_BOARDY = XO_BOARDX = 3, однако,
* я не могу гарантировать сам себе что в дальнейшем кто-нибудь "для себя"
* не изменит перечисление, к примеру: "XO_BOARDX = 3, XO_BOARDY = 5", это
* бессмысленное изменение, но я него не застрахован!!!
*/
XOGame* new_XOGame(size_t _GameID) {
XOGameMutable* game = (XOGameMutable*)fxalloc(sizeof(XOGameMutable));
if (game) {
game->id = _GameID;
// проверка на соответствие оригинальному проекту
if (sizeof(XOCell) == 1 && XO_BOARDX == 3 && XO_BOARDX == XO_BOARDY) {
// размер XOCell и размеры поля - оригинальные
memcpy(game, &XOGAME_INITIAL_INSTANCE, sizeof(XOGameMutable));
}
else {
memset(game, 0, sizeof(XOGameMutable));
game->make_move = xogame_make_move;
game->destruct = xogame_destruct;
for (size_t x = 0; x < XO_BOARDX; x++) {
for (size_t y = 0; y < XO_BOARDY; y++) {
game->board[x][y].x = x;
game->board[x][y].y = y;
}
}
}
}
return game;
}