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

C для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Konkin
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
#1

Шахматная доска: Проверить, есть ли угроза королю - C (СИ)

24.02.2011, 00:48. Просмотров 1990. Ответов 20
Метки нет (Все метки)

Формулировка. На шахматной доске стоят черный король и белые ладья и
слон (ладья бьет по горизонтали и вертикали, слон – по диагоналям).
Проверить, есть ли угроза королю и если есть, то от кого именно.
Позиция каждой шахматной фигуры задается в обычной нотации, например,
d7.

Формат входных данных: [вертикальная позиция короля] [пробел]
[горизонтальная позиция короля] [вертикальная позиция ладьи]
[горизонтальная позиция ладьи] [вертикальная позиция слона]
[горизонтальная позиция слона]. Пример: a1b2c3

Формат выходных данных: [вертикальная позиция той фигуры, которая бьет
короля] [горизонтальная позиция той фигуры, которая бьет короля]
[пробел] [вертикальная позиция той фигуры, которая бьет короля]
[горизонтальная позиция той фигуры, которая бьет короля]. Фигуры
выводятся в порядке их ввода. Если король не бьется ни одной фигурой,
то выдается no solution. Пример: b1 c3


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
// Chess 17.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <locale.h>
 
int main()
{
    setlocale(LC_ALL, "russian");
    int gkk, gks, gkl; // Горизонтальные координаты короля, слона и ладьи соответственно
    char vkk, vks, vkl; // Вертикальные координаты короля, слона и ладьи соответственно
    printf ("Пожалуйста введите координаты фигур\n"); //Ввод данных
    printf ("Горизонтальная координата короля: \n");
    scanf ("%d", &gkk);
    printf ("Вертикальная координата короля: \n");
  scanf ("%с", &vkk);   
    printf ("Координаты короля: %d%с\n",gkk,vkk);
    printf ("Горизонтальная координата ладьи: \n");
    scanf ("%d", &gkl);
    printf ("Вертикальная координата ладьи: \n");
    scanf ("%с", &vkl);
    printf ("Координаты ладьи: %d%с\n",gkl,vkl);
    printf ("Горизонтальная координата слона: \n");
    scanf ("%d", &gks);
    printf ("Вертикальная координата слона: \n");
    scanf ("%с", &vks);
    printf ("Координаты слона: %d%с\n",gks,vks);
    _getch ();
    return (0);
}
Подскажите пожалуйста почему такой вариант ввода данных не работает? Когда вводишь цифру в тип int, то все нормально. Но как только нужно вбить вторую координату фигуры и напечатать букву, то вылазит ошибка. При компиляции ошибок нет. Только при работе. Разве я не прав что тут нужен тип char для того чтобы задать координату буквой??
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2011, 00:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Шахматная доска: Проверить, есть ли угроза королю (C (СИ)):

Проверить, есть ли угроза королю и если есть, то от кого именно - Turbo Pascal
нуждаюсь в вашей помощи... На шахматной доске стоят черный король и белые ладья и слон (ладья бьет по горизонтали и вертикали, слон...

На шахматной доске стоят черный король и белые ладья и слон; есть ли угроза королю? - Delphi
Реализуйте приложение, отвечающее на вопрос задачи. - На шахматной доске стоят черный король и белые ладья и слон (слон бьет по ...

Подскажите как сократить: угроза королю - Turbo Pascal
uses crt; var x1,x2,y1,y2:integer; begin clrscr; writeln('размер доски 8х8'); write('введите координаты короля x1 y1= ');...

Шахматная доска - Pascal
Тема можно удалять!

Шахматная доска - Комбинаторика
Вычислить рекурсивно число расстановок N ладей на доске N*N таких, что ладьи симметричны относительно обеих диагоналей и не бьют друг...

Шахматная доска - Turbo Pascal
Как её реализовать в Паскале? Поле шахматной доски определяетс парой натуральных чисел,каждое из которых не превосходит 8:первое...

20
talis
793 / 545 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
26.02.2011, 18:59 #16
Хм, возможно, вам стоит посмотреть в сторону трассировки. Смысл в чём:

1) Допустим, ладья на (4, 7).
// Трассировка вверх
2) Идём на клетку выше.
3) Если на этой клетке - король, то шах. Идти к 6.
4) Если на этой клетке - слон, то он закрывает собой фигуры дальше. Идти к 6.
5) Если мы не за пределами доски - идти к 2.
// Трассировка вниз
6) Идём на начальную позицию - 4, 7.
7) Идём на клетку ниже.
8) Если на этой клетке - король, то шах. Идти к 11.
9) Если на этой клетке - слон, то он закрывает собой фигуры дальше. Идти к 11.
10) Если мы не за пределами доски - идти к 7.
// Трассировка влево
11) Ну и так далее

