Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/68: Рейтинг темы: голосов - 68, средняя оценка - 4.56
6 / 6 / 1
Регистрация: 15.03.2009
Сообщений: 83

Определить все ходы для белой шашки.

02.10.2009, 19:58. Показов 13863. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На шашечном поле в произвольном порядке расставлены шашки. Для выбранной пользователем белой шашки определить все ее возможные ходы. Учесть, что за один шаг белая шашка может сбить несколько черных шашек.Нужно использовать рекурсию.
Вот сижу и думаю как эту рекурсию использовать и в каком месте.Что это такое я интуитивно догадываюсь,немного порылся в нете,но применить к данной задаче не могу.Может кто подскажет где и как или даст ссылку на инфу.Буду благодарен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.10.2009, 19:58
Ответы с готовыми решениями:

Определить все возможные ходы для следующих фигур
Даны исходная координата клетки (например, B6), где стоит фигура. Определить все возможные ходы для следующих фигур: 8.1. Конь 8.2....

Написать программу, определяющую возможность перемещения белой шашки
Абсолютно не понимаю эту задачу:Как известно, для игры в шашки можно использовать шахматную доску, в которой горизонтальные строки...

Определить все возможные ходы ферзя, с поворотом доски на 180 градусов
Здравствуйте! Задача состоит в следующем: дано поле 8*8, нужно определить все возможные ходы ферзя, с поворотом доски на 180 градусов....

8
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
02.10.2009, 23:08
Наверное если срубил черную шашку, то дальше можн рекурсивно вызвать туже процедуру чтобы она проверила - нельзя ли срубить еще одну шашку.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
03.10.2009, 10:41
Ну, слушай, такое дело раз.

Во-первых, создай матрицу 8x8 и как-то сыммитируй на ней шашки. Заполни то есть.
Вручную, ещё как-то.
Допустим, если элемент равен 1, это чёрная шашка, если 2, то белая, если 0- никакая.
И заполняяй по шашечным правилам.
Это уж ты сам думай как.

В программме будет две функции
1) основная (рекурсивная) osn
2) вспомогательная vsp

Вот схема

osn {
vsp ()
osn
}

Всомогательная функция будет показывать, куда шашке можно ходить (условимся, что она не дамка)
То есть каждая шашка может потенциально сделать 8 ходов
pramo_napravo_mal;
pramo_napravo_bol; //Это когда перепрыгивает
pramo_nalevo_mal;
pramo_nalevo_boll;
nazad_napravo_mal;
nazad_napravo_bol;
nazad_nalevo_mal;
nazad_nalevo_boll;

Теперь смотри. Если одна из этих величин равна 1, то шашка может туда ходить, если равна 0, то не может.
То, естть, к примеру, получаешь такие значения

pramo_napravo_mal==0;
pramo_napravo_bol==1; //Это когда перепрыгивает
pramo_nalevo_mal==0;
pramo_nalevo_boll==0;
nazad_napravo_mal==1;
nazad_napravo_bol==0;
nazad_nalevo_mal==0;
nazad_nalevo_boll==1;

...Как узнать, куда шашка может сходить, а куда нет?
Для этого существует vsp
В неё передаются указатели на эти переменные и координаты шашки.
Вот, собственно, и начинаются мытраства.
В функции vsp, принимающей указатели на эти переменные ты должен определить каждое из 8-ми значений, учитывая

1)координаты шашки
2)координаты других шашек (массив-то глобальный и виден отовсюду)
Это ты уж сам сиди и думай, как всё сделать
Схема будет так выглядеть с учётом вышесказанного:

