PDA

Просмотр полной версии : [Info] Сравнения 2ух кодов и ваша оценка



DeadLine
10.12.2015, 10:49
Вообщем проблема такая либо судей на мыло либо я не шарю!
Вообщем ребят сейчас кину 2 pwn файла!
Суть конкурса была подобного рода!
Что нужно было сделать Крестики нолики 9х9 ( не указано на что обоснован код и так далее )
Вообщем я просчитал каждый ход! Сделал четко и граматно Но как тестить было не с кем сделал на одного игрока.
В этот самый момент делает работу другой участник ! Коды будут ниже.
Я не гоняюсь за оценкой отнють, просто хочу справедливости.


И так 1ая работа идет моя!

screen https://pp.vk.me/c633129/v633129892/2a31/ypXgsWLd_AQ.jpg
pastebin http://pastebin.com/aarGxuKr


2ая работа участника.

screen https://pp.vk.me/c633130/v633130182/2f3d/O8x6WAsoyH4.jpg
На скрине уже показан баг, что он ловит то верные комбинации то вообще нечего не ловит, вообще из крестиков ноликов превратилось в сапера.
pastebin http://pastebin.com/yiqg2T23


По конкурсным показателем вышло так

- Я 13.9 балла
- Он 18.5

Прошу оценить вас по 20 бальной шкале.

Desulaid
10.12.2015, 11:17
Можешь обновить второй скрин?

DeadLine
10.12.2015, 11:18
Можешь обновить второй скрин?

он вроде бы показывает же.

Desulaid
10.12.2015, 11:19
он вроде бы показывает же.

Ааа, это у меня кампутар что-то не загрузил картинку :)

$continue$
10.12.2015, 17:55
Только за это можно кастрировать в данном коде - программиста:


for(new g; g < 86; g++) CloseRefresh[playerid][i] = 0;
for(new s; s < 249; s++) TextDrawHideForPlayer(playerid, Text_Draw[s]);

Profyan
10.12.2015, 17:56
1ый вариант более правильный, с точки зрения игры.Ловит все ситуации, если не ошибаюсь?!Но я думаю второму поставили такую оценку за использование PVar'ов... А так у вас обоих алгоритмы схожи, и если не ошибаюсь, вы позаимствовали его у Games с крестиков-ноликов 3х3.
Но у первого варианта читабельность хуже, где-то ненужные переменные. Но по дизайну - определенно 1ый.

DeadLine
10.12.2015, 18:39
Только за это можно кастрировать в данном коде - программиста:


for(new g; g < 86; g++) CloseRefresh[playerid][i] = 0;
for(new s; s < 249; s++) TextDrawHideForPlayer(playerid, Text_Draw[s]);


упс.....)))

Daniel_Cortez
10.12.2015, 20:37
Прежде, чем приступить к обзору кода, скажу сразу: я не проверял скрипты в игре и лишь рассмотрел их код, поэтому не буду приводить никаких оценок.

Во втором варианте убило название "Noughts and Crosses". Сразу отдаёт чем-то с govno-info.
Казалось бы, машинный перевод - ан нет, Yandex и Google переводят "крестики-нолики" правильно: "tic-tac-toe"!
В общем, происхождение этого названия "нули и кресты" для меня так и осталось загадкой.


Едем дальше. В первом варианте:


#include <a_samp>
#define MAX_PLAYERS 10

Компилятор выдаст варнинг из-за повторно объявленного макроса MAX_PLAYERS, что в принципе логично.
Правильное переобъявление должно выглядеть примерно так:


#undef MAX_PLAYERS
#define MAX_PLAYERS 10

Или так:


#if defined MAX_PLAYERS
#undef MAX_PLAYERS
#endif
#define MAX_PLAYERS 10

За такую глупую ошибку уже можно списать балл или хотя бы половину балла.
Справедливости ради, следует заметить, что во второй работе ошибка точно такая же.


В обеих работах поле 9x9 клеток. При этом SA:MP позволяет манипулировать одновременно и цветом фона текстдрава, и его текстом.
Поэтому в самом минималистичном варианте должно быть достаточно 9x9 = 81 текстдрава для каждого их полей и ещё 1 текстдрав нужен будет под фон, итого 82.

Работа 2:

new PlayerText:BoxGame[MAX_PLAYERS][83];
83-й текстдрав используется для надписи с названием игры ("Noughts and Crosses"), больше ничего лишнего.

Работа 1:

new Text:Text_Draw[249];
249! Целых 249 текстдравов, да ещё и глобальных.
9x9 на подсвечивание выбранной клетки (по 1 текстдраву на клетку), ещё 9x9x2 для символов "X" и "0" поверх клеток и ещё 5 под фон.
Итого 9 * 9 * 3 + 5 = 243 + 5 = 248. Одна ячейка в массиве лишняя.
Насколько помню, подсветку выбранного текстдрава можно установить с помощью SelectTextDraw. Не совсем то, но всё же.
Кроме того, у текстдравов можно менять текст, поэтому создания отдельных текстдравов под "X" и "0" тоже можно было избежать.




for(new r = 0; r < 9; r++)
{
for(new f = 0; f < 9; f++)

Код из 1-го варианта. Если я захочу увеличить или уменьшить кол-во клеток, мне придётся перебирать весь код и менять в циклах 9 на новое число.
Избегайте использования "магических чисел" (https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29) и используйте константы. Например, в данном случае можно было сделать константы TICTACTOE_FIELD_WIDTH и TICTACTOE_FIELD_HEIGHT.
Проблема присутствует в обоих вариантах.


Дальше, 1-я работа:


new tts[ 40 ];
new str[ 128 ];

Эти массивы используются только в функции Resultgame, зачем делать их глобальными?



if(!(_:clickedid ^ 0xFFFF))
{
wins[2] =0,wins[1] =1;
for(new s; s < 249; s++) TextDrawHideForPlayer(playerid, Text_Draw[s]);
for(new i; i < 86; i++) CloseRefresh[playerid][i] = 0;
}
for(new i = 1; i < 82; i++)
{
if(clickedid == Text_Draw[i])
{
if(wins[0] == 1)
{
for(new v = 0; v < 84; v++) ClickPlayer[playerid][v] = 0;
wins[0] = 0;
}
if(ClickPlayer[playerid][i] == 0)
{
if(CloseRefresh[playerid][i] == i) return 1;//iiaoi?iia eeeeaiua
СloseRefresh[playerid][i] = i;
if(!ExplodeText) TextDrawShowForPlayer(playerid, Text_Draw[84 + 2 * i]),ExplodeText = true,ClickPlayer[playerid][i] = 1,SetPVarInt(playerid,"Sta",1); //85 = 0
else TextDrawShowForPlayer(playerid, Text_Draw[85 + 2 * i]),ExplodeText = false,ClickPlayer[playerid][i] = 2,SetPVarInt(playerid,"Sta",2);
if(Resultgame(playerid, GetPVarInt(playerid,"Sta") ) )
{
for(new f; f < 82; f++) ClickPlayer[playerid][f] = 1;

Совершенно бессмысленные названия локальных переменных. Ладно бы там "i" или "j", такие названия часто используют во вложенных циклах, но что заставило вас выбрать "s", "f" или "v"?
И всё это вкупе с напрочь отсутствующей табуляцией. Содом и гоморра.
Не удивительно, что за работу снизили баллы - для такого кода даже обфускатор не нужен.


В алгоритмах определения победы я разбираться не стал, т.к. и без того потратил 2 часа на ревью кода и написание сего поста.

Как и обещал, никаких оценок я выдавать не собираюсь. Но скажу вот что: победа 100% была бы за вторым вариантом, если бы в нём правильно работал код определения выигрышной ситуации.
Топикстартеру настоятельно рекомендую прочесть, как минимум, эту статью: http://pro-pawn.ru/showthread.php?8347

DeadLine
11.12.2015, 08:12
Благодарю за разъяснения. Тему можно закрывать!