Вот примерный код, основан на вашем. Кроме того, позволил себе изменить алгоритм преобразования буквенных координат в численные, если будет непонятно - спрашивайте. Сначала у ASCII-таблицы, потом здесь

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
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <math.h>
 
// Раскомментировать, чтобы показать ход трассировки
//#define SHOW_TRACE
 
int main()
{
    setlocale(LC_ALL, "russian");
    int gkk, gks, gkl; // Горизонтальные координаты короля, ладьи и слона соотвественно
    char vkk, vks, vkl; // Вертикальные координаты короля, ладьи и слона соотвественно
    int vkki, vksi, vkli; //Вертикальные координаты выраженые через целые числа
 
                // Для работы тестирования
 
                //Ввод коориднат...
                //Короля..
    printf ("Please enter coordinates.\n");
    printf ("King (integer \\n character)\n");
    scanf ("%i", &gkk);
    scanf( "%*c%c", &vkk );
    printf ("King coordinates: %d%c\n", gkk, vkk);
                //Ладьи..
    printf ("Rook (integer \\n character)\n");
    scanf ("%d", &gkl);
    scanf( "%*c%c", &vkl );
    printf ("Rook coordinates: %d%c\n", gkl, vkl);
                //Слона..
    printf ("Bishop (integer \\n character)\n");
    scanf ("%d", &gks);
    scanf( "%*c%c", &vks );
    printf ("Bishop coordinates: %d%c\n", gks, vks);
 
    //привести к нижнему регистру
    if( vkk < 'a' ) vkk += 'a' - 'A';
    if( vks < 'a' ) vks += 'a' - 'A';
    if( vkl < 'a' ) vkl += 'a' - 'A';
 
    //преобазовать к числам
    vkki = vkk - 'a' + 1;
    vksi = vks - 'a' + 1;
    vkli = vkl - 'a' + 1;
 
    //для отладки
    printf( "%c = %i; %c = %i; %c = %i;\n\n", vkk, vkki, vkl, vkli, vks, vksi );
 
    // Проверка ввода неверных данных ---------------------------------
    //Фигуры вне доски?
    if( (gkk < 1 || gkk > 8) || (vkki < 1 || vkki > 8) )
    {
       printf( "ERROR: King out of board.\n" );
       getch();
       return 1;
    }
 
    if( (gkl < 1 || gkl > 8) || (vkli < 1 || vkli > 8) )
    {
       printf( "ERROR: Rook out of board.\n" );
       getch();
       return 1;
    }
 
    if( (gks < 1 || gks > 8) || (vksi < 1 || vksi > 8) )
    {
       printf( "ERROR: Bishop out of board.\n" );
       getch();
       return 1;
    }
 
    // ... фигуры занимают одну и ту же позицию
    if( gks == gkk && vksi == vkki )
    {
       printf( "ERROR: King and Bishop share same position.\n" );
       getch();
       return 1;
    }
    
    if( gkk == gkl && vkki == vkli )
    {
       printf( "ERROR: King and Rook share same position.\n" );
       getch();
       return 1;
    }
    
    if( gks == gkl && vksi == vkli )
    {
       printf( "ERROR: Bishop and Rook share same position.\n" );
       getch();
       return 1;
    }
    
    // Всё нормально, данные допустимы -----------------------------------
 
    // Просчитать линии от ладьи в четырёх направлениях -------------------------
    int x = gkl;
    int y = vkli;
 
    printf( "Tracing Rook...\n" );
 
    // Влево
    while( x > 0 )
    {
        #ifdef SHOW_TRACE
        printf( "Tracing Rook (west): %i, %i\n", x, y );
        #endif
 
        if( x == gkk && y == vkki ) //Если текущая клетка - с королём
        {
           printf( "Rook kicks King (%i, %i) ---->  (%i, %i)    [CHECK]\n", gkl, vkli, x, y );
           break;
        }
        else if( x == gks && y == vksi ) //Если текущая клетка - со слоном - слон закрывает собой фигуры дальше
        {
           printf( "Rook aims Bishop (%i, %i) ---->  (%i, %i)\n", gkl, vkli, x, y );
           break;
        }
 
        x--;
    }
 
    x = gkl;
 
    //Вправо
    while( x < 9 )
    {
        #ifdef SHOW_TRACE
        printf( "Tracing Rook (east):\t%i, %i\n", x, y );
        #endif
 
        if( x == gkk && y == vkki ) //Если текущая клетка - с королём
        {
           printf( "Rook kicks King (%i, %i) ---->  (%i, %i)    [CHECK]\n", gkl, vkli, x, y );
           break;
        }
        else if( x == gks && y == vksi ) //Если текущая клетка - со слоном - слон закрывает собой фигуры дальше
        {
           printf( "Rook aims Bishop (%i, %i) ---->  (%i, %i)\n", gkl, vkli, x, y );
           break;
        }
 
        x++;
    }
 
    x = gkl;
 
    //Вверх
    while( y > 0 )
    {
        #ifdef SHOW_TRACE
        printf( "Tracing Rook (north):\t%i, %i\n", x, y );
        #endif
 
        if( x == gkk && y == vkki ) //Если текущая клетка - с королём
        {
           printf( "Rook kicks King (%i, %i) ---->  (%i, %i)    [CHECK]\n", gkl, vkli, x, y );
           break;
        }
        else if( x == gks && y == vksi ) //Если текущая клетка - со слоном - слон закрывает собой фигуры дальше
        {
           printf( "Rook aims Bishop (%i, %i) ---->  (%i, %i)\n", gkl, vkli, x, y );
           break;
        }
 
        y--;
    }
 
    y = vkli;
 
    //Вниз
    while( y < 9 )
    {
        #ifdef SHOW_TRACE
        printf( "Tracing Rook (south):\t%i, %i\n", x, y );
        #endif
 
        if( x == gkk && y == vkki ) //Если текущая клетка - с королём
        {
           printf( "Rook kicks King (%i, %i) ---->  (%i, %i)    [CHECK]\n", gkl, vkli, x, y );
           break;
        }
        else if( x == gks && y == vksi ) //Если текущая клетка - со слоном - слон закрывает собой фигуры дальше
        {
           printf( "Rook aims Bishop (%i, %i) ---->  (%i, %i)\n", gkl, vkli, x, y );
           break;
        }
 
        y++;
    }
 
    // Конец просчёта ладьи
 
    printf( "DONE.\n\nTracing Bishop...\n" );
 
    // Просчитать слона по диагоналям
    x = gks;
    y = vksi;
 
    // Влево-вверх
    while( x > 0  && y > 0 )
    {
        #ifdef SHOW_TRACE
        printf( "Tracing Bishop (northwest):\t%i, %i\n", x, y );
        #endif
 
        if( x == gkk && y == vkki ) //Если текущая клетка - с королём
        {
           printf( "Bishop kicks King (%i, %i) ---->  (%i, %i)    [CHECK]\n", gks, vksi, x, y );
           break;
        }
        else if( x == gkl && y == vkli ) //Если текущая клетка - с ладьёй - ладья закрывает собой фигуры дальше
        {
           printf( "Bishop aims Rook (%i, %i) ---->  (%i, %i)\n", gks, vksi, x, y );
           break;
        }
 
        x--;
        y--;
    }
 
    x = gks;
    y = vksi;
 
    // Вправо-вверх
    while( x < 9  && y > 0 )
    {
        #ifdef SHOW_TRACE
        printf( "Tracing Bishop (northeast):\t%i, %i\n", x, y );
        #endif
 
        if( x == gkk && y == vkki ) //Если текущая клетка - с королём
        {
           printf( "Bishop kicks King (%i, %i) ---->  (%i, %i)    [CHECK]\n", gks, vksi, x, y );
           break;
        }
        else if( x == gkl && y == vkli ) //Если текущая клетка - с ладьёй - ладья закрывает собой фигуры дальше
        {
           printf( "Bishop aims Rook (%i, %i) ---->  (%i, %i)\n", gks, vksi, x, y );
           break;
        }
 
        x++;
        y--;
    }
 
    x = gks;
    y = vksi;
 
    // Вправо-вниз
    while( x < 9  && y < 9 )
    {
        #ifdef SHOW_TRACE
        printf( "Tracing Bishop (southeast):\t%i, %i\n", x, y );
        #endif
 
        if( x == gkk && y == vkki ) //Если текущая клетка - с королём
        {
           printf( "Bishop kicks King (%i, %i) ---->  (%i, %i)    [CHECK]\n", gks, vksi, x, y );
           break;
        }
        else if( x == gkl && y == vkli ) //Если текущая клетка - с ладьёй - ладья закрывает собой фигуры дальше
        {
           printf( "Bishop aims Rook (%i, %i) ---->  (%i, %i)\n", gks, vksi, x, y );
           break;
        }
 
        x++;
        y++;
    }
 
    x = gks;
    y = vksi;
 
    // Влево-вниз
    while( x > 0  && y < 9 )
    {
        #ifdef SHOW_TRACE
        printf( "Tracing Bishop (southwest):\t%i, %i\n", x, y );
        #endif
 
        if( x == gkk && y == vkki ) //Если текущая клетка - с королём
        {
           printf( "Bishop kicks King (%i, %i) ---->  (%i, %i)    [CHECK]\n", gks, vksi, x, y );
           break;
        }
        else if( x == gkl && y == vkli ) //Если текущая клетка - с ладьёй - ладья закрывает собой фигуры дальше
        {
           printf( "Bishop aims Rook (%i, %i) ---->  (%i, %i)\n", gks, vksi, x, y );
           break;
        }
 
        x--;
        y++;
    }
 
    // -- Конец просчёта слона
    printf( "DONE.\n" );
 
 
    _getch ();
    return (0);
}
Удачи.