osn {

bool pramo_napravo_mal==0;
bool pramo_napravo_bol==1; //Это когда перепрыгивает
bool pramo_nalevo_mal==0;
bool pramo_nalevo_boll==0;
bool nazad_napravo_mal==1;
bool nazad_napravo_bol==0;
bool nazad_nalevo_mal==0;
bool nazad_nalevo_boll==1;

vsp (&pramo_napravo_mal //+ адреса всех этих переменных + координаты шашки)

osn ()
}


Ну, и, наконец, по вызову osn
Вызываешь так

if (pramo_napravo_mal) {
osn ()
}

if (pramo_napravo_bol) {
osn ()
}

...И так далее, до конца. 8 вызовов должно быть
В функцию osn передаются координаты шашки, куда можно сходить.
То есть если у тебя текущие параметры (0, 1), и, допустим nazad_napravo_mal==1, то пишешь

if (nazad_napravo_mal) {
osn (2, 3)
}

...Ну вот так и прыгаешь, пока все параметры не станут равны 0.
Введи переменную какую-нибудь пусть ходы подсчитывет. Учитывай всё.

...Да. Самый первый вызов функции osn такой:
osn (координаты шашки)

Спрашивай, что непонятно!
1
6 / 6 / 1
Регистрация: 15.03.2009
Сообщений: 83
04.10.2009, 15:57  [ТС]
Что-то плохо понятно.Я сделал поле 8х8,сделал ввод координат шашек и сделал определение возможного хода(право лево,с учетом занятых клеток),но все без рекурсии и не могу пока сделать функцию(рекурсивную)
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
04.10.2009, 17:30
Бум учиться.
Давай сюда код с комментариями и внятно говори, в чём трудности.
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
05.10.2009, 02:35
Хакер, Все просто.Опиши функцию для одного хода,после чего добавь вызов ее для себя же в случае,если этот ход кого-то захавал.При этом,перед вызовом "убирай "съеденную шашку,ходящую шашку "перемещай"а после вызова возвращай съеденную и переместившуюся на изначальные позиции.

Получится,что рекурсия как бы раскатает какой-то вариант,каждый раз закатывая его обратно после того,как он рассмотрен,возвращаясь к исходной позиции и проверяя другие возможные ходы из текущей глубины перебора.
1
0 / 0 / 0
Регистрация: 01.06.2010
Сообщений: 3
01.06.2010, 23:30
Хакер, а не осталось работающей программы? был бы очень признателен...
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
03.06.2010, 15:42
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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
//На шашечном поле в произвольном порядке расставлены шашки. 
//Для выбранной пользователем белой шашки определить все ее возможные ходы. 
//Учесть, что за один шаг белая шашка может сбить несколько черных шашек.
//Нужно использовать рекурсию.
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
 
const int VERT_MIN_VAL = 'a';
const int VERT_MAX_VAL = 'h';
 
const int HORIS_MIN_VAL = '1';
const int HORIS_MAX_VAL = '8';
 
typedef std::string  T_str;
 
enum T_shashka_color
{
    VNE_DOSKI = 0,
    EMPTY,
    WHITE,
    BLACK    
};
 
enum T_napravl
{
    VLEVO,
    VPRAVO,
    NAZAD_VLEVO,
    NAZAD_VPRAVO
};
 
typedef std::map<char, T_shashka_color>  T_doska_vert;
typedef std::map<char, T_doska_vert>     T_shashka_colors;
 
struct T_kletka
{
    char  vert_; //От 'a' до 'h'.   
    char  horis_;//От '1' до '8'.
    
    T_kletka(char  vert = 0, char  horis = 0) : vert_(vert), horis_(horis)
    {}
 
    T_kletka(T_str  str_coord) 
        : vert_(str_coord[0]), horis_(str_coord[1])        
    {}
 
    T_kletka  get_next_1(T_napravl  napravl)
    {
        int  vert_shift   = 0;
        int  horis_shift  = 0;
 
        switch(napravl)
        {
        case VLEVO: 
            vert_shift   = -1;
            horis_shift  =  1;
            break;
        case VPRAVO: 
            vert_shift   = 1;
            horis_shift  = 1;
            break;
        case NAZAD_VLEVO: 
            vert_shift   = -1;
            horis_shift  = -1;
            break;
        case NAZAD_VPRAVO: 
            vert_shift   =  1;
            horis_shift  = -1;
            break;
        default:
            ;           
        }//switch(napravl)
        return T_kletka(vert_ + vert_shift, horis_ + horis_shift);
    }
};//struct T_kletka
 
void  print_kletka(T_kletka  kletka)
{        
    std::cout << kletka.vert_ << kletka.horis_ << ' ';   
}
 
typedef std::vector<T_kletka>  T_path;
 
class T_doska
{
    T_shashka_colors  shashka_colors;
public:
    T_doska()
    {
        for(char vert = VERT_MIN_VAL; vert <= VERT_MAX_VAL; ++vert)
        {
            for(char horis = HORIS_MIN_VAL; horis <= HORIS_MAX_VAL; ++horis)
            {
                shashka_colors[vert][horis] = EMPTY;
            }
        }
    }
 
    bool  is_emty_kletka(T_kletka  kletka)
    {
        return get_shashka_color_ref(kletka) == EMPTY;
    }
 
    void swap_colors
        (
            T_kletka  kletka1,
            T_kletka  kletka2
        )
    {
        T_shashka_color&  color1 = get_shashka_color_ref(kletka1);
        T_shashka_color&  color2 = get_shashka_color_ref(kletka2);
        std::swap(color1, color2);
    }
 
    bool  are_raznocvetn_shashki
        (
            T_kletka  kletka1,
            T_kletka  kletka2
        )
    {
        T_shashka_color  color1 = get_shashka_color_ref(kletka1);
        T_shashka_color  color2 = get_shashka_color_ref(kletka2);
        return    color1 == WHITE && color2 == BLACK
               || color1 == BLACK && color2 == WHITE;       
    }
 
    void  del_shashka(T_kletka  kletka)
    {
        get_shashka_color_ref(kletka) = EMPTY;
    }
 
    void  set_white_shashka(T_kletka  kletka)
    {
        get_shashka_color_ref(kletka) = WHITE;
    }
 
    void  set_black_shashka(T_kletka  kletka)
    {
        get_shashka_color_ref(kletka) = BLACK;
    }
private:
    T_shashka_color&  get_shashka_color_ref(T_kletka  kletka)
    {
        return shashka_colors[kletka.vert_][kletka.horis_];    
    }
};//class T_doska
 
struct T_shashka
{
    void xod
        (            
            T_kletka  kletka,
            T_doska   doska
        )
    {
        T_path  path;
        path.push_back(kletka);       
        xod(VLEVO,  path, doska);
        xod(VPRAVO, path, doska);      
        
        bit(VLEVO,        path, doska);
        bit(VPRAVO,       path, doska);
        bit(NAZAD_VLEVO,  path, doska);
        bit(NAZAD_VPRAVO, path, doska);        
    }
 
    void xod
        (
            T_napravl  napravl,
            T_path     path,
            T_doska    doska
        )
    {        
        T_kletka  cur_kletka   = path.back();
        T_kletka  next_kletka  = cur_kletka.get_next_1(napravl);
        if(doska.is_emty_kletka(next_kletka))
        {                        
            doska.swap_colors(cur_kletka, next_kletka);
            path.push_back(next_kletka);
            print_path(path);            
        }     
    }
 
    void  bit
        (
            T_napravl  napravl,            
            T_path     path,
            T_doska    doska
        )
    {        
        T_kletka  cur_kletka   = path.back();
        T_kletka  next_kletka1 = cur_kletka   .get_next_1(napravl);
        T_kletka  next_kletka2 = next_kletka1 .get_next_1(napravl);
 
        if(doska.are_raznocvetn_shashki(cur_kletka, next_kletka1)
           && doska.is_emty_kletka(next_kletka2))
        {
            doska.swap_colors(cur_kletka, next_kletka2);            
            doska.del_shashka(next_kletka1);         
            path.push_back(next_kletka2);
 
            bit(VLEVO,        path, doska);
            bit(VPRAVO,       path, doska);
            bit(NAZAD_VLEVO,  path, doska);
            bit(NAZAD_VPRAVO, path, doska);
            print_path(path);                           
        }        
    }
 
    void  print_path(const T_path&  path)
    {
        static int xod_count = 0;
        std::cout << "ход " << ++xod_count << ":   ";
        std::for_each(path.begin(), path.end(), print_kletka);
        std::cout << std::endl;    
    }
};//struct T_shashka
 
bool is_correct_str_coord(T_str  str_coord)
{
     return    VERT_MIN_VAL <= str_coord[0]  && str_coord[0] <= VERT_MAX_VAL
            && HORIS_MIN_VAL <= str_coord[1] && str_coord[1] <= HORIS_MAX_VAL;   
}
 
int main()
{   
    std::locale::global(std::locale("rus"));   
    std::cout << "Введите координаты шашек в виде a1, c3, f8 и т.д. "
              << std::endl
              << "Окончание ввода - пустая строка."
              << std::endl;
 
    T_doska  doska;    
    T_str    bel_xodit_str_coord;
    for(;;)
    {
        std::cout << "Координаты белой шашки, делающей ход: ";        
        getline(std::cin, bel_xodit_str_coord);    
        if(bel_xodit_str_coord.empty()) return 0;
        if(is_correct_str_coord(bel_xodit_str_coord))
        {           
            doska.set_white_shashka(bel_xodit_str_coord);
            break;
        }
    }
 
    for(int vvodim_chernye = 0; vvodim_chernye < 2; ++vvodim_chernye)
    {
         std::cout << std::endl
                  << "Введите координаты "
                  << (vvodim_chernye ? "черных" : "белых")
                  << " шашек: "
                  << std::endl;        
 
        for(int i = 1;;)
        {
            std::cout << (vvodim_chernye ? "черная " : "белая ")
                      << i
                      << ": ";
            
            T_str  cur_shash_str_coord;
            getline(std::cin, cur_shash_str_coord);
            if(cur_shash_str_coord.empty()) break;        
            if(is_correct_str_coord(cur_shash_str_coord))
            {        
                vvodim_chernye ? doska.set_black_shashka(cur_shash_str_coord)
                               : doska.set_white_shashka(cur_shash_str_coord);
                ++i;
            }        
        }   
    }//for(bool vvodim_chernye = false; vvodim_chernye <= true; ++vvodim_chernye)
 
    std::cout << std::endl;
    T_shashka  bel_xodit_shash;    
    bel_xodit_shash.xod(bel_xodit_str_coord, doska);  
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 16.02.2017
Сообщений: 3
27.02.2017, 17:50
Mr.X, попыталась запустить, а там пишет: Runtime Error
Не подскажете ,как исправить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.02.2017, 17:50
Помогаю со студенческими работами здесь

Вывести все возможные ходы шахматного коня из данной позиции, для трехмерной шахматной доски 8*8*8
Sub asd() Dim x As Integer, y As Integer, xx As Integer, yy As Integer, s As String Do x = InputBox(&quot;x&quot;) Loop While x &lt; 1 Or x &gt;...

Вычислить все возможные ходы коня
в шахматах задать начальные координаты клетки(х,у) и вычислить все возможные ходы коня из этой клетки(8шт).. вывестим все точки через...

Вывести все возможные ходы коня
Ребят есть задача,а именно ввести в интуп значение в формате &quot;d4&quot; а на выходе при нажатии на баттон вывести все возможные ходы коня через...

Вычислить все возможные ходы ферзём
вычислить все возможные ходы ферзём

Определить, находится ли черная шашка под боем белой
Помогите организовать задачу в Delphi. Белая шашка расположена на поле (х, n). Черная шашка расположена на поле (y, m). Находится черная...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru