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

Замена фигур на шахматной доске - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 09:51     Замена фигур на шахматной доске #1
задача. расставить случайным образом четырех коней на шахматной доске (два белых и два черных). вывести отдельно список полей под боем каждого из коней, список полей под боем нескольких (указать каких именно), и полей не под боем ни одного из четырех.

Добавлено через 9 часов 7 минут
слабо? это, конечно, не диагональ симметричной матрицы вывести...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 09:51     Замена фигур на шахматной доске
Посмотрите здесь:

C++ Числа на шахматной доске в С++
Числа на шахматной доске C++
C++ Числа на шахматной доске
C++ Одного ли цвета клетки на шахматной доске?
C++ Расставить n ладей на шахматной доске n*n
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
09.08.2012, 10:36     Замена фигур на шахматной доске #2
А что собственно, не получается?
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
09.08.2012, 10:56     Замена фигур на шахматной доске #3
Ну и причём тут С++?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 10:57  [ТС]     Замена фигур на шахматной доске #4
как это сделать на с++. так на доске я расставляю и понимаю, какие поля у какого коня под боем. и на бумажке списки могу записать. а дальше - никак. какие классы нужны, какие поля, ф-ии...
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
09.08.2012, 11:23     Замена фигур на шахматной доске #5
Цитата Сообщение от novi4ok Посмотреть сообщение
как это сделать на с++. так на доске я расставляю и понимаю, какие поля у какого коня под боем. и на бумажке списки могу записать. а дальше - никак. какие классы нужны, какие поля, ф-ии...
ну навскидку создаешь структуру типа

|
C++
1
2
3
4
5
6
struct pole{
 int Kon1;
 int Kon2;
 int Kon3;
 int Kon4;
};
дальше делаешь двухмерный массив типа pole, пробегаешься по нему расставляешь битые поля, каждому коню в свою переменню в структуре, а дальше уже делай все остальные необходимые манипуляции
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 11:25  [ТС]     Замена фигур на шахматной доске #6
Цитата Сообщение от Aloir Посмотреть сообщение
ну навскидку создаешь структуру типа

|
C++
1
2
3
4
5
6
struct pole{
 int Kon1;
 int Kon2;
 int Kon3;
 int Kon4;
};
дальше делаешь двухмерный массив типа pole, пробегаешься по нему расставляешь битые поля, каждому коню в свою переменню в структуре, а дальше уже делай все остальные необходимые манипуляции
а конь?
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
09.08.2012, 11:31     Замена фигур на шахматной доске #7
Цитата Сообщение от novi4ok Посмотреть сообщение
а конь?
что конь?

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

после ввода всех коней бежишь по полю, расставляешь битки, и считаешь что тебе нужно.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 17:12  [ТС]     Замена фигур на шахматной доске #8
ну да, "задней левой" ... ж
yleart
 Аватар для yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
09.08.2012, 17:41     Замена фигур на шахматной доске #9
Создаешь нулевую матрицу 8x8. Ставишь единицы - это кони. Потом пишешь 8 функции вероятных ходов коня, которые возвращают true если конь под боем какого либо... Ну вот и все xD
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 22:34  [ТС]     Замена фигур на шахматной доске #10
а конь? вообще без коня, только единицы? а как потом списки строить - вот "иду" я по этой матрице (шесть раз нужно пройти, наверное?), и что? вот "пришел" на клетку матрицы, она в списке? выводить ее?

Добавлено через 57 секунд
и никто ни строчки кода не предложил, только какая-то структура. "клуб четырех коней" какой-то.

Не по теме:

столица переезжает в васюки.

defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
09.08.2012, 22:45     Замена фигур на шахматной доске #11
Цитата Сообщение от novi4ok Посмотреть сообщение
и никто ни строчки кода не предложил, только какая-то структура. "клуб четырех коней" какой-то.
А вы попробуйте себя повежливее вести.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,722
Записей в блоге: 3
09.08.2012, 23:00     Замена фигур на шахматной доске #12
Цитата Сообщение от novi4ok Посмотреть сообщение
на доске я расставляю и понимаю, какие поля у какого коня под боем. и на бумажке списки могу записать. а дальше - никак.
Я понимаю, так: чем проще рассуждения тем легче рассуждать. У коня есть координаты. Что значит битое поле? Это поле куда возможен ход (неучитывая какой фигурой оно занято, тут решите сами, кстати если стоит дружеский конь то под боем ли он находится?)
Далее каждое такое поле по осям (четыре направления) определяется смещением на 2 позиции прямо (по x например) и одну позицию в сторону (по другой координате, для x это y). При проверке координат поля нужно проверить не вышли ли за пределы шахматного поля 8Х8 и возможно на наличие дружественного коня (если решите, что друзей не бьют)).
ps Для коня в центре доски - 4 направления двойного сдвига, по два одинарных сдвига в каждом, то есть 8 битых полей.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 23:45  [ТС]     Замена фигур на шахматной доске #13

Не по теме:

Цитата Сообщение от defer Посмотреть сообщение
А вы попробуйте себя повежливее вести.
вежливо - это когда взрослым дядям не делают замечаний. в крайнем случае проходят мимо, надув губки.



Добавлено через 5 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я понимаю, так: чем проще рассуждения тем легче рассуждать. У коня есть координаты. Что значит битое поле? Это поле куда возможен ход (неучитывая какой фигурой оно занято, тут решите сами, кстати если стоит дружеский конь то под боем ли он находится?)
Далее каждое такое поле по осям (четыре направления) определяется смещением на 2 позиции прямо (по x например) и одну позицию в сторону (по другой координате, для x это y). При проверке координат поля нужно проверить не вышли ли за пределы шахматного поля 8Х8 и возможно на наличие дружественного коня (если решите, что друзей не бьют)).
ps Для коня в центре доски - 4 направления двойного сдвига, по два одинарных сдвига в каждом, то есть 8 битых полей.
понимаешь, я не хочу думать ни о битах, ни о клетках, пока не решу проблему дизайна. мы ведь с++ имеем. значит, классы можем создавать, которые что-то будут уметь. напрашивается пока участники "доска", "конь", "список" (или "генератор отчетов"? или и то и другое?). тогда уже и нолики по клеточкам можно раскладывать. но если сразу полезу рисовать матрицы с четырьмя единичками, запутяюсь. напишу, конечно, и так, но тогда самому нужно становиться конем, и через пару часов уже перестану понимать, как оно все работает. хороший (удачный) дизайн даже в такой примитивной задаче упрощает работу.

принимаются предложения по улучшению моего наброска списка участников.
rinat_w
89 / 85 / 4
Регистрация: 13.11.2011
Сообщений: 183
10.08.2012, 01:28     Замена фигур на шахматной доске #14
novi4ok,
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
#include<iostream>
#include<ctime>
using namespace std;
bool is_under_attack(int a1, int x1, int a2, int x2){
     int check=abs(a1-a2)*10+abs(x1-x2);
     if (check==12 || check==21) return true;
     return false;
}
int main(){
    // создаем, инициализируем и отображаем координаты четырех коней
    srand(time(0));
    int horse[4][2];
    for (int i=0; i<8; i++){
        horse[i/2][i%2]=rand()%8+1;
        if (i%2==1) cout<<i/2+1<<" horse : "<<(char)(horse[i/2][0]+64)<<horse[i/2][1]<<endl;
    }
    
    cout<<"\n1 list : "; // список полей под боем каждого из коней
    for (int i=1; i<=4; i++){
        cout<<"\n\t"<<i<<" horse : ";
        for (int x=1; x<=8; x++)
            for (int y=1; y<=8; y++)
                if (is_under_attack(x,y,horse[i-1][0],horse[i-1][1])) cout<<(char)(x+64)<<y<<" ";
    }
    
    cout<<"\n\n2 list : \n"; // список полей под боем нескольких коней
    for (int x=1; x<=8; x++)
        for (int y=1; y<=8; y++){
            string result="";
            int count=0;
            for (int i=1; i<=4; i++)
                if (is_under_attack(x,y,horse[i-1][0],horse[i-1][1])){
                   count++;
                   result+=(char)(i+48);
                   result+=" ";
                }
            if (count>1) cout<<"\t"<<(char)(x+64)<<y<<" : "<<result<<endl;
        }
    
    cout<<"\n3 list : "; // поля не под боем
    for (int x=1; x<=8; x++)
        for (int y=1; y<=8; y++){
            int count=0;
            for (int i=1; i<=4; i++)
                if (is_under_attack(x,y,horse[i-1][0],horse[i-1][1])) count++;
            if (count==0) cout<<(char)(x+64)<<y<<" ";
        }
    
    cout<<"\n\n"; system("pause");
    return 0;
}
Миниатюры
Замена фигур на шахматной доске  
Aloir
13.08.2012, 02:35
  #15

Не по теме:


просто не там ответил)

IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,722
Записей в блоге: 3
13.08.2012, 03:07     Замена фигур на шахматной доске #16
Цитата Сообщение от novi4ok Посмотреть сообщение
напрашивается пока участники "доска", "конь", "список" (или "генератор отчетов"? или и то и другое?).
Можно сделать шахматное поле - клетка
хранит свою координату, указатели на бьющие фигуры, указатель на размещенную в нем фигуру.(указатели могут быть нулевыми).
фигура - хранит масть (цвет) координату, умеет возвращать список битых полей.
Доска (позиция) хранит список всех полей, фигур, умеет инициализировать поля, принимать запросы на перемещение фигуры и делать ход.
Отчеты генерирует внешняя ф-ция опрашивающая поля доски.
Всего то нового, - класс шахматная клетка (поле).
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
13.08.2012, 03:34     Замена фигур на шахматной доске #17
Цитата Сообщение от IGPIGP Посмотреть сообщение
Можно сделать шахматное поле - клетка
хранит свою координату, указатели на бьющие фигуры, указатель на размещенную в нем фигуру.(указатели могут быть нулевыми).
фигура - хранит масть (цвет) координату, умеет возвращать список битых полей.
Доска (позиция) хранит список всех полей, фигур, умеет инициализировать поля, принимать запросы на перемещение фигуры и делать ход.
Отчеты генерирует внешняя ф-ция опрашивающая поля доски.
Всего то нового, - класс шахматная клетка (поле).
Вы бы это в коде выложили, а словесных описаний в теме и так достаточно
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
13.08.2012, 20:11     Замена фигур на шахматной доске #18
Цитата Сообщение от defer Посмотреть сообщение
Вы бы это в коде выложили, а словесных описаний в теме и так достаточно
Вы так рассуждаете как будто, мы обязаны вам предоставить решение данной задачи.

попробуйте выложить свой пример кода, или хотя бы набросок, а мы вас подправим.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 20:50     Замена фигур на шахматной доске
Еще ссылки по теме:

Ход на шахматной доске C++
C++ Задача о зернах на шахматной доске
C++ Геометрическая прогрессия на шахматной доске

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

Или воспользуйтесь поиском по форуму:
SubTerran
8 / 8 / 0
Регистрация: 13.08.2012
Сообщений: 18
13.08.2012, 20:50     Замена фигур на шахматной доске #19
Библиотека: Matrix.h
http://www.stroustrup.com/Programming/Matrix/Matrix.h

Библиотека: MatrixIO.h
http://www.stroustrup.com/Programming/Matrix/MatrixIO.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
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
//
// 
// 
//
 
#include<iostream>
#include<fstream>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<string>
#include<list>
#include<vector>
#include<algorithm>
#include<stdexcept>
#include "Matrix.h"
#include "MatrixIO.h"
 
using namespace Numeric_lib;
using namespace std;
 
//------------------------------------------------------------------------------
 
enum Horses { none, white, black, fight_w1, fight_w2, fight_b1, fight_b2 };
 
//------------------------------------------------------------------------------
 
struct One_cell
{
    One_cell(int aa, int bb, Horses h1, Horses h2) :a(aa), b(bb) 
    { oc.first = h1; oc.second = h2; }
    int a;
    int b;
    pair<Horses, Horses> oc;
};
 
//------------------------------------------------------------------------------
 
vector<One_cell> one_cell;
 
//------------------------------------------------------------------------------
 
void f(Matrix<Horses, 2>& mtrx, int i, int j)
{
    string s;
    int f;
    if (mtrx(i, j) == white)
    {
        static int i2 = i;
        static int j2 = j;
        int k = 1;
        if (i != i2 || j != j2)
            k = 2;
        if (k == 1)
            s = "w1";
        else
            s = "w2";
        cout << "Поля под боем " << k << " белого коня\n";
    }
    else if (mtrx(i, j) == black)
    {
        static int i2 = i;
        static int j2 = j;
        int k = 1;
        if (i != i2 || j != j2)
            k = 2;
        if (k == 1)
            s = "b1";
        else
            s = "b2";
        cout << "Поля под боем " << k << " черного коня\n";
    }
 
    if (s == "w1")
        f = 3;
    else if (s == "w2")
        f = 4;
    else if (s == "b1")
        f = 5;
    else if (s == "b2")
        f = 6;
 
    if (i > 1 && j < 7)
    {
        if (mtrx(i - 2, j + 1) != none)
            one_cell.push_back(One_cell(i - 2, j + 1, mtrx(i - 2, j + 1), Horses(f)));
        mtrx(i - 2, j + 1) = Horses(f);
        cout << '(' << i - 2 << ',' << j + 1 << ") ";
    }
    if (j < 7 && j < 6)
    {
        if (mtrx(i + 1, j + 2) != none)
            one_cell.push_back(One_cell(i + 1, j + 2, mtrx(i - 2, j + 1), Horses(f)));
        mtrx(i + 1, j + 2) = Horses(f);
        cout << '(' << i + 1 << ',' << j + 2 << ") ";
    }
    if (j != 0 && i < 6)
    {
        if (mtrx(i + 2, j - 1) != none)
            one_cell.push_back(One_cell(i + 2, j - 1, mtrx(i - 2, j + 1), Horses(f)));
        mtrx(i + 2, j - 1) = Horses(f);
        cout << '(' << i + 2 << ',' << j - 1 << ") ";
    }
    if (i != 0 && j > 1)
    {
        if (mtrx(i - 1, j - 2) != none)
            one_cell.push_back(One_cell(i - 1, j - 2, mtrx(i - 2, j + 1), Horses(f)));
        mtrx(i - 1, j - 2) = Horses(f);
        cout << '(' << i - 1 << ',' << j - 2 << ") ";
    }
    cout << '\n';
}
 
//------------------------------------------------------------------------------
 
inline void keep_window_open()
{
    cin.clear();
    cout << "Please enter a character to exit\n";
    char ch;
    cin >> ch;
    return;
}
 
//------------------------------------------------------------------------------
 
inline int randint(int max) { return rand()%max; }
 
//------------------------------------------------------------------------------
 
int main()
    try
{
    setlocale( LC_ALL, "Russian" );
 
    Matrix<Horses, 2> mtrx(8, 8);
 
    srand(8);
 
    int n = 0;
    int k = 0;
    int p = 0;
 
    while(p != 2)
    {
        n = randint(8);
        k = randint(8);
        if (mtrx(n, k) != white)
        {
            mtrx(n, k) = white;
            ++p;
        }
    }
 
    p = 0;
 
    while(p != 2)
    {
        n = randint(8);
        k = randint(8);
        if (mtrx(n, k) != white && 
            mtrx(n, k) != black)
        {
            mtrx(n, k) = black;
            ++p;
        }
    }
 
    cout << mtrx << '\n';
 
    for (Index i = 0; i < 8; ++i)
        for (Index j = 0; j < 8; ++j)
        {
            if (mtrx(i, j) == white)
                f(mtrx, i ,j);
            else if (mtrx(i, j) == black)
                f(mtrx, i, j);
        }
 
    cout << "Поля не под боем ни одного из четырех: \n";
 
    for (Index i = 0; i < 8; ++i)
        for (Index j = 0; j < 8; ++j)
            if (mtrx(i, j) == none)
                cout << '(' << i << ',' << j << ") ";
 
    if (one_cell.size())
    cout << "\nСписок полей под боем нескольких: \n";
 
    for (int i = 0; i < one_cell.size(); ++i)
    {
        cout << '\n';
        if (one_cell[i].oc.first != one_cell[i].oc.second)
        {
        switch(one_cell[i].oc.first)
        {
        case 3:
            cout << "Белый конь 1\n";
            break;
        case 4:
            cout << "Белый конь 2\n";
            break;
        case 5:
            cout << "Черный конь 1\n";
            break;
        case 6:
            cout << "Черный конь 2\n";
            break;
        }
        switch(one_cell[i].oc.second)
        {
        case 3:
            cout << "Белый конь 1\n";
            break;
        case 4:
            cout << "Белый конь 2\n";
            break;
        case 5:
            cout << "Черный конь 1\n";
            break;
        case 6:
            cout << "Черный конь 2\n";
            break;
        }
        cout << '(' << one_cell[i].a << ',' << one_cell[i].b << ") ";
        }
    }
 
    cout << '\n' << mtrx << '\n';
 
    keep_window_open();
    return 0;
}
catch (exception& e) {
    cerr << "error: " << e.what() << '\n'; 
    keep_window_open();
    return 1;
}
catch (...) {
    cerr << "Oops: unknown exception!\n"; 
    keep_window_open();
    return 2;
}
 
//------------------------------------------------------------------------------
Yandex
Объявления
13.08.2012, 20:50     Замена фигур на шахматной доске
Ответ Создать тему
Опции темы

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