Добавлено через 13 минут
P.S. Похоже, вы просто запутались в логике своих условий. Старайтесь делать код, понятный человеку, потому что, возможно, именно вам через два месяца придётся переделывать программу Кроме того, раз уж зашёл об этом разговор, я бы переделал имена переменных, содержащих координаты - читается с трудом. Скажем, king_x, king_y, rook_x, rook_y, bishop_x, bishop_y. Но дело ваше.
1
Konkin
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
26.02.2011, 21:32  [ТС] #17
Если бы вы только знали как я вам благодарен за алгоритм перевода буквенных координат в численные. В этом была огромная проблема, так как числа вовсе не хотели приобретать те значения которые я подразумевал. Дальше код идет тоже у вас отличный, но опять же условие от преподавателя было что нельзя использовать циклы и break, goto, continue. Но я вроде догадываюсь как сделать лишь с помощью альтернатив )) Сейчас попробую переписать на свой лад. Вас потом хотелось бы отблагодарить как нить ) Скажите номер мобильника я вам денег кину на него что-ль )

Добавлено через 47 минут
Промежуточных успех )) Я завернул все ваши циклы в одно большое условие для ладьи )) И сделал просто ветки альтернатив. Предыдущий код не работал именно из-за неправильного перевода в целочисленные координаты, ну и пару скобочек я там забыл кое-где

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
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <math.h>
 
int main()
{
    setlocale(LC_ALL, "russian");
    int kor_g, lad_g, slon_g; // Горизонтальные координаты короля, ладьи и слона соотвественно
    char kor_v, lad_v, slon_v; // Вертикальные координаты короля, ладьи и слона соотвественно
        int kor_vi, lad_vi, slon_vi; // Переведеные в числовые значения координаты
 
        // Для работы тестирования      
        //Ввод коориднат...
        //Короля..
    printf ("Пожалуйста введите координаты.\n");
    printf ("Король (цифра\\буква)  \n");
    scanf ("%d", &kor_g);
    scanf( "%*c%c", &kor_v );
    printf ("Координаты короля: %d%c\n", kor_g, kor_v);
        //Ладьи..
    printf ("Ладья (цифра\\буква) \n");
    scanf ("%d", &lad_g);
    scanf( "%*c%c", &lad_v);
    printf ("Координаты ладьи: %d%c\n", lad_g, lad_v);
        //Слона..
    printf ("Слон (цифра\\буква) \n");
    scanf ("%d", &slon_g);
    scanf( "%*c%c", &slon_v );
    printf ("Координаты слона: %d%c\n", slon_g, slon_v);
 
            //Привести к нижнему регистру
        if( kor_v < 'a' ) 
            kor_v += 'a' - 'A';
    if( slon_v < 'a' ) 
            slon_v += 'a' - 'A';
    if( lad_v < 'a' ) 
            lad_v += 'a' - 'A';
 
        // Преобазовать к числам
        kor_vi = kor_v - 'a' + 1;
    slon_vi = slon_v - 'a' + 1;
    lad_vi = lad_v - 'a' + 1;
 
        // Для отладки
        printf ("\nПеревод в целочисленные координаты\n");
        printf( "%c = %i; %c = %i; %c = %i;\n\n", kor_v, kor_vi, lad_v, lad_vi, slon_v, slon_vi );
 
        // Присваивание интовых номеров координатам согласно их букве
        // Проверка неверных входных ситуаций...
        // ... фигуры находятся вне доски
         if((kor_g < 1 || kor_g > 8) || (kor_vi < 1 || kor_vi > 8) ||
             (lad_g < 1 || lad_g > 8) || (lad_vi < 1 || lad_vi > 8) ||
             (slon_g < 1 || slon_g > 8) || (slon_vi < 1 || slon_vi > 8))
    {
       printf( "Ошибка, имеется фигура за доской.\n" );
       getch();
       return 1;
    }
 
    // ... фигуры занимают одну и ту же позицию
    if((slon_g == kor_g && slon_vi == kor_vi) ||
            (kor_g == lad_g && kor_vi == slon_vi) ||
            (slon_g == lad_g && slon_vi == slon_vi))
    {
       printf( "Ошибка, некоторые фигуры занимают одну позиции.\n" );
       getch();
       return 1;
    }
 
 
 
        // Решение задачи. Вычсление признаков...
        // Признак первый. Ладья и король на одной линии. Слон стоит между ладьей и королем, и мешает бить.
        // Если нет то вывод координаты атакующей ладьи.
        // Проверка на помехи со стороны слона
        if ((kor_vi==lad_vi || kor_g==lad_g) && !((((((kor_vi == slon_vi) && (slon_vi== lad_vi)) && ((slon_g > lad_g) 
            && (slon_g < kor_g))) || ((slon_g < lad_g ) && (slon_g > kor_g)))) || ((kor_g == slon_g == lad_g) && 
            (((kor_vi > slon_vi) && (slon_vi > lad_vi)) || ((slon_vi > kor_vi) && (slon_vi < lad_vi))))))
        {
            printf("%d%c", lad_g, lad_v);
            _getch ();
            return 1;
        }
        else
        {
            printf ("No solution");
            _getch ();
            return 1;
        }
        
        _getch ();
        return (0);
}
Сейчас аналогично доделаю для слона и дело в шляпе Еще раз благодарю вас за все подсказки и помощь ))
0
Mayonez
382 / 274 / 21
Регистрация: 26.12.2009
Сообщений: 875
26.02.2011, 22:24 #18
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
#include <iostream>
 
using std::cin;
using std::cout;
using std::endl;
 
struct point
{
   int   x;
   int   y;
   char cx;
};
 
int main()
{
   point King, Rook, Bishop;
   //             0 1 2 3 4 5 6 7
   //             a b c d e f g h
   char line[] = "abcdefgh";
   char c;
   int  i;
   //считываем координаты короля
   cin >> c;
   King.cx = c;
   for (int i = 0; i < 8; i++)
      if (c == line[i]) King.x = i;
   cin >> i;
   King.y = i-1;
   //считываем координаты ладьи
   cin >> c;
   Rook.cx = c;
   for (int i = 0; i < 8; i++)
      if (c == line[i]) Rook.x = i;
   cin >> i;
   Rook.y = i-1;
   //считываем координаты слона
   cin >> c;
   Bishop.cx = c;
   for (int i = 0; i < 8; i++)
      if (c == line[i]) Bishop.x = i;
   cin >> i;
   Bishop.y = i-1;
   //кто-то бьет короля - нет
   bool y = 0;
   //ладья бьет короля?
   if (Rook.x == King.x || Rook.y == King.y)
   {
      cout << Rook.cx << Rook.y+1 << " ";
      y = 1;
   }
   //слон бьет короля?
   for (int x = 0; x < 8; x++)
   {
      int foo = Bishop.y - Bishop.x + x;
      if (x == King.x && foo == King.y)
      {
            cout << Bishop.cx << Bishop.y+1 << " ";
            y = 1;
      }
      
      foo = Bishop.y + Bishop.x - x;
      if (x == King.x && foo == King.y)
      {
            cout << Bishop.cx << Bishop.y+1 << " ";
            y = 1;
      }
   }
   //если никто не бьет короля
   if (!y)
      cout << "No solution" << endl;
 
   return 0;
}


Добавлено через 4 минуты
но без проверок на помехи.
если нужно, могу сделать полностью
0
Konkin
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
27.02.2011, 13:22  [ТС] #19
Mayonez спасибо. Но мне нужен был на Си просто ))
Я вот написал наконец подогнав под все требования преподавателя.

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
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <math.h>
 
int main()
{
    setlocale(LC_ALL, "russian");
    int kor_g, lad_g, slon_g; // Горизонтальные координаты короля, ладьи и слона соотвественно
    char kor_v, lad_v, slon_v; // Вертикальные координаты короля, ладьи и слона соотвественно
    int kor_vi, lad_vi, slon_vi; // Переведеные в числовые значения координаты
 
        //Ввод координат...
        //Короля..
    printf ("Пожалуйста введите координаты.\n");
    printf ("Король (цифра\\буква)  \n");
    scanf ("%d", &kor_g);
    scanf( "%*c%c", &kor_v );
    printf ("Координаты короля: %d%c\n", kor_g, kor_v);
        //Ладьи..
    printf ("Ладья (цифра\\буква) \n");
    scanf ("%d", &lad_g);
    scanf( "%*c%c", &lad_v);
    printf ("Координаты ладьи: %d%c\n", lad_g, lad_v);
        //Слона..
    printf ("Слон (цифра\\буква) \n");
    scanf ("%d", &slon_g);
    scanf( "%*c%c", &slon_v );
    printf ("Координаты слона: %d%c\n", slon_g, slon_v);
 
            //Привести к нижнему регистру
    if( kor_v < 'a' ) 
            kor_v += 'a' - 'A';
    if( slon_v < 'a' ) 
            slon_v += 'a' - 'A';
    if( lad_v < 'a' ) 
            lad_v += 'a' - 'A';
 
        // Преобразовать к числам
        kor_vi = kor_v - 'a' + 1;
    slon_vi = slon_v - 'a' + 1;
    lad_vi = lad_v - 'a' + 1;
 
        // Присваивание интовых номеров координатам согласно их букве
        // Проверка неверных входных ситуаций...
        // ... фигуры находятся вне доски
    if((kor_g < 1 || kor_g > 8) || (kor_vi < 1 || kor_vi > 8) ||
       (lad_g < 1 || lad_g > 8) || (lad_vi < 1 || lad_vi > 8) ||
    (slon_g < 1 || slon_g > 8) || (slon_vi < 1 || slon_vi > 8))
    {
       printf( "Ошибка, имеется фигура за доской.\n" );
       getch();
       return 1;
    }
 
    // ... фигуры занимают одну и ту же позицию
    if((slon_g == kor_g && slon_vi == kor_vi) ||
            (kor_g == lad_g && kor_vi == slon_vi) ||
            (slon_g == lad_g && slon_vi == lad_vi))
    {
       printf( "Ошибка, некоторые фигуры занимают одну позиции.\n" );
       getch();
       return 1;
    }
        // Решение задачи.
        // Условие 1: Ладья и король на одной линии. Слон стоит между ладьей и королем, и мешает бить.
        // Если нет то вывод координаты атакующей ладьи.
        // Проверка на помехи со стороны слона
        if ((kor_vi==lad_vi || kor_g==lad_g) && !((((((kor_vi == slon_vi) && (slon_vi== lad_vi)) && ((slon_g > lad_g) 
                   && (slon_g < kor_g))) || ((slon_g < lad_g ) && (slon_g > kor_g)))) || ((kor_g == slon_g == lad_g) && 
                    (((kor_vi > slon_vi) && (slon_vi > lad_vi)) || ((slon_vi > kor_vi) && (slon_vi < lad_vi))))))
        {
            printf("\n%d%c ", lad_g, lad_v);
                    // Теперь проверка слона. Условие помехи ладьи в данном случае излишне.
                    if (abs(slon_g-kor_g) == abs(slon_vi - kor_vi))
                    {
                        printf ("%d%c", slon_g, slon_v);
                        _getch();
                        return 1;
                    }
            _getch ();
            return 1;
        }
        //Если условие 1 с ладьей не удовлетворено, то снова проверка слона, но уже с учетом помех от ладьи.
        else
        {
            if (((abs(lad_g-slon_g)== abs(lad_vi-slon_vi)) > 
                        (abs(slon_g-kor_g) == abs(slon_vi - kor_vi))))
                    {
                        printf ("\n%d%c", slon_g, slon_v);
                        _getch();
                        return 1;
                    }
            // Если же и слон не удовлетворен, то вывод надписи об отсутствии решений.
            else
            {
                printf ("\nNo solution");
                _getch ();
                return 1;
            }
        }
        
        _getch ();
        return (0);
}
Прога работает на любых комбинациях координат. Всем всем еще раз спасибо за помощь.

Добавлено через 13 часов 10 минут
Почему то пропала кнопка редактирования поста )) Тот код еще не до конца работал. Вот этот уже точно:

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
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <math.h>
 
int main()
{
    setlocale(LC_ALL, "russian");
    int kor_g, lad_g, slon_g; // Горизонтальные координаты короля, ладьи и слона соотвественно
    char kor_v, lad_v, slon_v; // Вертикальные координаты короля, ладьи и слона соотвественно
    int kor_vi, lad_vi, slon_vi; // Переведеные в числовые значения координаты
    
        //Ввод коориднат...
        //Короля..
    printf ("Пожалуйста введите координаты.\n");
    printf ("Король (цифра\\буква)  \n");
    scanf ("%d", &kor_g);
    scanf( "%*c%c", &kor_v );
    printf ("Координаты короля: %d%c\n", kor_g, kor_v);
        //Ладьи..
    printf ("Ладья (цифра\\буква) \n");
    scanf ("%d", &lad_g);
    scanf( "%*c%c", &lad_v);
    printf ("Координаты ладьи: %d%c\n", lad_g, lad_v);
        //Слона..
    printf ("Слон (цифра\\буква) \n");
    scanf ("%d", &slon_g);
    scanf( "%*c%c", &slon_v );
    printf ("Координаты слона: %d%c\n", slon_g, slon_v);
 
    //Привести к нижнему регистру
    if( kor_v < 'a' ) 
    kor_v += 'a' - 'A';
    if( slon_v < 'a' ) 
    slon_v += 'a' - 'A';
    if( lad_v < 'a' ) 
    lad_v += 'a' - 'A';
 
    // Преобазовать к числам
    kor_vi = kor_v - 'a' + 1;
    slon_vi = slon_v - 'a' + 1;
    lad_vi = lad_v - 'a' + 1;
 
        // Присваивание интовых номеров координатам согласно их букве
        // Проверка неверных входных ситуаций...
        // ... фигуры находятся вне доски
      if((kor_g < 1 || kor_g > 8) || (kor_vi < 1 || kor_vi > 8) ||
     (lad_g < 1 || lad_g > 8) || (lad_vi < 1 || lad_vi > 8) ||
    (slon_g < 1 || slon_g > 8) || (slon_vi < 1 || slon_vi > 8))
    {
       printf( "Ошибка, имеется фигура за доской.\n" );
       getch();
       return 1;
    }
 
    // ... фигуры занимают одну и ту же позицию
    if((slon_g == kor_g && slon_vi == kor_vi) ||
    (kor_g == lad_g && kor_vi == slon_vi) ||
    (slon_g == lad_g && slon_vi == lad_vi))
    {
       printf( "Ошибка, некоторые фигуры занимают одну позиции.\n" );
       getch();
       return 1;
    }
        // Решение задачи.
        // Условие 1 Ладья и король на одной линии. 
                //Слон стоит между ладьей и королем, и мешает бить.
        // Если нет то вывод координаты атакующей ладьи.
        // Проверка на помехи со стороны слона
        if ((kor_vi==lad_vi || kor_g==lad_g) && !((((((kor_vi == slon_vi) &&
                 (slon_vi== lad_vi)) && ((slon_g > lad_g)   && (slon_g < kor_g))) || ((slon_g < lad_g ) 
                 && (slon_g > kor_g)))) || ((kor_g == slon_g == lad_g) &&   (((kor_vi > slon_vi) 
                 && (slon_vi > lad_vi)) || ((slon_vi > kor_vi) && (slon_vi < lad_vi))))))
        {
            printf("\n%d%c ", lad_g, lad_v);
                    // Теперь проверка слона. Условие помехи ладьи в данном случае излишне.
                if (abs(slon_g-kor_g) == abs(slon_vi - kor_vi))
                {
                    printf ("%d%c", slon_g, slon_v);
                    _getch();
                    return 1;
                }
            _getch ();
            return 1;
        }
        //Если условие 1 с ладьей не удовлетворено, то снова проверка слона, но уже с учетом помех от ладьи.
        else
        {
            if ((abs(slon_g-kor_g) == abs(slon_vi - kor_vi)))
            {
                if (abs(kor_g-lad_g) == abs(kor_vi-lad_vi))
                {
                    if (((lad_g > kor_g) && (lad_g < slon_g)) || ((lad_g < kor_g) && (lad_g > slon_g)))
                    {
                        printf ("\nNo solution");
                        _getch ();
                        return 1;
                    }
                    else 
                    {
                        printf ("\n%d%c",slon_g,slon_v);
                        _getch ();
                        return 1;
                    }
                }
                else
                {
                    printf ("\n%d%c",slon_g,slon_v);
                    _getch ();
                    return 1;
                }
            }
            // Если же и слон не удовлетворен, то вывод надписи об отсутствии решений.
            else
            {
                printf ("\nNo solution");
                _getch ();
                return 1;
            }
        }
        _getch ();
        return (0);
}
0
Mayonez
27.02.2011, 16:25
  #20

Не по теме:

Konkin, как по мне, преобразование из буквенных координат в численные у меня выглядит логичнее

0
Konkin
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
27.02.2011, 20:43  [ТС] #21
Цитата Сообщение от Mayonez Посмотреть сообщение

Не по теме:

Konkin, как по мне, преобразование из буквенных координат в численные у меня выглядит логичнее

У вас для этого используются циклы. Конечно логичнее, но мне запретили их использовать (((
0
27.02.2011, 20:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2011, 20:43
Привет! Вот еще темы с ответами:

Шахматная доска - C++
Шахматная доска содержит 8x8 клеток. Горизонтали и вертикали обозначаются цифрами 1-8. Написать программу, проверяющую, можно ли с первой...

Шахматная доска - Delphi
Нарисовать с помощью компонентов TLabel или TEdit шахматную доску с помощью кода, т.е. из программы, например при нажатии на кнопку Button1...

Шахматная доска - MathCAD
Дано координаты 2 клеток на шахматной доске (x1,y1) та (x2,y2). а) Проверить будут ли они одинакового кольора; б) если на них поставить...

Шахматная доска - C#
Как можно создать шахматную доску с помощью кода? Какие лучше использовать элементы? Как организовать?


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

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

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