powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятнашки на С
10 сообщений из 10, страница 1 из 1
Пятнашки на С
    #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
Пятнашки на С
    #39410484
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
под отладчиком в функцию заходит?
ифы вылетают за массив. там наверное нужно сделать else if, так?

в последнем блоке можно сделать так return k==d*d-1 && board[d-1][d-1]==0
...
Рейтинг: 0 / 0
Пятнашки на С
    #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
Пятнашки на С
    #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
Пятнашки на С
    #39411184
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, тут же написано на С )) сори.
...
Рейтинг: 0 / 0
Пятнашки на С
    #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
Пятнашки на С
    #39414851
Alero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пётр Седов, мне бы хотелось написать нечто более универсальное и менее громоздкое:) конечно если моя задумка увенчается фиаско, то попробую проверить положение каждой плитки.
...
Рейтинг: 0 / 0
Пятнашки на С
    #39415118
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleroдаже когда счетчик вылетает за границы массива, то он и не учитывает их, т.е. я думал пусть себе вылетает, т.к. на подсчете не должно сказываться.Получение элемента массива по неправильному индексу -- это грубая ошибка. Вы скорее всего получите мусор, и то, что это не влияет на результат, -- чисто везение. Другие настройки компиляции, другой компилятор -- и везение быстро кончится.

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

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


См Сюда

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


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