#Denwer
Специалист
Доброго времени суток.
Сегодня закончился отборный этап на конкурс 'Лучший скриптер 2015-2016', и я бы хотел поделиться своей работой, а именно практической частью.
Задание было такое: написать игру Крестики - Нолики на TextDraw с полем 9x9 (81 квадрат).
Вот так я справился с заданием:
А теперь перейдем к самом вносе системы в мод:
Ко всем new:
В самый конец мода:
В OnPlayerConnect:
В OnPlayerDisconnect:
В OnPlayerClickPlayerTextDraw
Также, добавим команду для начала игры с игроком:
Командный процессор: DC_CMD.
Алгоритм подбора выигрышных чисел был взять примером у GAMES.
Первый алгоритм был составлен с помощью DeadLine (AngeL) в плане математики. (после сдачи второго алгоритма).
Автор: #Denwer (Archibalt).
Сегодня закончился отборный этап на конкурс 'Лучший скриптер 2015-2016', и я бы хотел поделиться своей работой, а именно практической частью.
Задание было такое: написать игру Крестики - Нолики на TextDraw с полем 9x9 (81 квадрат).
Вот так я справился с заданием:
А теперь перейдем к самом вносе системы в мод:
Ко всем new:
PHP:
new PlayerText:BoxGame[MAX_PLAYERS][84];
new bool:BoxUnity[MAX_PLAYERS][84];
// Вариант номер 1 - работоспособность по всем числам таблицы.
new WinCheck[82][3] =
{
{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},{28,37,46},{29,38,47},{30,39,48},
{46,38,30},{48,38,28},{31,40,49},{32,41,50},{33,42,51},{51,41,31},{49,41,33},{34,43,52},{35,44,53},{36,45,54},{34,44,54},{52,44,36},{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},{1,10,19},{20,11,2},{3,12,21},{19,11,3},{1,11,21},{4,13,22},{5,14,23},{6,15,24},{24,14,4},{22,14,6},{7,16,25},{8,17,26},
{9,18,27},{25,17,9},{7,17,27},{55,64,73},{56,65,74},{57,66,75},{75,65,55},{73,65,57},{58,67,76},{59,68,77},{60,69,78},{78,68,58},{76,68,60},{61,70,79},{62,71,80},{63,72,81},{81,71,61},{79,71,63},{2,11,20}
};
//Вариант номер 2 - работоспособность только на один квадрат из 9ти. (на который нажал).
new WinCheck[8][3] =
{
{0,1,2}, {9,10,11}, {18,19,20}, {0,9,18}, {1,10,19}, {2,11,20}, {0,10,20}, {2,10,18},
{3,4,5}, {12,13,14}, {21,22,23}, {3,12,21}, {4,13,22}, {5,14,23}, {3,13,23}, {5,13,21},
{6,7,8}, {15,16,17}, {24,25,26}, {6,15,24}, {7,16,25}, {8,17,26}, {6,16,26}, {8,16,24},
{27,28,29}, {36,37,38}, {45,46,47}, {27,36,45}, {28,37,46}, {29,38,47}, {27,37,47}, {29,37,45},
{30,31,32}, {39,40,41}, {48,49,50}, {30,39,48}, {31,40,49}, {32,41,50}, {30,40,50}, {32,40,48},
{33,34,35}, {42,43,44}, {51,52,53}, {33,42,51}, {34,43,52}, {35,44,53}, {33,43,53}, {35,43,51},
{54,55,56}, {63,64,65}, {72,73,74}, {54,63,72}, {55,64,73}, {56,65,74}, {54,64,74}, {56,64,72},
{57,58,59}, {66,67,68}, {75,76,77}, {57,66,75}, {58,67,76}, {59,68,77}, {57,67,77}, {59,67,75},
{60,61,62}, {69,70,71}, {78,79,80}, {60,69,78}, {61,70,79}, {62,71,80}, {60,70,80}, {62,70,78}
};
PHP:
stock CheckWin(playerid, bool:number)
{
for(new f = 0; f < (sizeof(WinCheck) == 82 ? (82) : (8)); f ++)
{
new count = 0;
for(new j = 0; j < 3; j ++) if(BoxUnity[playerid][WinCheck[f][j]] == number) count++;
if(count >= 3) return 1;
}
return 0;
}
PHP:
new count = 0x0, Color;
for(new r = 1; r < 10; r++)
{
for(new f = 1; f < 10; f++)
{
BoxGame[playerid][count] = CreatePlayerTextDraw(playerid, 173.3 + f * 34.3, 64.0 + r * 27.3, "_");
PlayerTextDrawLetterSize(playerid,BoxGame[playerid][count], 0.5, 2.5);
PlayerTextDrawTextSize(playerid,BoxGame[playerid][count], 15.0, 30.0);
PlayerTextDrawAlignment(playerid,BoxGame[playerid][count], 2);
PlayerTextDrawColor(playerid,BoxGame[playerid][count], -1);
PlayerTextDrawUseBox(playerid,BoxGame[playerid][count], true);
switch(count)
{
case 0..2,9..11,18..20: Color = 0xFF0000FF;
case 3..5,12..14,21..23: Color = 0xFF2C00FF;
case 6..8,15..17,24..26: Color = 0xFF5000FF;
case 27..29,36..38,45..47: Color = 0xFF8700FF;
case 30..32,39..41,48..50: Color = 0xFFA700FF;
case 33..35,42..44,51..53: Color = 0xFFDC00FF;
case 54..56,63..65,72..74: Color = 0xFFFB00FF;
case 57..59,66..68,75..77: Color = 0xC4FF00FF;
case 60..62,69..71,78..80: Color = 0x7BFF00FF;
default: Color = 0xFFFFFFFF;
}
PlayerTextDrawBoxColor(playerid,BoxGame[playerid][count], Color);
PlayerTextDrawSetOutline(playerid,BoxGame[playerid][count], 1);
PlayerTextDrawBackgroundColor(playerid,BoxGame[playerid][count], 224);
PlayerTextDrawFont(playerid,BoxGame[playerid][count], 2);
PlayerTextDrawSetSelectable(playerid,BoxGame[playerid][count], true);
count++;
}
}
BoxGame[playerid][count] = CreatePlayerTextDraw(playerid,499.997985, 91.100036, "usebox");
PlayerTextDrawLetterSize(playerid,BoxGame[playerid][count], 0.000000, 26.836849);
PlayerTextDrawTextSize(playerid,BoxGame[playerid][count], 189.666503, 0.000000);
PlayerTextDrawAlignment(playerid,BoxGame[playerid][count], 1);
PlayerTextDrawColor(playerid,BoxGame[playerid][count], 0);
PlayerTextDrawUseBox(playerid,BoxGame[playerid][count], true);
PlayerTextDrawBoxColor(playerid,BoxGame[playerid][count], 170);
PlayerTextDrawSetShadow(playerid,BoxGame[playerid][count], 300);
PlayerTextDrawSetOutline(playerid,BoxGame[playerid][count], 0);
PlayerTextDrawBackgroundColor(playerid,BoxGame[playerid][count], -1061109505);
PlayerTextDrawFont(playerid,BoxGame[playerid][count], 0);
count++;
BoxGame[playerid][count] = CreatePlayerTextDraw(playerid,283.333251, 71.348098, "Noughts and Crosses");
PlayerTextDrawLetterSize(playerid,BoxGame[playerid][count], 0.351333, 1.861333);
PlayerTextDrawAlignment(playerid,BoxGame[playerid][count], 1);
PlayerTextDrawColor(playerid,BoxGame[playerid][count], -1);
PlayerTextDrawSetShadow(playerid,BoxGame[playerid][count], 0);
PlayerTextDrawSetOutline(playerid,BoxGame[playerid][count], 0);
PlayerTextDrawBackgroundColor(playerid,BoxGame[playerid][count], 51);
PlayerTextDrawFont(playerid,BoxGame[playerid][count], 1);
PlayerTextDrawSetProportional(playerid,BoxGame[playerid][count], 1);
PHP:
for(new i = 0; i < 83; i ++) PlayerTextDrawDestroy(playerid, BoxGame[playerid][i]);
PHP:
if(GetPVarInt(playerid, "show"))
{
if(!GetPVarInt(playerid, "StartHod")) return SendClientMessage(playerid, 0xFF0000FF, "Сейчас не Ваш ход!");
new slot = -1, gid = GetPVarInt(playerid, "GamerPlayer");
for(new i = 0; i < 81; i ++)
{
if(playertextid == BoxGame[playerid][i])
{
slot = i;
break;
}
}
if(slot == -1) return 1;
DeletePVar(playerid, "StartHod");
SetPVarInt(GetPVarInt(playerid, "GamerPlayer"), "StartHod", true);
if(!BoxUnity[playerid][slot])
{
BoxUnity[playerid][slot] = true;
PlayerTextDrawSetString(playerid,BoxGame[playerid][slot], (GetPVarInt(playerid, "TypeTic") == 1 ? ("X") : ("0")));
if(gid != playerid) PlayerTextDrawSetString(gid,BoxGame[playerid][slot], (GetPVarInt(playerid, "TypeTic") == 1 ? ("X") : ("0")));
if(CheckWin(playerid, true))
{
new string[24+30], Name[24];
GetPlayerName(playerid, Name, 24);
format(string,sizeof(string),"Победил: %s(%d)", Name,playerid);
SendClientMessage(playerid, 0xFF0000FF, string);
for(new i = 0; i < 81; i ++)
{
BoxUnity[playerid][i] = false;
BoxUnity[gid][i] = false;
PlayerTextDrawSetString(playerid,BoxGame[playerid][i], "_");
PlayerTextDrawSetString(gid,BoxGame[gid][i], "_");
PlayerTextDrawHide(playerid, BoxGame[playerid][i]);
PlayerTextDrawHide(gid, BoxGame[gid][i]);
}
PlayerTextDrawHide(playerid, BoxGame[playerid][81]), PlayerTextDrawHide(playerid, BoxGame[playerid][82]);
PlayerTextDrawHide(gid, BoxGame[gid][81]), PlayerTextDrawHide(gid, BoxGame[gid][82]);
CancelSelectTextDraw(playerid);
return 1;
}
}
}
Командный процессор: DC_CMD.
PHP:
CMD:show(playerid, params[])
{
if(sscanf(params, "d", params[0])) return SendClientMessage(playerid, -1, "/show [id]");
if(params[0] == playerid) return SendClientMessage(playerid, -1, "Запрещено играть с собой!");
for(new i = 0; i < 83; i++)
{
PlayerTextDrawShow(playerid,BoxGame[playerid][i]);
PlayerTextDrawShow(params[0],BoxGame[playerid][i]);
}
SelectTextDraw(playerid,0xFF9900FF), SelectTextDraw(params[0],0xFF9900FF);
SetPVarInt(params[0], "GamerPlayer", playerid);
SetPVarInt(playerid, "show", true), SetPVarInt(params[0], "show", true);
SetPVarInt(params[0], "StartHod", true);
SetPVarInt(playerid, "TypeTic", 1), SetPVarInt(params[0], "TypeTic", 2);
return 1;
}
Алгоритм подбора выигрышных чисел был взять примером у GAMES.
Первый алгоритм был составлен с помощью DeadLine (AngeL) в плане математики. (после сдачи второго алгоритма).
Автор: #Denwer (Archibalt).
Последнее редактирование:
