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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 5.00
Spirit102
2 / 2 / 0
Регистрация: 20.01.2009
Сообщений: 18
#1

Шахматы. Подскажите, как написать ферзя. - C++

23.10.2009, 10:06. Просмотров 1688. Ответов 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
#include <stdio.h> 
#include <conio.h> 
 
void main() { 
char f; 
printf("vvedite № figur:1-ladja,2-ferz, 3-slon,4-kon,5-peska,6-korol; \n"); 
scanf("%c",&f); 
int x1, y1; 
printf("vvedite № polja-(chislo, cislo), ot 1 do 8 \n"); 
scanf("%d %d",&x1, &y1); 
int x2, y2; 
printf("vvedite № polja-(chislo, cislo), ot 1 do 8 \n "); 
scanf("%d %d",&x2,&y2); 
 
switch (f) { 
case'1': if (x1==x2 || y2==y1) 
         {printf("figura bita"); 
           break; 
           } 
case'2': break; 
case'3': break; 
case'4': if ((x1==x2-1 && y1==y2-2)||(x1==x2+1 && y1==y2-2)||(x1==x2-1 && y1==y2+2)||(x1==x2+1 && y1==y2+2)||(x1==x2-2 && y1==y2-1)||(x1==x2+2 && y1==y2-1)||(x1==x2-2 && y1==y2+1)||(x1==x2+2 && y1==y2+1)) 
{printf("figura bita"); 
           break; 
           } 
case'5':  if((y1==y2-1 || y1==y2+1)&&(x1==x2-1)) 
          {      printf("figura bita"); 
             break; 
         } 
case'6':if ((x1==x2 && y1==y2-1)||(x1==x2 && y1==y2+1)||(x1==x2-1 && y1==y2)||(x1==x2+1 && y1==y2)||(x1==x2+1 && y1==y2+1)||(x1==x2+1 && y1==y2-1)||(x1==x2-1 && y1==y2+1)||(x1==x2-1 && y1==y2-1)) 
{printf("figura bita"); 
           break; 
           } 
default : printf("figura ne bita"); 
return; 
 
} 
getch(); 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
1696 / 875 / 44
Регистрация: 04.06.2008
Сообщений: 5,345
23.10.2009, 14:10     Шахматы. Подскажите, как написать ферзя. #2
Не, ну а чё? Замысел правильный, всё верно. Чё ты, не знаешь, как ферзь ходит?
C
1
2
3
4
5
6
#include <math.h>
case'2': 
 if (x1==x2 || y2==y1 || ((fabs)(x1-x2)==(fabs)(y1- y2))) {
  printf("figura bita" );
  break; 
}
fabs это абсолютное значение. Вот подключил ещё и библиотеку дополнительную математическую
Spirit102
2 / 2 / 0
Регистрация: 20.01.2009
Сообщений: 18
24.10.2009, 17:24  [ТС]     Шахматы. Подскажите, как написать ферзя. #3
Пасиб))
Spirit102
2 / 2 / 0
Регистрация: 20.01.2009
Сообщений: 18
06.11.2009, 21:00  [ТС]     Шахматы. Подскажите, как написать ферзя. #4
Еще вопрос - почему может не работать Default?
Сейчас прога выглядит вот так:
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main(){
char f;
printf("Vvedite nomer figuru: \npeshka: 1\nladja : 2\nslon  : 3\nkorol : 4\nferz  : 5\nkon   : 6\n");
scanf("%c",&f);
int x1, y1; 
printf("Vvedite koordinati 1 figuru (ot 1 do 8) \n"); 
scanf("%d %d",&x1, &y1); 
int x2, y2; 
printf("Vvedite koordinati 2 figuru (ot 1 do 8) \n"); 
scanf("%d %d",&x2,&y2); 
switch (f){
case '1': if ((y1==y2+1 || y1==y2-1) && x1==x2-1)
          printf("figura betsja"); break;
 
case '2': if (x1==x2 || y1==y2)
          printf("figura betsja"); break;
 
case '3': if (abs(x1-x2)==abs(y1-y2))
          printf("figura betsja"); break;
 
case '4': if ((x1==x2 && y1==y2-1)||(x1==x2 && y1==y2+1)||(x1==x2-1 && y1==y2)||(x1==x2+1 && y1==y2)||(x1==x2+1 && y1==y2+1)||(x1==x2+1 && y1==y2-1)||(x1==x2-1 && y1==y2+1)||(x1==x2-1 && y1==y2-1)) 
          printf("figura betsja"); break;
 
case '5': if ((x1==x2 || y1==y2) || (abs(x1-x2)==abs(y1-y2)))
          printf("figura betsja"); break;
 
case '6': if ((x1==x2-1 && y1==y2-2)||(x1==x2+1 && y1==y2-2)||(x1==x2-1 && y1==y2+2)||(x1==x2+1 && y1==y2+2)||(x1==x2-2 && y1==y2-1)||(x1==x2+2 && y1==y2-1)||(x1==x2-2 && y1==y2+1)||(x1==x2+2 && y1==y2+1)) 
          printf("figura betsja"); break;
 
default: printf("figura ne betsja"); break;
return;
}
getch();
}
rrrFer
Заблокирован
06.11.2009, 21:15     Шахматы. Подскажите, как написать ферзя. #5
он должен работать если ввести в качесве номера фигуры число <1 или >6. Если введено число от 1 до 6 то выполняется тело одного из case и он не может попасть на default. Тело default можно вынести за switch, а при успешном выполнеии условия в case устанавливать флаг, если после switch флаг не установлен то выводим что фигура небьется.
Spirit102
2 / 2 / 0
Регистрация: 20.01.2009
Сообщений: 18
06.11.2009, 21:17  [ТС]     Шахматы. Подскажите, как написать ферзя. #6
ясно.попробую
rrrFer
Заблокирован
06.11.2009, 21:24     Шахматы. Подскажите, как написать ферзя. #7
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(){
    char f;
    int x1, y1,x2,y2;
    bool flag;
    printf("Vvedite nomer figuru: \npeshka: 1\nladja : 2\nslon  : 3\nkorol : 4\nferz  : 5\nkon   : 6\n");
    scanf("%c",&f);
    printf("Vvedite koordinati 1 figuru (ot 1 do 8) \n");
    scanf("%d %d",&x1, &y1);
    printf("Vvedite koordinati 2 figuru (ot 1 do 8) \n");
    scanf("%d %d",&x2,&y2);
    flag=0;
    switch (f){
        case '1':
            if ((y1==y2+1 || y1==y2-1) && x1==x2-1)
                flag=1;
        break;
        case '2':
            if (x1==x2 || y1==y2)
               flag=1;
        break;
        case '3':
            if (fabs(x1-x2)==fabs(y1-y2))
                flag=1;
        break;
        case '4':
            if ((x1==x2 && y1==y2-1)||(x1==x2 && y1==y2+1)||(x1==x2-1 && y1==y2)||(x1==x2+1 && y1==y2)||(x1==x2+1 && y1==y2+1)||(x1==x2+1 && y1==y2-1)||(x1==x2-1 && y1==y2+1)||(x1==x2-1 && y1==y2-1))
                flag=1;
        break;
        case '5':
            if ((x1==x2 || y1==y2) || (fabs(x1-x2)==fabs(y1-y2)))
                flag=1;
        break;
        case '6':
            if ((x1==x2-1 && y1==y2-2)||(x1==x2+1 && y1==y2-2)||(x1==x2-1 && y1==y2+2)||(x1==x2+1 && y1==y2+2)||(x1==x2-2 && y1==y2-1)||(x1==x2+2 && y1==y2-1)||(x1==x2-2 && y1==y2+1)||(x1==x2+2 && y1==y2+1))
                flag=1;
        break;
    }
    printf((flag?"bjetsa":"nebjetsa"));
    getch();
    return 0;
}
можно так
Spirit102
2 / 2 / 0
Регистрация: 20.01.2009
Сообщений: 18
06.11.2009, 21:36  [ТС]     Шахматы. Подскажите, как написать ферзя. #8
красиво)
rrrFer
Заблокирован
06.11.2009, 21:41     Шахматы. Подскажите, как написать ферзя. #9
так вроде чуть-чуть красивей)) :
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
        #include <stdio.h>
#include <conio.h>
#include <math.h>
int main(){
    char f;
    int x1, y1,x2,y2;
    bool flag;
    printf("Vvedite nomer figuru: \npeshka: 1\nladja : 2\nslon  : 3\nkorol : 4\nferz  : 5\nkon   : 6\n");
    scanf("%c",&f);
    printf("Vvedite koordinati 1 figuru (ot 1 do 8) \n");
    scanf("%d %d",&x1, &y1);
    printf("Vvedite koordinati 2 figuru (ot 1 do 8) \n");
    scanf("%d %d",&x2,&y2);
    switch (f){
        case '1':
            flag=((y1==y2+1 || y1==y2-1) && x1==x2-1);
        break;
        case '2':
            flag=(x1==x2 || y1==y2);
        break;
        case '3':
            flag=(fabs(x1-x2)==fabs(y1-y2));
        break;
        case '4':
           flag=((x1==x2 && y1==y2-1)||(x1==x2 && y1==y2+1)||(x1==x2-1 && y1==y2)||(x1==x2+1 && y1==y2)||(x1==x2+1 && y1==y2+1)||(x1==x2+1 && y1==y2-1)||(x1==x2-1 && y1==y2+1)||(x1==x2-1 && y1==y2-1));
        break;
        case '5':
            flag=((x1==x2 || y1==y2) || (fabs(x1-x2)==fabs(y1-y2)));
        break;
        default:
           flag=((x1==x2-1 && y1==y2-2)||(x1==x2+1 && y1==y2-2)||(x1==x2-1 && y1==y2+2)||(x1==x2+1 && y1==y2+2)||(x1==x2-2 && y1==y2-1)||(x1==x2+2 && y1==y2-1)||(x1==x2-2 && y1==y2+1)||(x1==x2+2 && y1==y2+1));
        break;
    }
    printf((flag?"bjetsa":"nebjetsa"));
    getch();
    return 0;
}
Spirit102
2 / 2 / 0
Регистрация: 20.01.2009
Сообщений: 18
06.11.2009, 22:01  [ТС]     Шахматы. Подскажите, как написать ферзя. #10
Еще хотел спросить:
Получается, void main() возвращать целое число не хочет?
Почему bool flag?(я с int делал)
И немного пояснить можете, про присвоение условий флагу?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2009, 22:12     Шахматы. Подскажите, как написать ферзя.
Еще ссылки по теме:

подскажите, как написать уравнение C++
Шахматы. Каждый ферзь бьет ровного одного ферзя C++
C++ Подскажите как написать программу
Написать консольные шахматы C++
Игра "Шахматы" подскажите литературу C++

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

Или воспользуйтесь поиском по форуму:
rrrFer
Заблокирован
06.11.2009, 22:12     Шахматы. Подскажите, как написать ферзя. #11
Цитата Сообщение от Spirit102 Посмотреть сообщение
Получается, void main() возвращать целое число не хочет?
если функция обьявлена как void то она не возвращает значение. main должно возвращать либо ноль(если успешно завершила работу) либо код ошибки.
Цитата Сообщение от Spirit102 Посмотреть сообщение
Почему bool flag?(я с int делал)
можно и int, но bool на несколько байт меньше
Цитата Сообщение от Spirit102 Посмотреть сообщение
И немного пояснить можете, про присвоение условий флагу?
присваиваем результат выполнения, тоесть либо 0 либо 1.
Yandex
Объявления
06.11.2009, 22:12     Шахматы. Подскажите, как написать ферзя.
Ответ Создать тему
Опции темы

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