Форум программистов, компьютерный форум CyberForum.ru

Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. - C++

Восстановить пароль Регистрация
 
Давид
Программист 1С
 Аватар для Давид
853 / 708 / 80
Регистрация: 03.03.2009
Сообщений: 1,147
07.08.2014, 10:37     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. #1
Приветствую друзья!Прошу помощи у экспертов, т.к. ООП почти не изучал.
Дана программа с исходниками и исполняемым файлом, рабочая, но с объектами на форме.
Требуется перевести её в исполняемый файл командной строки!
Задание и файлы во вложении. Заранее спасибо...
Вложения
Тип файла: rar Программа.rar (2.59 Мб, 24 просмотров)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2014, 10:37     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля.
Посмотрите здесь:

C++ Обход доски шахматным конем
Обход шахматной доски конем C++
Нужно написать обход шахматной доски конем. На одну позицию можно стать один раз. Обеспечить алгоритм бектрекингу C++
C++ Добавить размеры в код "Обход конем"
C++ консольное приложение (при запуске приложение открывалось на весь экран)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
07.08.2014, 10:44     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. #2
Цитата Сообщение от Давид Посмотреть сообщение
Требуется перевести её в исполняемый файл командной строки!
Как это понять?

P.S. и вы бы указывали, что в архиве лежит проект шестого билдера, все таке. Сразу б по максимуму информации.
Давид
Программист 1С
 Аватар для Давид
853 / 708 / 80
Регистрация: 03.03.2009
Сообщений: 1,147
07.08.2014, 10:52  [ТС]     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. #3
SatanaXIII, Виноват!!!
Вообщем мне нужно чтобы прога работала из командной строки. Форма, кнопки и т.д. не нужны.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
07.08.2014, 11:03     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. #4
Давид, понятно.

С вашего позволения вытащу код, чтобы можно было не скачивать проект кому лень:
Функциональная часть проекта
.h
C++
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
41
private:    // User declarations
   //массив для храмения информации о посещенных клетках
   int board[8][8];
 
   //эти массивы используются для расчета новых координат коня
   //они указывают перемещение по горизонтали и вертикали
   int horizontal[8];
   int vertical[8];
 
   //текущие координаты
   int currentRow;
   int currentColumn;
 
   //этот массив нужен для выбора следующего хода
   int accessibility[8][8];
   int firstMove[8];
 
   /*
   Эта функция выполняет очередной ход. Текущие координаты передаются
   по ссылке (таким образом, функция их может изменить).
   Numb - код хода (используестя как индекс для массивов vertical и
   horizontal).
   cnt - счетчик, содержит номер очередного хода.
   */
   void move(int board[][8], int vertical[], int horizontal[],
       int &currentRow, int &currentColumn, int Numb, int cnt);
 
   /*
   Эта функция выбирает очередной ход и возвращает его код. Если
   сделать ход нельзя, то функция возвращает "-1".
   crRow и crColumn - текущие координаты коня.
   */
   int FindMove(int board[][8], int accessibility[][8],
       int vertical[], int horizontal[], int crRow, int crColumn);
 
   /*
   При выполнении очередного хода эта функция уменьшает значения
   соответствующих элементов массива accessibility на 1.
   */
   void DecAccessibility(int accessibility[][8],int horizontal[],
       int vertical[], int crRow, int crColumn);
