//2014 #include new Text:GameTD[37]; new PlayerField[MAX_PLAYERS][9]; new PlayerScore[MAX_PLAYERS][2]; new PlayerText: ScoreInfo[MAX_PLAYERS]; new winCells[][3] = {{0,1,2}, {3,4,5}, {6,7,8}, {0,3,6}, {1,4,7}, {2,5,8}, {0,4,8}, {2,4,6}}; public OnFilterScriptInit() { CreateGameTD(); //OnPlayerConnect(0); //для теста, если загрузка фс, когда игрок уже на сервере } public OnPlayerConnect(playerid) { ScoreInfo[playerid] = CreatePlayerTextDraw(playerid, 376.000000, 167.000000, "Player vS Computer~n~0:0"); PlayerTextDrawAlignment(playerid, ScoreInfo[playerid], 2); PlayerTextDrawBackgroundColor(playerid, ScoreInfo[playerid], 255); PlayerTextDrawFont(playerid, ScoreInfo[playerid], 2); PlayerTextDrawLetterSize(playerid, ScoreInfo[playerid], 0.280000, 1.600000); PlayerTextDrawColor(playerid, ScoreInfo[playerid], -1); PlayerTextDrawSetOutline(playerid, ScoreInfo[playerid], 0); PlayerTextDrawSetProportional(playerid, ScoreInfo[playerid], 1); PlayerTextDrawSetShadow(playerid, ScoreInfo[playerid], 1); } public OnPlayerDisconnect(playerid, reason) { PlayerTextDrawDestroy(playerid, ScoreInfo[playerid]); } public OnFilterScriptExit() { for(new i; i < 37; i++) TextDrawDestroy(GameTD[i]); } stock WinGame(playerid, number) { for(new i = 0; i < 8; i++) { new count = 0; for(new f = 0; f < 3; f++) { if(PlayerField[playerid][winCells[i][f]] == number) count++; } if(count == 3) return true; } return false; } stock UpdateTop(playerid, number) { PlayerScore[playerid][number]++; new str[50]; format(str, sizeof(str), "Player vS Computer~n~%d:%d", PlayerScore[playerid][0], PlayerScore[playerid][1]); PlayerTextDrawSetString(playerid, ScoreInfo[playerid], str); } public OnPlayerText(playerid, text[]) { if(!strcmp("on", text, true)) { for(new i; i < 2; i++) PlayerScore[playerid][i] = 0; PlayerTextDrawSetString(playerid, ScoreInfo[playerid], "Player vS Computer~n~0:0"); for(new i; i < 9; i++) PlayerField[playerid][i] = 0; SelectTextDraw(playerid,0x00CCFFFF); for(new i; i < 18; i++) TextDrawShowForPlayer(playerid, GameTD[i]); PlayerTextDrawShow(playerid, ScoreInfo[playerid]); TextDrawShowForPlayer(playerid, GameTD[36]); } if(!strcmp("off", text, true)) { CancelSelectTextDraw(playerid); for(new i; i < 37; i++) TextDrawHideForPlayer(playerid, GameTD[i]); PlayerTextDrawHide(playerid, ScoreInfo[playerid]); } } public OnPlayerClickTextDraw(playerid, Text:clickedid) { if(clickedid == GameTD[36]) { for(new i; i < 9; i++) PlayerField[playerid][i] = 0; for(new i = 18; i < 36; i++) TextDrawHideForPlayer(playerid, GameTD[i]); } for(new i; i < 9; i++) { if(clickedid == GameTD[i]) { if(PlayerField[playerid][i] == 0) { PlayerField[playerid][i] = 1; TextDrawShowForPlayer(playerid, GameTD[18 + 2 * i]); if(WinGame(playerid, 1)) { SendClientMessage(playerid, 0xFF0000FF, "Игрок победил!"); UpdateTop(playerid, 0); for(new f; f < 9; f++) PlayerField[playerid][f] = 1; return 1; } new freeCells; for(new f; f < 9; f++) if(PlayerField[playerid][f] == 0) freeCells++; if(freeCells > 0) { new count[8][2], min_clear = -1, computerCells = -1; for(new j = 0; j < 8; j++) { for(new f = 0; f < 3; f++) { if(PlayerField[playerid][winCells[j][f]]) count[j][PlayerField[playerid][winCells[j][f]] - 1]++; } } for(new j = 0; j < 8; j++) { if((count[j][0] == 2 && count[j][1] == 0) || (count[j][1] == 2 && count[j][0] == 0)) { min_clear = j; break; } if(count[j][0] == 0 && count[j][1] > computerCells) { computerCells = count[j][1]; min_clear = j; } } if(min_clear != -1) { for(new f; f < 3; f++) { if(PlayerField[playerid][winCells[min_clear][f]] == 0) { PlayerField[playerid][winCells[min_clear][f]] = 2; TextDrawShowForPlayer(playerid, GameTD[19 + 2 * winCells[min_clear][f]]); break; } } } else { for(new f; f < 9; f++) { if(PlayerField[playerid][f] == 0) { PlayerField[playerid][f] = 2; TextDrawShowForPlayer(playerid, GameTD[19 + 2 * f]); break; } } } if(WinGame(playerid, 2)) { SendClientMessage(playerid, 0xFF0000FF, "Компьютер победил!"); UpdateTop(playerid, 1); for(new f; f < 9; f++) PlayerField[playerid][f] = 1; return 1; } } else { SendClientMessage(playerid, 0xFF0000FF, "Ничья."); } } } } return 1; } stock CreateGameTD() { //0 - 8: кликабельные зоны new count = 0; for(new r = 0; r < 3; r++) { for(new f = 0; f < 3; f++) { GameTD[count] = TextDrawCreate(211.0 + f * 28.0, 141.0 + r * 32.0, "~n~"); TextDrawBackgroundColor(GameTD[count], 255); TextDrawFont(GameTD[count], 5); TextDrawLetterSize(GameTD[count], 0.500000, -5.600000); TextDrawColor(GameTD[count], 0); TextDrawSetOutline(GameTD[count], 0); TextDrawUseBox(GameTD[count], 1); TextDrawBoxColor(GameTD[count], 0); TextDrawTextSize(GameTD[count], 28.000000, 32.000000); TextDrawSetPreviewModel(GameTD[count], 19466); TextDrawSetPreviewRot(GameTD[count], 0.000000, 0.000000, 90.000000, 0.000099); TextDrawSetSelectable(GameTD[count], 1); count++; } } //9: фон GameTD[9] = TextDrawCreate(450.000000, 130.000000, "~BackGround~"); TextDrawLetterSize(GameTD[9], 0.880000, 12.899999); TextDrawUseBox(GameTD[9], 1); TextDrawBoxColor(GameTD[9], 100); TextDrawTextSize(GameTD[9], 197.000000, 0.000000); //10 - 17: синие границы GameTD[10] = TextDrawCreate(213.000000, 142.000000, "~n~"); GameTD[11] = TextDrawCreate(298.000000, 142.000000, "~n~"); GameTD[12] = TextDrawCreate(212.000000, 142.000000, "~n~"); GameTD[13] = TextDrawCreate(212.000000, 239.000000, "~n~"); GameTD[14] = TextDrawCreate(212.000000, 206.000000, "~n~"); GameTD[15] = TextDrawCreate(212.000000, 173.000000, "~n~"); GameTD[16] = TextDrawCreate(240.000000, 143.000000, "~n~"); GameTD[17] = TextDrawCreate(269.000000, 143.000000, "~n~"); for(new i = 10; i < 12; i++) TextDrawLetterSize(GameTD[i], 0.500000, 10.299999); for(new i = 16; i < 18; i++) TextDrawLetterSize(GameTD[i], 0.500000, 10.200003); for(new i = 12; i < 16; i++) TextDrawLetterSize(GameTD[i], 0.500000, -0.400001); for(new i = 10; i < 18; i++) { TextDrawUseBox(GameTD[i], 1); TextDrawBoxColor(GameTD[i], 65535); } TextDrawTextSize(GameTD[10], 208.000000, 0.000000); TextDrawTextSize(GameTD[16], 238.000000, 0.000000); TextDrawTextSize(GameTD[17], 264.000000, 0.000000); for(new i = 11; i < 16; i++) TextDrawTextSize(GameTD[i], 294.000000, 0.000000); //18 - 35: крестики и нолики count = 18; for(new r = 0; r < 3; r++) { for(new f = 0; f < 3; f++) { GameTD[count] = TextDrawCreate(221.0 + f * 28.0, 151.0 + r * 32.0, "X"); GameTD[count + 1] = TextDrawCreate(221.0 + f * 28.0, 151.0 + r * 32.0, "0"); for(new j = 0; j < 2; j++) { TextDrawBackgroundColor(GameTD[count + j], 255); TextDrawFont(GameTD[count + j], 1); TextDrawLetterSize(GameTD[count + j], 0.500000, 1.000000); TextDrawColor(GameTD[count + j], -1); TextDrawSetOutline(GameTD[count + j], 0); TextDrawSetProportional(GameTD[count + j], 1); TextDrawSetShadow(GameTD[count + j], 1); TextDrawSetSelectable(GameTD[count + j], 0); } count += 2; } } //36: кнопка RESET GameTD[36] = TextDrawCreate(400.000000, 227.000000, "RESET"); TextDrawBackgroundColor(GameTD[36], 255); TextDrawFont(GameTD[36], 2); TextDrawLetterSize(GameTD[36], 0.310000, 1.400000); TextDrawColor(GameTD[36], -65281); TextDrawSetOutline(GameTD[36], 0); TextDrawSetProportional(GameTD[36], 1); TextDrawSetShadow(GameTD[36], 1); TextDrawTextSize(GameTD[36], 450.0, 10.0000); TextDrawSetSelectable(GameTD[36], 1); }