С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Давид
Программист 1С
853 / 641 / 80
Регистрация: 03.03.2009
Сообщений: 1,148
#1

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

07.08.2014, 10:37. Просмотров 918. Ответов 8
Метки нет (Все метки)

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

Необходимо написать программу обхода конем всего шахматного поля - C++
Доброго времени суток! Необходимо написать программу обхода конем всего шахматного поля. Конь должен посещать каждую клетку только...

Сколько клеток находится под боем шахматного коня - C++
есть задача. http://acm.timus.ru/problem.aspx?space=1&num=1197 написал решение: #include <iostream> using namespace std; int...

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

Обход шахматной доски конем - C++
Добрый вечер , форумчане. Передо мной стоит проблема написать программу на С++ (задача о ходе конем -довольно распространенная , конь...

Обход доски шахматным конем - C++
решал задачу "Тур конем". : На шахматной доске размером n*n на поле с координатами x0,y0 находится конь - фигура , перемещающаяся по...

Создание шахматного поля - C++
Добрый вечер. Я пытаюсь написать простую игру шахматы в ООП, с графикой. Начала с создание доски и описания классов: поле(field) и клетки...

8
SatanaXIII
Супер-модератор
Эксперт С++
5642 / 2677 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
07.08.2014, 10:44 #2
Цитата Сообщение от Давид Посмотреть сообщение
Требуется перевести её в исполняемый файл командной строки!
Как это понять?

P.S. и вы бы указывали, что в архиве лежит проект шестого билдера, все таке. Сразу б по максимуму информации.
1
Давид
Программист 1С
853 / 641 / 80
Регистрация: 03.03.2009
Сообщений: 1,148
07.08.2014, 10:52  [ТС] #3
SatanaXIII, Виноват!!!
Вообщем мне нужно чтобы прога работала из командной строки. Форма, кнопки и т.д. не нужны.
0
SatanaXIII
Супер-модератор
Эксперт С++
5642 / 2677 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 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
Давид
Программист 1С
853 / 641 / 80
Регистрация: 03.03.2009
Сообщений: 1,148
07.08.2014, 12:11  [ТС] #5
Тема попрежнему актуальна.
Люди откликнитесь пожалуйста! Очень нужно...
0
SatanaXIII
Супер-модератор
Эксперт С++
5642 / 2677 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 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;
}
1
SatanaXIII
Супер-модератор
Эксперт С++
5642 / 2677 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
07.08.2014, 12:47 #7
Скомпилированный экзешник: Project1.rar
1
SatanaXIII
Супер-модератор
Эксперт С++
5642 / 2677 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
07.08.2014, 13:10 #8
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Результат разный.
Вот в чем оказывается дело:
C++
1
2
3
4
  //Возможно несколько ходов, но мы не можем определить какой из
  //них лучше. Поэтому выбираем ход случайным образом. При выборе
  //учитываем только лучшие ходы.
  int Ind = rand()%count;

Так что все там работает.
1
Давид
Программист 1С
853 / 641 / 80
Регистрация: 03.03.2009
Сообщений: 1,148
07.08.2014, 13:14  [ТС] #9
Спасибо за помощь. Очень помогли...
0
07.08.2014, 13:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2014, 13:14
Привет! Вот еще темы с ответами:

Определить цвет клетки шахматного поля - C++
Известно, что шахматная доска имеет размерность 8х8 и состоит из клеток 2х цветов(черного и белого). Каждая клетка имеет координату,...

Нужно написать обход шахматной доски конем. На одну позицию можно стать один раз. Обеспечить алгоритм бектрекингу - C++
Добрый вечер! очень прошу помогите реализовать программу на с \ с + +.

Определить цвет шахматного поля, заданного в стандардной нотации - C++
Задано шахматное поле в стандардной нотации. Определить его цвет. Вход a1 b3 h5 e7 Выход black

Добавить размеры в код "Обход конем" - C++
Господа,решила в новой теме попросить помощи.есть код #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #define size_row 10 #define size_col...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.