.cpp
C++
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //установка начальных значений элементов массивов
  int board[][8] = {{0},{0},{0},{0},{0},{0},{0},{0}};
  int horizontal[] = {2, 1, -1, -2, -2, -1, 1, 2};
  int vertical[] = {-1, -2, -2, -1, 1, 2, 2, 1};
  int accessibility[][8] = {{2,3,4,4,4,4,3,2},
                            {3,4,6,6,6,6,4,3},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {3,4,6,6,6,6,4,3},
                            {2,3,4,4,4,4,3,2}};
  //инициализация генератора случайных чисел
  srand(time(NULL));
 
  bool Go = true; //признак того, что можно начинать ходить
  try
   {
     //установка начальных значений
     currentRow = StrToInt(Edit2->Text);
     currentColumn = StrToInt(Edit1->Text);
     //проверка допустимости начальных значений
     if(currentRow>7 || currentRow<0 || currentColumn>7 ||
                                        currentColumn<0)
      {
       //сообщение об ошибке
       Application->MessageBoxA("Вы должны ввести цифру от 0 до 7",
                               "Ошибка", MB_OK);
       Go = false;
      }
   }
  catch(...)
   {
     Application->MessageBoxA("Вы должны ввести цифру от 0 до 7",
     "Ошибка", MB_OK);
     Go = false;
   }
  //начинаем искать решение
  if(Go)
   {
    //устанавливаем коня на заданную клетку
    DecAccessibility(accessibility, horizontal, vertical,
                              currentRow, currentColumn);
    board[currentRow][currentColumn] = 1;
    StringGrid1->Cells[currentColumn][currentRow] = IntToStr(1);
 
    int MoveNumber; //код хода
    int count = 1; //счетчик ходов
    bool exit = true; //нужна для выхода из цикла
 
    //перемещаем коня пока это возможно
    do
     {
       MoveNumber = FindMove(board, accessibility, vertical,
                     horizontal, currentRow, currentColumn);
       if (MoveNumber !=-1)
        {
          count++;
          move(board, vertical, horizontal, currentRow,
                     currentColumn, MoveNumber, count);
          DecAccessibility(accessibility, vertical, horizontal,
                                    currentRow, currentColumn);
        }
       else exit = false;
     }
    while(exit);
   }
}
//---------------------------------------------------------------------------
void TForm1::move(int board[][8], int vertical[], int horizontal[],
          int &currentRow, int &currentColumn, int Numb, int cnt)
{
  //изменяем текущие координаты
  currentRow += vertical[Numb];
  currentColumn += horizontal[Numb];
  //запоминаем, что на этой клетке мыуже были
  board[currentRow][currentColumn] = 1;
  //выводим номер хода в StringGrid
  StringGrid1->Cells[currentColumn][currentRow] = IntToStr(cnt);
}
//---------------------------------------------------------------------------
void TForm1::DecAccessibility(int accessibility[][8],int horizontal[],
                       int vertical[], int crRow, int crColumn)
{
  int Hmove, Vmove; //координаты клеток, лежащих в одном ходу от текущей
 
  //перебираем все возможные варианты ходов и уменьшаем на 1 значения
  //соответствующих элементов массива accessibility
  for(int i=0; i<8; i++)
   {
     Hmove = crRow + vertical[i];
     Vmove = crColumn + horizontal[i];
     //проверка выхода за границу массива
     if((Hmove<8)&&(Hmove>=0)&&(Vmove<8)&&(Vmove>=0))
       accessibility[Hmove][Vmove] -= 1;
   }
}
//---------------------------------------------------------------------------
int TForm1::FindMove(int board[][8], int accessibility[][8],
       int vertical[], int horizontal[], int crRow, int crColumn)
{
  //Индексы элементов этого массива соответствуют кодам возможных ходов.
  //Элементы массива будут содержать "-1" если ход невозможен или
  //число равное значению соответствующего элемента массива accessibility
  int PossibleMoves[8] = {-1,-1,-1,-1,-1,-1,-1,-1};
 
  int tRow, tColumn; //временные координаты
 
  //проверяем все возможные варианты ходов
  for(int i=0; i<8; i++)
   {
    tRow = crRow + vertical[i];
    tColumn = crColumn + horizontal[i];
    //проверка выхода за границу массива и того, ходили ли мы на
    //эту клетку раньше
    if(tRow<8 && tRow>=0 && tColumn<8 &&tColumn>=0 &&
                             board[tRow][tColumn]==0)
      PossibleMoves[i] = accessibility[tRow][tColumn];
   }
 
  //анализ массива PossibleMoves
  int count = 0;
  int min = 8;
  int Pos = 0;
  //находим минимальный элемент массива не равный "-1", если таких
  //элементов несколько - запоминаем их количество
  for(int j=0; j<8; j++)
   if(PossibleMoves[j]!=-1 && PossibleMoves[j]<=min)
    {
     min = PossibleMoves[j];
     count++;
     Pos = j;
    }
 
  //возможных ходов нет
  if(count==0) return -1;
 
  //возможен только 1 ход (или он оптимальный)
  if(count==1) return Pos;
 
  //Возможно несколько ходов, но мы не можем определить какой из
  //них лучше. Поэтому выбираем ход случайным образом. При выборе
  //учитываем только лучшие ходы.
  int Ind = rand()%count;
  for(int k=0; k<8; k++)
    if(PossibleMoves[k]==min && Ind==0)
      {
       Pos = k;
       break;
      }
    else Ind--;
  return Pos;
}
Давид
Программист 1С
 Аватар для Давид
853 / 708 / 80
Регистрация: 03.03.2009
Сообщений: 1,147
07.08.2014, 12:11  [ТС]     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. #5
Тема попрежнему актуальна.
Люди откликнитесь пожалуйста! Очень нужно...
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
07.08.2014, 12:32     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Давид, а приложенный в архиве экзешник точно собран именно на том коде, который в проекте? Ничего в проекте не менялось потом?
Если нет, то я значит криво перевел. Результат разный.
Кликните здесь для просмотра всего текста
C++
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#pragma hdrstop
#pragma argsused
 
