#Azamat
Компетентный
Всем привет, вот вам небольшой мануал игры в крестики-нолики 9х9 на TD. Данную работу я делал для конкурса "Лучший скриптер 2015-2016"
Итак, начнем:
Добавляем инклуды:
Ко всем new:
Если делаете FS, то в public OnFilterScriptInit(), если хотите вписать в мод, то в public OnGameModeInit():
Добавляем команду для начала игры, она на DC_CMD:
В OnDialogResponse добавляем диалог. Я делал FS, и поэтому у меня тут только 1 диалог:
В OnPlayerClickTextDraw:
В OnPlayerClickPlayerTextDraw:
Создаем эти стоки(6 шт):
На этом всё.
Автор(я): #Azamat
Итак, начнем:
Добавляем инклуды:
PHP:
#include <a_samp>
#include <sscanf2>
#include <dc_cmd>
PHP:
new Text:fon;//Фон
new Text:nacdraw[81];//Квадраты
new PlayerText:Text[6];//Тексты
new PlayerText:kseldraw[81];//ТД крестика или нолика
new nacdrawpos[81][2];//Позиции для крестика или нолика
new CheckBox[MAX_PLAYERS][81];//В каких клетках отмечал игрок
new chet[MAX_PLAYERS];//Счет каждого игрока
new turn[MAX_PLAYERS];//Очередь игроков
PHP:
fon = TextDrawCreate(213.082092, 106.808280, "LD_SPAC:white");
TextDrawTextSize(fon, 217.582397, 303.508300);
TextDrawColor(fon, 7340031);
TextDrawFont(fon, 4);
new tid = 0;
for(new i=1; i < 10; i++)
{
for(new j=1; j < 10; j++)
{
nacdraw[tid] = TextDrawCreate((j*24)+191.0, (i*28)+114.0, "LD_SPAC:white");
TextDrawLetterSize(nacdraw[tid], 0.000000, 0.000000);
TextDrawTextSize(nacdraw[tid], 22.142021, 26.458320);
TextDrawAlignment(nacdraw[tid], 1);
TextDrawColor(nacdraw[tid], -1);
TextDrawFont(nacdraw[tid], 4);
TextDrawSetSelectable(nacdraw[tid], 1);
nacdrawpos[tid][0] = ((j*24)+191)+15;
nacdrawpos[tid][1] = (i*28)+114+4;
tid++;
}
}
PHP:
CMD:nac(playerid, params[])//Nought And Crosses
{
if(sscanf(params, "u", params[0])) return SendClientMessage(playerid, 0xB4B5B7FF, "Введите: /nac [ид игрока]");
if(!IsPlayerConnected(params[0])) return SendClientMessage(playerid, 0xFF6347FF, "Указанный игрок не подключен!");
new ktext[81], kname[24];
SetPVarInt(params[0], "nac_id", playerid);
SetPVarInt(playerid, "nac_id", params[0]);
GetPlayerName(playerid, kname, sizeof kname);
format(ktext, sizeof ktext, "Игрок {33CCFF}%s {FFFFFF}предлагает вам сыграть в крестики-нолики.", kname);
ShowPlayerDialog(params[0], 1, DIALOG_STYLE_MSGBOX, "{33CCFF}Крестики-нолики", ktext, "Принять", "Отказаться");
return 1;
}
PHP:
switch(dialogid)
{
case 1:
{
new nac_id = GetPVarInt(playerid, "nac_id");
if(!response) return SendClientMessage(nac_id, 0xB4B5B7FF, "Игрок отказался от игры.");
CreateTextDraws(playerid);
CreateTextDraws(nac_id);
turn[nac_id] = 1;
SetPVarInt(playerid, "kto", 2);
SetPVarInt(playerid, "nac", 1);//nac - Проверка игры
SetPVarInt(nac_id, "nac", 1);
SetPVarInt(playerid, "ksel", 0);//0 - нолик
SetPVarInt(nac_id, "ksel", 1);//1- Крестик
chet[playerid] = 0;
chet[nac_id] = 0;
new kname[24], dname[24];
GetPlayerName(playerid, kname, sizeof kname);
GetPlayerName(nac_id, dname, sizeof dname);
PlayerTextDrawSetString(playerid, Text[1], kname);
PlayerTextDrawSetString(playerid, Text[0], dname);
PlayerTextDrawSetString(nac_id, Text[0], dname);
PlayerTextDrawSetString(nac_id, Text[1], kname);
ShowNac(playerid);
ShowNac(nac_id);
return 1;
}
}
PHP:
if(_:clickedid == INVALID_TEXT_DRAW)
{
if(GetPVarInt(playerid, "nac") == 1) HideNac(playerid);
}
for(new nid = 0; nid < 81; nid++)
{
if(clickedid == nacdraw[nid])
{
new naid = GetPVarInt(playerid, "nac_id");
if(turn[playerid] == 0) return SendClientMessage(playerid, 0xFF6347FF, "Не ваша очередь!");
if(CheckBox[playerid][nid] == 1 || CheckBox[naid][nid] == 1) return SendClientMessage(playerid, 0xFF6347FF, "Эта клетка уже отмечена!");
if(GetPVarInt(playerid, "ksel") == 1) ClickInBox(playerid, 1, nid);
else ClickInBox(playerid, 0, nid);
CheckBox[playerid][nid] = 1;
turn[naid] = 1;
turn[playerid] = 0;
CheckGame(playerid);
}
}
PHP:
if(playertextid == Text[5]) HideNac(playerid);
PHP:
stock ClickInBox(playerid, kl, nid)
{
if(kl == 1) kseldraw[nid] = CreatePlayerTextDraw(playerid, nacdrawpos[nid][0], nacdrawpos[nid][1], "X");
else kseldraw[nid] = CreatePlayerTextDraw(playerid, nacdrawpos[nid][0], nacdrawpos[nid][1], "O");
PlayerTextDrawLetterSize(playerid, kseldraw[nid], 0.320594, 1.733582);
PlayerTextDrawAlignment(playerid, kseldraw[nid], 3);
PlayerTextDrawSetProportional(playerid, kseldraw[nid], 1);
PlayerTextDrawFont(playerid, kseldraw[nid], 2);
PlayerTextDrawColor(playerid, kseldraw[nid], 225);
PlayerTextDrawSetOutline(playerid, kseldraw[nid], 0);
PlayerTextDrawSetShadow(playerid, kseldraw[nid], 0);
PlayerTextDrawShow(playerid, kseldraw[nid]);
return 1;
}
stock CreateTextDraws(playerid)
{
Text[0] = CreatePlayerTextDraw(playerid, 215.8, 107.05, "Your_Nickname");
Text[1] = CreatePlayerTextDraw(playerid, 215.8, 122.15, "Opponent_Nickname");
Text[2] = CreatePlayerTextDraw(playerid, 428.0, 107.05, "0");
Text[3] = CreatePlayerTextDraw(playerid, 428.0, 122.15, "0");
Text[4] = CreatePlayerTextDraw(playerid, 215.8, 392.7, "YOUR MOVE");
Text[5] = CreatePlayerTextDraw(playerid, 401.0, 392.7, "EXIT");
for(new i=0; i < 6; i++)
{
if(i == 5) PlayerTextDrawTextSize(playerid, Text[i], 427.666229, 18.900012), PlayerTextDrawSetSelectable(playerid, Text[i], 1);
PlayerTextDrawLetterSize(playerid, Text[i], 0.320594, 1.733582);
if(i == 2 || i == 3) PlayerTextDrawAlignment(playerid, Text[i], 3);
PlayerTextDrawSetProportional(playerid, Text[i], 1);
PlayerTextDrawFont(playerid, Text[i], 2);
PlayerTextDrawColor(playerid, Text[i], 0xFFFFFFFF);
PlayerTextDrawSetShadow(playerid, Text[i], 0);
PlayerTextDrawSetOutline(playerid, Text[i], 0);
}
return 1;
}
stock ShowNac(playerid)
{
TextDrawShowForPlayer(playerid, fon);
for(new f=0; f < 81; f++)
{
TextDrawShowForPlayer(playerid, nacdraw[f]);
}
for(new f=0; f < 6; f++)
{
PlayerTextDrawShow(playerid, Text[f]);
}
SelectTextDraw(playerid, 0xFF6347FF);
return 1;
}
stock Win(playerid)
{
new ch[5];
SendClientMessage(playerid, 0xFF6347FF, "Вы победили!");
SendClientMessage(GetPVarInt(playerid, "nac_id"), 0xFF6347FF, "Соперник выиграл этот раунд!");
chet[playerid]++;
valstr(ch, chet[playerid]);
if(GetPVarInt(playerid, "kto") == 2) PlayerTextDrawSetString(playerid, Text[3], ch);
for(new f=0; f < 81; f++)
{
CheckBox[playerid][f] = 0;
CheckBox[GetPVarInt(playerid, "nac_id")][f] = 0;
PlayerTextDrawHide(playerid, kseldraw[f]);
PlayerTextDrawHide(GetPVarInt(playerid, "nac_id"), kseldraw[f]);
}
return 1;
}
stock HideNac(playerid)//скрываем ТД и обнуляем данные
{
new naid = GetPVarInt(playerid, "nac_id");
SendClientMessage(naid, 0xFF6347FF, "Соперник покинул игру!");
for(new f=0; f < 81; f++)
{
CheckBox[playerid][f] = 0;
CheckBox[naid][f] = 0;
TextDrawHideForPlayer(playerid, nacdraw[f]);
TextDrawHideForPlayer(naid, nacdraw[f]);
PlayerTextDrawHide(playerid, kseldraw[f]);
PlayerTextDrawHide(naid, kseldraw[f]);
}
TextDrawHideForPlayer(playerid, fon);
for(new f=0; f < 6; f++)
{
PlayerTextDrawHide(playerid, Text[f]);
PlayerTextDrawHide(naid, Text[f]);
}
CancelSelectTextDraw(playerid);
DeletePVar(playerid, "ksel");
DeletePVar(playerid, "nac");
DeletePVar(playerid, "kto");
DeletePVar(naid, "ksel");
DeletePVar(naid, "nac");
DeletePVar(naid, "kto");
chet[playerid] = 0;
turn[playerid] = 0;
chet[naid] = 0;
turn[naid] = 0;
return 1;
}
stock CheckGame(playerid)
{
new count, box;
new naid = GetPVarInt(playerid, "nac_id");
for(new j; j < 9; j++)//10
{
count = 0;
box=j;
for(new k; k < 9; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box=box+9;//
}
count = 0;
box=j*9;//
for(new k; k < 9; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box++;
}
if(j > 4) continue;
count = 0;
box=8-j;//
for(new k=j; k < 9; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box=box+8;
}
box=j;//
count = 0;
for(new k=81-j*9-9+j; k < 81-j*9; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box=box+10;
}
if(j == 0) continue;
box=j*9;//
count = 0;
for(new k=72+j; k < 81; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box=box+10;
}
if(j < 2) continue;
count = 0;
box=9*j-1;//
for(new k=j; k < 10; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box=box+8;
}
}
PlayerTextDrawSetString(naid, Text[4], "YOUR MOVE");
PlayerTextDrawSetString(playerid, Text[4], "OPPONENT MOVE");
PlayerTextDrawHide(playerid, Text[4]);
PlayerTextDrawHide(naid, Text[4]);
PlayerTextDrawShow(playerid, Text[4]);
PlayerTextDrawShow(naid, Text[4]);
return 1;
}
PHP:
//#Azamat
//#Azamat - 2015.12.15
#include <a_samp>
#include <sscanf2>
#include <dc_cmd>
new Text:fon;//Фон
new Text:nacdraw[81];//Квадраты
new PlayerText:Text[6];//Тексты
new PlayerText:kseldraw[81];//ТД крестика или нолика
new nacdrawpos[81][2];//Позиции для крестика или нолика
new CheckBox[MAX_PLAYERS][81];//В каких клетках отмечал игрок
new chet[MAX_PLAYERS];//Счет каждого игрока
new turn[MAX_PLAYERS];//Очередь игроков
public OnFilterScriptInit()
{
fon = TextDrawCreate(213.082092, 106.808280, "LD_SPAC:white");
TextDrawTextSize(fon, 217.582397, 303.508300);
TextDrawColor(fon, 7340031);
TextDrawFont(fon, 4);
new tid = 0;
for(new i=1; i < 10; i++)
{
for(new j=1; j < 10; j++)
{
nacdraw[tid] = TextDrawCreate((j*24)+191.0, (i*28)+114.0, "LD_SPAC:white");
TextDrawLetterSize(nacdraw[tid], 0.000000, 0.000000);
TextDrawTextSize(nacdraw[tid], 22.142021, 26.458320);
TextDrawAlignment(nacdraw[tid], 1);
TextDrawColor(nacdraw[tid], -1);
TextDrawFont(nacdraw[tid], 4);
TextDrawSetSelectable(nacdraw[tid], 1);
nacdrawpos[tid][0] = ((j*24)+191)+15;
nacdrawpos[tid][1] = (i*28)+114+4;
tid++;
}
}
return 1;
}
CMD:nac(playerid, params[])//Nought And Crosses
{
if(sscanf(params, "u", params[0])) return SendClientMessage(playerid, 0xB4B5B7FF, "Введите: /nac [ид игрока]");
if(!IsPlayerConnected(params[0])) return SendClientMessage(playerid, 0xFF6347FF, "Указанный игрок не подключен!");
new ktext[81], kname[24];
SetPVarInt(params[0], "nac_id", playerid);
SetPVarInt(playerid, "nac_id", params[0]);
GetPlayerName(playerid, kname, sizeof kname);
format(ktext, sizeof ktext, "Игрок {33CCFF}%s {FFFFFF}предлагает вам сыграть в крестики-нолики.", kname);
ShowPlayerDialog(params[0], 1, DIALOG_STYLE_MSGBOX, "{33CCFF}Крестики-нолики", ktext, "Принять", "Отказаться");
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case 1:
{
new nac_id = GetPVarInt(playerid, "nac_id");
if(!response) return SendClientMessage(nac_id, 0xB4B5B7FF, "Игрок отказался от игры.");
CreateTextDraws(playerid);
CreateTextDraws(nac_id);
turn[nac_id] = 1;
SetPVarInt(playerid, "kto", 2);
SetPVarInt(playerid, "nac", 1);//nac - Проверка игры
SetPVarInt(nac_id, "nac", 1);
SetPVarInt(playerid, "ksel", 0);//0 - нолик
SetPVarInt(nac_id, "ksel", 1);//1- Крестик
chet[playerid] = 0;
chet[nac_id] = 0;
new kname[24], dname[24];
GetPlayerName(playerid, kname, sizeof kname);
GetPlayerName(nac_id, dname, sizeof dname);
PlayerTextDrawSetString(playerid, Text[1], kname);
PlayerTextDrawSetString(playerid, Text[0], dname);
PlayerTextDrawSetString(nac_id, Text[0], dname);
PlayerTextDrawSetString(nac_id, Text[1], kname);
ShowNac(playerid);
ShowNac(nac_id);
return 1;
}
}
return 1;
}
public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
if(_:clickedid == INVALID_TEXT_DRAW)
{
if(GetPVarInt(playerid, "nac") == 1) HideNac(playerid);
}
for(new nid = 0; nid < 81; nid++)
{
if(clickedid == nacdraw[nid])
{
new naid = GetPVarInt(playerid, "nac_id");
if(turn[playerid] == 0) return SendClientMessage(playerid, 0xFF6347FF, "Не ваша очередь!");
if(CheckBox[playerid][nid] == 1 || CheckBox[naid][nid] == 1) return SendClientMessage(playerid, 0xFF6347FF, "Эта клетка уже отмечена!");
if(GetPVarInt(playerid, "ksel") == 1) ClickInBox(playerid, 1, nid);
else ClickInBox(playerid, 0, nid);
CheckBox[playerid][nid] = 1;
turn[naid] = 1;
turn[playerid] = 0;
CheckGame(playerid);
}
}
return 1;
}
public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid)
{
if(playertextid == Text[5]) HideNac(playerid);
return 1;
}
stock ClickInBox(playerid, kl, nid)
{
new naid = GetPVarInt(playerid, "nac_id");
if(kl == 1) kseldraw[nid] = CreatePlayerTextDraw(playerid, nacdrawpos[nid][0], nacdrawpos[nid][1], "X"), kseldraw[nid] = CreatePlayerTextDraw(naid, nacdrawpos[nid][0], nacdrawpos[nid][1], "X");
else kseldraw[nid] = CreatePlayerTextDraw(playerid, nacdrawpos[nid][0], nacdrawpos[nid][1], "O"), kseldraw[nid] = CreatePlayerTextDraw(naid, nacdrawpos[nid][0], nacdrawpos[nid][1], "O");
PlayerTextDrawLetterSize(playerid, kseldraw[nid], 0.320594, 1.733582);
PlayerTextDrawLetterSize(naid, kseldraw[nid], 0.320594, 1.733582);
PlayerTextDrawAlignment(playerid, kseldraw[nid], 3);
PlayerTextDrawAlignment(naid, kseldraw[nid], 3);
PlayerTextDrawSetProportional(playerid, kseldraw[nid], 1);
PlayerTextDrawSetProportional(naid, kseldraw[nid], 1);
PlayerTextDrawFont(playerid, kseldraw[nid], 2);
PlayerTextDrawFont(naid, kseldraw[nid], 2);
PlayerTextDrawColor(playerid, kseldraw[nid], 225);
PlayerTextDrawColor(naid, kseldraw[nid], 225);
PlayerTextDrawSetOutline(playerid, kseldraw[nid], 0);
PlayerTextDrawSetOutline(naid, kseldraw[nid], 0);
PlayerTextDrawSetShadow(playerid, kseldraw[nid], 0);
PlayerTextDrawSetShadow(naid, kseldraw[nid], 0);
PlayerTextDrawShow(playerid, kseldraw[nid]);
PlayerTextDrawShow(naid, kseldraw[nid]);
return 1;
}
stock CreateTextDraws(playerid)
{
Text[0] = CreatePlayerTextDraw(playerid, 215.8, 107.05, "Your_Nickname");
Text[1] = CreatePlayerTextDraw(playerid, 215.8, 122.15, "Opponent_Nickname");
Text[2] = CreatePlayerTextDraw(playerid, 428.0, 107.05, "0");
Text[3] = CreatePlayerTextDraw(playerid, 428.0, 122.15, "0");
Text[4] = CreatePlayerTextDraw(playerid, 215.8, 392.7, "YOUR MOVE");
Text[5] = CreatePlayerTextDraw(playerid, 401.0, 392.7, "EXIT");
for(new i=0; i < 6; i++)
{
if(i == 5) PlayerTextDrawTextSize(playerid, Text[i], 427.666229, 18.900012), PlayerTextDrawSetSelectable(playerid, Text[i], 1);
PlayerTextDrawLetterSize(playerid, Text[i], 0.320594, 1.733582);
if(i == 2 || i == 3) PlayerTextDrawAlignment(playerid, Text[i], 3);
PlayerTextDrawSetProportional(playerid, Text[i], 1);
PlayerTextDrawFont(playerid, Text[i], 2);
PlayerTextDrawColor(playerid, Text[i], 0xFFFFFFFF);
PlayerTextDrawSetShadow(playerid, Text[i], 0);
PlayerTextDrawSetOutline(playerid, Text[i], 0);
}
return 1;
}
stock ShowNac(playerid)
{
TextDrawShowForPlayer(playerid, fon);
for(new f=0; f < 81; f++)
{
TextDrawShowForPlayer(playerid, nacdraw[f]);
}
for(new f=0; f < 6; f++)
{
PlayerTextDrawShow(playerid, Text[f]);
}
SelectTextDraw(playerid, 0xFF6347FF);
return 1;
}
stock Win(playerid)
{
new ch[5];
SendClientMessage(playerid, 0xFF6347FF, "Вы победили!");
SendClientMessage(GetPVarInt(playerid, "nac_id"), 0xFF6347FF, "Соперник выиграл этот раунд!");
chet[playerid]++;
valstr(ch, chet[playerid]);
if(GetPVarInt(playerid, "kto") == 2) PlayerTextDrawSetString(playerid, Text[3], ch);
for(new f=0; f < 81; f++)
{
CheckBox[playerid][f] = 0;
CheckBox[GetPVarInt(playerid, "nac_id")][f] = 0;
PlayerTextDrawHide(playerid, kseldraw[f]);
PlayerTextDrawHide(GetPVarInt(playerid, "nac_id"), kseldraw[f]);
}
return 1;
}
stock HideNac(playerid)//скрываем ТД и обнуляем данные
{
new naid = GetPVarInt(playerid, "nac_id");
SendClientMessage(naid, 0xFF6347FF, "Соперник покинул игру!");
for(new f=0; f < 81; f++)
{
CheckBox[playerid][f] = 0;
CheckBox[naid][f] = 0;
TextDrawHideForPlayer(playerid, nacdraw[f]);
TextDrawHideForPlayer(naid, nacdraw[f]);
PlayerTextDrawHide(playerid, kseldraw[f]);
PlayerTextDrawHide(naid, kseldraw[f]);
}
TextDrawHideForPlayer(playerid, fon);
TextDrawHideForPlayer(naid, fon);
for(new f=0; f < 6; f++)
{
PlayerTextDrawHide(playerid, Text[f]);
PlayerTextDrawHide(naid, Text[f]);
}
CancelSelectTextDraw(playerid);
CancelSelectTextDraw(naid);
DeletePVar(playerid, "ksel");
DeletePVar(playerid, "nac");
DeletePVar(playerid, "kto");
DeletePVar(naid, "ksel");
DeletePVar(naid, "nac");
DeletePVar(naid, "kto");
chet[playerid] = 0;
turn[playerid] = 0;
chet[naid] = 0;
turn[naid] = 0;
return 1;
}
stock CheckGame(playerid)
{
new count, box;
new naid = GetPVarInt(playerid, "nac_id");
for(new j; j < 9; j++)//10
{
count = 0;
box=j;
for(new k; k < 9; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box=box+9;//
}
count = 0;
box=j*9;//
for(new k; k < 9; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box++;
}
if(j > 4) continue;
count = 0;
box=8-j;//
for(new k=j; k < 9; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box=box+8;
}
box=j;//
count = 0;
for(new k=81-j*9-9+j; k < 81-j*9; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box=box+10;
}
if(j == 0) continue;
box=j*9;//
count = 0;
for(new k=72+j; k < 81; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box=box+10;
}
if(j < 2) continue;
count = 0;
box=9*j-1;//
for(new k=j; k < 10; k++)
{
if(CheckBox[playerid][box] == 1) count++;
else count = 0;
if(count == 5) return Win(playerid);
box=box+8;
}
}
PlayerTextDrawSetString(naid, Text[4], "YOUR MOVE");
PlayerTextDrawSetString(playerid, Text[4], "OPPONENT MOVE");
PlayerTextDrawHide(playerid, Text[4]);
PlayerTextDrawHide(naid, Text[4]);
PlayerTextDrawShow(playerid, Text[4]);
PlayerTextDrawShow(naid, Text[4]);
return 1;
}
На этом всё.
Автор(я): #Azamat
Последнее редактирование:
