Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2015, 16:55   #1
lolman1
Новичок
Джуниор
 
Регистрация: 07.05.2015
Сообщений: 1
По умолчанию Прокомментировать код игры "Крестики-нолики"

Помогите пожалуйста Прокомментировать код игры "Крестики-нолики"
Код:
  
#include <vcl.h>
#pragma hdrstop

#include "untMain.h"
#include "untAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
const int Xdims [4] = { 0, 1, 1, 1};
const int Ydims [4] = { 1, 1, 0, -1};

int Field [27][27];
int Skill = 128;
int Turn;
int CurrFigure;
bool AIgame, HumanGame;

long Check (int x, int y)
{
if (Field [x][y] != 0) return 0;

int i, k, p, n, l, m, xx, yy;
int Fr, En;
long zu;
Fr = CurrFigure;
En = !CurrFigure;
if (x == 13 && y == 13) zu = 2;
else zu = 1;
for (i = 0; i < 4; i++)
{
xx = Xdims; yy = Ydims;

// Part 1
k = 1; p = 1; n = 1; l = 0; m = 0;
while (Field [x-p*xx][y-p*yy] == Fr+1 && x-p*xx > 0 && y-p*yy > 0 && x-p*xx < 26 && y-p*yy <26) p++;
n += (p-1); while ((Field [x-p*xx][y-p*yy] == 0 || Field [x-p*xx][y-p*yy] == Fr+1) && x-p*xx > 0 && y-p*yy > 0 && x-p*xx < 26 && y-p*yy <26) {p++; l = 1; }
k += (p-1); p = 1;
while (Field [x+p*xx][y+p*yy] == Fr+1 && x+p*xx > 0 && y+p*yy > 0 && x+p*xx < 26 && y+p*yy <26) p++;
n += (p-1); while ((Field [x+p*xx][y+p*yy] == 0 || Field [x+p*xx][y+p*yy] == Fr+1) && x+p*xx > 0 && y+p*yy > 0 && x+p*xx < 26 && y+p*yy <26) {p++; m = 1; }
k += (p-1); if (m) l++;
if (k >= 5)
{
if (n >= 5) zu += 1073741824;
else if (n >= 4) zu += 8192*l;
else if (n >= 3) zu += Skill*l; 
else if (n >= 2) zu += 32*l;
else if (n >= 1) zu += 4*l;
}

// Part 2
k = 1; p = 1; n = 1; l = 0; m = 0;
while (Field [x-p*xx][y-p*yy] == En+1 && x-p*xx > 0 && y-p*yy > 0 && x-p*xx < 26 && y-p*yy <26) p++;
n += (p-1); while ((Field [x-p*xx][y-p*yy] == 0 || Field [x-p*xx][y-p*yy] == En+1) && x-p*xx > 0 && y-p*yy > 0 && x-p*xx < 26 && y-p*yy <26) {p++; l = 1; }
k += (p-1); p = 1;
while (Field [x+p*xx][y+p*yy] == En+1 && x+p*xx > 0 && y+p*yy > 0 && x+p*xx < 26 && y+p*yy <26) p++;
n += (p-1); while ((Field [x+p*xx][y+p*yy] == 0 || Field [x+p*xx][y+p*yy] == En+1) && x+p*xx > 0 && y+p*yy > 0 && x+p*xx < 26 && y+p*yy <26) {p++; m = 1; }
k += (p-1); if (m) l++;
if (k >= 5)
{
if (n >= 5) zu += 65536*8;
else if (n >= 4) zu += 1024*l;
else if (n >= 3) zu += 256*l;
else if (n >= 2) zu += 4*l;
else if (n >= 1) zu += 1*l;
}
}

return zu;
}


bool IsFinal ()
{
int p, xx, yy, l=0;

Turn += CurrFigure;
CurrFigure = !CurrFigure;

for (int k = 0; k < 4; k++)
{
xx = Xdims [k]; yy = Ydims [k];
for (int x = 1; x <= 25; x++)
for (int y = 1; y <= 25; y++)
{
if (Field [x][y] && !k) l++;
if (Field [x][y] == 1)
{
p = 0;
while (Field [x-p*xx][y-p*yy] == 1 && x-p*xx > 0 && y-p*yy > 0 && x-p*xx < 26 && y-p*yy < 26) p++;
if (p >= 5)
{
p = 0;
while (Field [x-p*xx][y-p*yy] == 1 && x-p*xx > 0 && y-p*yy > 0 && x-p*xx < 26 && y-p*yy < 26) {Field [x-p*xx][y-p*yy] = 3; p++; }
frmMain->ReDraw ();
MessageBox (frmMain->Handle, ("X-player wins the game on " + IntToStr (Turn+1) + " turn!").c_str(), "Game over", MB_OK);
frmMain->NewGame ();
return true;
}
}
if (Field [x][y] == 2)
{
p = 0;
while (Field [x-p*xx][y-p*yy] == 2 && x-p*xx > 0 && y-p*yy > 0 && x-p*xx < 26 && y-p*yy < 26) p++;
if (p >= 5)
{
p = 0;
while (Field [x-p*xx][y-p*yy] == 2 && x-p*xx > 0 && y-p*yy > 0 && x-p*xx < 26 && y-p*yy < 26) {Field [x-p*xx][y-p*yy] = 4; p++; }
frmMain->ReDraw ();
MessageBox (frmMain->Handle, ("O-player wins the game on " + IntToStr (Turn+1) + " turn!").c_str(), "Game over", MB_OK);
frmMain->NewGame ();
return true;
}
}
}

}

if (l >= 625)
{
frmMain->ReDraw ();
MessageBox (frmMain->Handle, "Draw", "Game over", MB_OK);
frmMain->NewGame ();
return true;
}


return false;
}

void NewTurn ()
{
long x, y, i, j, k, m = 0;
for (i = 1; i <= 25; i++)
for (j = 1; j <= 25; j++)
{
k = Check (i, j);
if (k > m || (k == m && random(2))) { m = k; x = i; y = j; }
}
Field [x][y] = CurrFigure+1;
IsFinal ();
}


void __fastcall TfrmMain::NewGame ()
{
AIgame = false;
HumanGame = false;
for (int i = 1; i <= 25; i++)
for (int j = 1; j <= 25; j++)
Field[j] = 0;
Turn = 0; CurrFigure = 0;
}

Последний раз редактировалось Serge_Bliznykov; 07.05.2015 в 16:58.
lolman1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Логика игры "Крестики нолики" написанная на Delphi Andre Помощь студентам 0 08.02.2014 17:13
Переделать сетевую часть игры "Крестики-нолики" - Delphi k3rn3l Фриланс 13 15.12.2013 12:49
Создание игры "Крестики нолики" на php Loki1993 PHP 4 20.09.2012 20:33