#include <tchar.h>
#include <stdio.h>
#include <iomanip>
#include <iostream>
using namespace std;
 
// Всякая глобальная фигня сюда переехала
 
   int PseudoStringGrid[8][8]; // Заместо StringGrid
 
 
   //массив для храмения информации о посещенных клетках
   int board[8][8];
 
   //эти массивы используются для расчета новых координат коня
   //они указывают перемещение по горизонтали и вертикали
   int horizontal[8];
   int vertical[8];
 
   //текущие координаты
   int currentRow;
   int currentColumn;
 
   //этот массив нужен для выбора следующего хода
   int accessibility[8][8];
   int firstMove[8];
 
   /*Эта функция выполняет очередной ход. Текущие координаты передаются
   по ссылке (таким образом, функция их может изменить).
   Numb - код хода (используестя как индекс для массивов vertical и
   horizontal).
   cnt - счетчик, содержит номер очередного хода.*/
   void move( int board[][8], int vertical[], int horizontal[],
              int &currentRow, int &currentColumn, int Numb, int cnt );
 
   /*Эта функция выбирает очередной ход и возвращает его код. Если
   сделать ход нельзя, то функция возвращает "-1".
   crRow и crColumn - текущие координаты коня.*/
   int FindMove( int board[][8], int accessibility[][8],
                 int vertical[], int horizontal[], int crRow, int crColumn );
 
   /*При выполнении очередного хода эта функция уменьшает значения
   соответствующих элементов массива accessibility на 1.*/
   void DecAccessibility( int accessibility[][8],int horizontal[],
                          int vertical[], int crRow, int crColumn );
 
   void move(int board[][8], int vertical[], int horizontal[],               //// Бывшие методы формы
             int &currentRow, int &currentColumn, int Numb, int cnt);          //
   void DecAccessibility(int accessibility[][8],int horizontal[],              //
                         int vertical[], int crRow, int crColumn);             //
   int FindMove(int board[][8], int accessibility[][8],                        //
                int vertical[], int horizontal[], int crRow, int crColumn);  ////
 
 
