Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятнашки на С / 10 сообщений из 10, страница 1 из 1
26.02.2017, 20:46
    #39410470
Alero
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятнашки на С
Здравствуйте!
Передо мной стоит задача написать несколько функции для кода игры в "пятнашки" на C. В общем почти все написал правильно. Осталась функция, которая каждый шаг проверяет правильном ли порядке стоят значения в массиве. Вот сам код:
bool won(void)
Код: plaintext
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.
bool won(void)
{
    // d- размерность поля (по условию задачи может быть либо 3, либо 4), board - массив значений. И d и board уже заданы 
    //глобально. В качестве "пустой плитки" использую ноль.
    int k=0; // k - счетчик, который накручивается, когда одно значение меньше предыдущего
    for (int i=0; i<d; i++)
    {
        for (int j=0; j<d; j++)
        {
            if (board[i][j]<board[i][j+1])
            {
                k++;
            }
            if (j==(d-1) && board[i][j]<board[i+1][0])
            {
                k++;
            }
            
        }
    }
    // далее проверяется условие - k должен быть равен определённому значению и последнее положение в массиве должно быть
    // занято "пустым полем" или нулём в данному случае
    if (k==d*d-1 && board[d-1][d-1]==0)
    {
        return true;
    }
    return false;
}



Печаль в том, что при запуске программы с входящим правильным решением, как-будто функция, которая проверяет условие победы, игнорируется.
Если нужно могу привести весь код программы.

Модератор: Тема перенесена из форума "Программирование".
...
Рейтинг: 0 / 0
26.02.2017, 21:55
    #39410484
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятнашки на С
под отладчиком в функцию заходит?
ифы вылетают за массив. там наверное нужно сделать else if, так?

в последнем блоке можно сделать так return k==d*d-1 && board[d-1][d-1]==0
...
Рейтинг: 0 / 0
26.02.2017, 23:42
    #39410515
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятнашки на С
Alero, зачем вообще что-то считать? Достаточно проверить, что плитки расставлены по порядку:
Код: plaintext
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.
#include <stdbool.h>
#include <assert.h>

#define MAX_SIZE 4

int _size; /* в вашем коде -- d */
int _board[MAX_SIZE][MAX_SIZE];

bool won(void) {
  int row, col;

  for (row = 0; row < _size; row++) {
    for (col = 0; col < _size; col++) {
      if ((row == _size - 1) && (col == _size - 1)) { /* если правый нижний угол */
        if (_board[row][col] != 0) return false;
      } else {
        if (_board[row][col] != row * _size + col + 1) return false;
      }
    }
  }

  return true;
}

int main() {
  _size = 3;
  _board[0][0] = 1; _board[0][1] = 2; _board[0][2] = 3;
  _board[1][0] = 4; _board[1][1] = 5; _board[1][2] = 6;
  _board[2][0] = 7; _board[2][1] = 8; _board[2][2] = 0;
  assert(won());

  _size = 4;
  _board[0][0] = 1;  _board[0][1] = 2;  _board[0][2] = 3;  _board[0][3] = 4;
  _board[1][0] = 5;  _board[1][1] = 6;  _board[1][2] = 7;  _board[1][3] = 8;
  _board[2][0] = 9;  _board[2][1] = 10; _board[2][2] = 11; _board[2][3] = 12;
  _board[3][0] = 13; _board[3][1] = 14; _board[3][2] = 15; _board[3][3] = 0;
  assert(won());

  return 0;
}
...
Рейтинг: 0 / 0
27.02.2017, 19:25
    #39411183
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятнашки на С
Пётр Седов, можно проще, если хранить в векторе, а в последний его элемент запихать std::numeric_limits::max, то получится в духе

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
auto end_pos  = board.cend()-1;
for(auto pos=board.cbegin();pos!=end_pos;++pos){
  auto tmp=*pos++;
  if( (*pos--)<tmp ) return false;
}

return true;



к тому же получится инвариант, который можно проверить :)
...
Рейтинг: 0 / 0
27.02.2017, 19:26
    #39411184
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятнашки на С
ой, тут же написано на С )) сори.
...
Рейтинг: 0 / 0
06.03.2017, 16:10
    #39414843
Alero
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятнашки на С
alexy_black, спасибо за внимание, добавил исправления, но мне кажется, что они лишние, т.к. даже когда счетчик вылетает за границы массива, то он и не учитывает их, т.е. я думал пусть себе вылетает, т.к. на подсчете не должно сказываться. Тем не менее подправил. Прохожу на степике курс по с++ и там в правильности решения, например, важно было использовать конструкцию if {} else if {}, а просто подряд if {} if {} не принималось. В общем теперь вот так выглядит:

Код: plaintext
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.
bool won(void)
{
    int k=0;
    for (int i=0; i<d; i++)
    {
        for (int j=0; j<d; j++)
        {
            if (j<d-1)
            {
                if (board[i][j]<board[i][j+1])
                {
                    k++;
                }
            }
            else if (j==(d-1) && i<d-1)
            {
                if (board[i][j]<board[i+1][0])
                {
                    k++;
                }
                
            }
        }
    }
    if (k==d*d-1 && board[d-1][d-1]==0)
    {
        return true;
    }
    return false;
}    



P.S. Надеюсь я правильно понял то, что надо исправить.
...
Рейтинг: 0 / 0
06.03.2017, 16:13
    #39414851
Alero
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятнашки на С
Пётр Седов, мне бы хотелось написать нечто более универсальное и менее громоздкое:) конечно если моя задумка увенчается фиаско, то попробую проверить положение каждой плитки.
...
Рейтинг: 0 / 0
07.03.2017, 02:36
    #39415118
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятнашки на С
Aleroдаже когда счетчик вылетает за границы массива, то он и не учитывает их, т.е. я думал пусть себе вылетает, т.к. на подсчете не должно сказываться.Получение элемента массива по неправильному индексу -- это грубая ошибка. Вы скорее всего получите мусор, и то, что это не влияет на результат, -- чисто везение. Другие настройки компиляции, другой компилятор -- и везение быстро кончится.

AleroТем не менее подправил.Вот и правильно.

AleroПрохожу на степике курс по с++Так C или C++?
...
Рейтинг: 0 / 0
07.03.2017, 13:05
    #39415412
д0kХ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятнашки на С
AleroПётр Седов, мне бы хотелось написать нечто более универсальное и менее громоздкое:) конечно если моя задумка увенчается фиаско, то попробую проверить положение каждой плитки.


См Сюда

2 мерный масссив можно адресовать как одномерный.
...
Рейтинг: 0 / 0
05.12.2017, 22:25
    #39564736
hakaton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятнашки на С
Alero,

Привет!
В этой строке ошибка:
if (k==d*d-1 && board[d-1][d-1]==0)

Нужно так:
if (k==d*d-2 && board[d-1][d-1]==0)

Сам прохожу подобный курс на edX. И задание такое-же почти. Интересно было бы увидеть весь код программы. )
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятнашки на С / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]