int main()
{
//void __fastcall TForm1::Button1Click(TObject *Sender)
//{
  //установка начальных значений элементов массивов
  int board[][8] = {{0},{0},{0},{0},{0},{0},{0},{0}};
  int horizontal[] = {2, 1, -1, -2, -2, -1, 1, 2};
  int vertical[] = {-1, -2, -2, -1, 1, 2, 2, 1};
  int accessibility[][8] = {{2,3,4,4,4,4,3,2},
                            {3,4,6,6,6,6,4,3},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {3,4,6,6,6,6,4,3},
                            {2,3,4,4,4,4,3,2}};
  //инициализация генератора случайных чисел
  srand(time(NULL));
 
  bool Go = true; //признак того, что можно начинать ходить
  try
   {
     //установка начальных значений
     cout << "x: ";
     cin >> currentRow;// = StrToInt(Edit2->Text);
     cout << "y: ";
     cin >> currentColumn;// = StrToInt(Edit1->Text);
     cout << endl;
     //проверка допустимости начальных значений
     if(currentRow>7 || currentRow<0 || currentColumn>7 ||
                                        currentColumn<0)
      {
       //сообщение об ошибке
       cout << "Вы должны ввести цифру от 0 до 7";
       Go = false;
      }
   }
  catch(...)
   {
     cout << "Вы должны ввести цифру от 0 до 7";
     Go = false;
   }
  //начинаем искать решение
  if(Go)
   {
    //устанавливаем коня на заданную клетку
    DecAccessibility(accessibility, horizontal, vertical,
                              currentRow, currentColumn);
    board[currentRow][currentColumn] = 1;
    //StringGrid1->Cells[currentColumn][currentRow] = IntToStr(1);
    PseudoStringGrid[currentRow][currentColumn] = 1;
 
    int MoveNumber; //код хода
    int count = 1; //счетчик ходов
    bool exit = true; //нужна для выхода из цикла
 
    //перемещаем коня пока это возможно
    do
     {
       MoveNumber = FindMove(board, accessibility, vertical,
                     horizontal, currentRow, currentColumn);
       if (MoveNumber !=-1)
        {
          count++;
          move(board, vertical, horizontal, currentRow,
                     currentColumn, MoveNumber, count);
          DecAccessibility(accessibility, vertical, horizontal,
                                    currentRow, currentColumn);
        }
       else exit = false;
     }
    while(exit);
   }
 
   // Вывод в консоль результатов
   for( int i=0; i<8; i++ )
     {
     for( int j=0; j<8; j++ )
       {
       cout.width(3);
       cout << PseudoStringGrid[i][j];
       }
     cout << endl;
     }
 
cin.ignore(2);
return 0;
}
//---------------------------------------------------------------------------
void move(int board[][8], int vertical[], int horizontal[],
          int &currentRow, int &currentColumn, int Numb, int cnt)
{
  //изменяем текущие координаты
  currentRow += vertical[Numb];
  currentColumn += horizontal[Numb];
  //запоминаем, что на этой клетке мыуже были
  board[currentRow][currentColumn] = 1;
  //выводим номер хода в StringGrid
  //StringGrid1->Cells[currentColumn][currentRow] = IntToStr(cnt);
  PseudoStringGrid[currentRow][currentColumn] = cnt;
}
//---------------------------------------------------------------------------
void DecAccessibility(int accessibility[][8],int horizontal[],
                      int vertical[], int crRow, int crColumn)
{
  int Hmove, Vmove; //координаты клеток, лежащих в одном ходу от текущей
 
  //перебираем все возможные варианты ходов и уменьшаем на 1 значения
  //соответствующих элементов массива accessibility
  for(int i=0; i<8; i++)
   {
     Hmove = crRow + vertical[i];
     Vmove = crColumn + horizontal[i];
     //проверка выхода за границу массива
     if((Hmove<8)&&(Hmove>=0)&&(Vmove<8)&&(Vmove>=0))
       accessibility[Hmove][Vmove] -= 1;
   }
}
//---------------------------------------------------------------------------
int FindMove(int board[][8], int accessibility[][8],
             int vertical[], int horizontal[], int crRow, int crColumn)
{
  //Индексы элементов этого массива соответствуют кодам возможных ходов.
  //Элементы массива будут содержать "-1" если ход невозможен или
  //число равное значению соответствующего элемента массива accessibility
  int PossibleMoves[8] = {-1,-1,-1,-1,-1,-1,-1,-1};
 
  int tRow, tColumn; //временные координаты
 
  //проверяем все возможные варианты ходов
  for(int i=0; i<8; i++)
   {
    tRow = crRow + vertical[i];
    tColumn = crColumn + horizontal[i];
    //проверка выхода за границу массива и того, ходили ли мы на
    //эту клетку раньше
    if(tRow<8 && tRow>=0 && tColumn<8 &&tColumn>=0 &&
                             board[tRow][tColumn]==0)
      PossibleMoves[i] = accessibility[tRow][tColumn];
   }
 
  //анализ массива PossibleMoves
  int count = 0;
  int min = 8;
  int Pos = 0;
  //находим минимальный элемент массива не равный "-1", если таких
  //элементов несколько - запоминаем их количество
  for(int j=0; j<8; j++)
   if(PossibleMoves[j]!=-1 && PossibleMoves[j]<=min)
    {
     min = PossibleMoves[j];
     count++;
     Pos = j;
    }
 
  //возможных ходов нет
  if(count==0) return -1;
 
  //возможен только 1 ход (или он оптимальный)
  if(count==1) return Pos;
 
  //Возможно несколько ходов, но мы не можем определить какой из
  //них лучше. Поэтому выбираем ход случайным образом. При выборе
  //учитываем только лучшие ходы.
  int Ind = rand()%count;
  for(int k=0; k<8; k++)
    if(PossibleMoves[k]==min && Ind==0)
      {
       Pos = k;
       break;
      }
    else Ind--;
  return Pos;
}
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
07.08.2014, 12:47     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. #7
Скомпилированный экзешник: Project1.rar
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
07.08.2014, 13:10     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. #8
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Результат разный.
Вот в чем оказывается дело:
C++
1
2
3
4
  //Возможно несколько ходов, но мы не можем определить какой из
  //них лучше. Поэтому выбираем ход случайным образом. При выборе
  //учитываем только лучшие ходы.
  int Ind = rand()%count;

Так что все там работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2014, 13:14     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля.
Еще ссылки по теме:

C++ Сколько клеток находится под боем шахматного коня
Создание шахматного поля C++
C++ Необходимо написать программу обхода конем всего шахматного поля

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Давид
Программист 1С
 Аватар для Давид
853 / 708 / 80
Регистрация: 03.03.2009
Сообщений: 1,147
07.08.2014, 13:14  [ТС]     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. #9
Спасибо за помощь. Очень помогли...
Yandex
Объявления
07.08.2014, 13:14     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля.
Ответ Создать тему
Опции темы

Текущее время: 22:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru