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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
TheMachinist
243 / 175 / 15
Регистрация: 14.06.2010
Сообщений: 422
#1

Pseudo_Game - C++

15.08.2010, 11:52. Просмотров 2271. Ответов 40
Метки нет (Все метки)

Привет народ. Я со вчерашнего дня начал изучать C++ (после нескольких месяцем занятий BASICом),
имею такую задачку:
При нажатии esc вывести на экран значение x, и только после этого чтоб можно было закрыть
консоль нажатием любой клавиши.
Я никак не пойму почему оператор switch выполняется когда ChkExit = 0, а else не выполняется.


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
#include <iostream>
#include <conio.h>
#include <clocale>
 
using namespace std;
 
int main()
{
    char act;
int ch;
int x = 0; int y = 0;
bool ChkExit = 1;
 
setlocale(LC_CTYPE,"Russian");
    
while(1)
{
act = _getch();
ch = static_cast<int>(act);
if(ChkExit = 1)
{
    switch(ch)
    {
        case -32:
            break;
 
        case 27:
            ChkExit = 0;
            cout << "ChkExit = " << ChkExit << "\n";
            cout << " x = " << x << "\n";
            //exit(0);
            break;
 
        case 77:
            cout << "Направо.\n";
            x += 1;
            break;
 
        default:
            cout << "Не та клавиша.\n";
    }
  }
else if(ChkExit = 0)
cout << "y = " << y << "\n";
}
    
}
Помогите пожалуйста чайнику.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CyberHunter
12 / 12 / 1
Регистрация: 03.08.2010
Сообщений: 61
15.08.2010, 12:11 #2
Цитата Сообщение от NikolaWhite Посмотреть сообщение
после нескольких месяцем занятий BASICом
да, помню эти времена))))
изначально у тебя ChkExit = 1, потом проверяется условие выхода, то есть при вводе c сконсоли Esc


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
#include <iostream>
#include <conio.h>
#include <clocale>
 
using namespace std;
 
int main()
{
    char act;
    int ch;
    int x = 0;
    int y = 0;
    bool ChkExit = 1;
    
    setlocale(LC_CTYPE,"Russian");
 
    while(1)
    {
        act = _getch();
        ch = static_cast<int>(act);
        if(ChkExit = 1)
        {
            switch(ch)
            {
            case -32:
                break;
                
            case 27:
                ChkExit = 0;
                cout << "ChkExit = " << ChkExit << "\n";
                cout << " x = " << x << "\n";
                //exit(0);
                break;
                
            case 77:
                cout << "Направо.\n";
                x += 1;
                break;
                
            default:
                cout << "Не та клавиша.\n";
            }
        }
        else if(ChkExit = 0)
            cout << "y = " << y << "\n";
    }
}
в таком виде код более понятен, когда соблюдено такое форматирование, легче отлаживать код

Добавлено через 11 минут
ChkExit = 1 - это операция присвоения, только сейсчас заметил)))
операция сравнения ==
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
15.08.2010, 12:11 #3
Цитата Сообщение от CyberHunter Посмотреть сообщение
if(ChkExit = 1)
это еще что? почему присваивание, а не сравнение?
else if(ChkExit = 0)
и здесь тоже
0
CyberHunter
12 / 12 / 1
Регистрация: 03.08.2010
Сообщений: 61
15.08.2010, 12:13 #4
замени ChkExit = 1 на ChkExit == 1 и всё будет ок
0
TheMachinist
243 / 175 / 15
Регистрация: 14.06.2010
Сообщений: 422
15.08.2010, 12:34  [ТС] #5
Понял я в чем дело, только не знаю как правильно сделать.
В BASICе ChkExit = 1 была бы в Sub Globals , а тут не пойму куда ее девать и что с ней делать.

Добавлено через 20 минут
Цитата Сообщение от CyberHunter Посмотреть сообщение
замени ChkExit = 1 на ChkExit == 1 и всё будет ок
Спасибо разобрался.
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
15.08.2010, 14:40 #6
Цитата Сообщение от NikolaWhite Посмотреть сообщение
act = _getch();
ch = static_cast<int>(act);
getch возвращает int.

Цитата Сообщение от CyberHunter Посмотреть сообщение
int main()
а return'а нигде нет.
0
TheMachinist
243 / 175 / 15
Регистрация: 14.06.2010
Сообщений: 422
15.08.2010, 20:44  [ТС] #7
Я тут упражнения делаю
1. Заменить switch на if else при выборе значения ch.....
Что -то с else не срастается у меня , вот и налепил бог весть чего.
2 Сделать что бы буковка "Т" не выходила за пределы карты (20х15).
Я написал:
if(x>14)
{
x = 14;
}
но "Т" не стирается когда обратно стреку вправо жмешь.
А по Y (стрелка вниз) вообще не получается...

Подскажите пожалуйста решение.


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
#include <iostream>
#include <conio.h>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
    char act;
    int ch;
    int x = 0; int y = 0;
    char Map[15][20];
 
    for(int i = 0;i < 15;i++)
    {
        for(int j = 0;j < 20;j++)
        {
            Map[i][j] = ' ';
        }
    }
    Map[0][0] = 'T';
 
    while(1)
    {
        system("cls"); // вызов функции очистки экрана.
            for(int i = 0;i < 15;i++)
            {
                for(int j = 0;j < 20;j++)
                {
                    cout << Map[i][j];
                }
                cout << "\n";
            }
                act = _getch();
                ch = static_cast<int>(act);
 
if (ch == 27)
{
    exit(0);
}
 if(ch == 77)
{
    Map[y][x] = ' ';
    x += 1;
    Map[y][x] = 'T';
}
 if(ch == 75)
 {
     Map[y][x] = ' ';
     x -= 1;
     Map[y][x] = 'T';
 }
 if(ch == 80)
 {
     Map[y][x] = ' ';
     y += 1;
     Map[y][x] = 'T';
 }
 if(ch == 72)
 {
     Map[y][x] = ' ';
 y -= 1;
 Map[y][x] = 'T';
 }
//????????????????????????????????????????????????????????????????????????????????
 if(x > 14)
 {
     x = 14;
 }
 
 if(y > 19)
 {
     y = 19;
 }
//??????????????????????????????????????????????????????????????????????????        
    }
    _getch();
    return(0);
}



getch возвращает int.
А я думал _getch() значит get character...
0
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,781
15.08.2010, 21:54 #8
Цитата Сообщение от NikolaWhite Посмотреть сообщение
А я думал _getch() значит get character...
Ага, означает. А возвращают функции _getch() fgetc() getchar() etc... значение типа int, чтобы константу EOF равную -1 не путать с символом с кодом 255...
0
TheMachinist
243 / 175 / 15
Регистрация: 14.06.2010
Сообщений: 422
17.08.2010, 19:11  [ТС] #9
Я тут просил помочь с упражнением:
Стрелочками перемещается буква "Т" по карте 15х20, надо было сделать чтобы "Т" не выходила за пределы карты.Вобщем сам разобрался.....В каждый блок case вписал if(y == 0) y--; и т.д.
Раз это форум для начинающих эта псевдо игра кому-нибудь будет интересна

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>
#include <conio.h>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
    char Map[15][20];
int x = 0;int y = 0;
char act;
int ch;
 
for(int i = 0;i < 20;i++)
{
    for(int j = 0;j < 15;j++)
    {
        act = ' ';
        Map[j][i] = act;
    }
}
Map[0][0] = 'T';
 
while(1)
{
    system("cls");
    for(int i = 0;i < 20;i++)
    {
        for(int j = 0;j < 15;j++)
        {
cout << Map[j][i];
        }
        cout << "\n";
    }
    
act = _getch();
ch = static_cast<int>(act);
 
switch(ch)
{
case 80:
    if(y == 19) y--;
    Map[x][y] = ' ';
    y++;
    Map[x][y] = 'T';
    break;
 
case 72:
    if(y == 0) y++;
    Map[x][y] = ' ';
    y--;
    Map[x][y] = 'T';
    break;
 
case 77:
    if(x == 14) x--;
    Map[x][y] = ' ';
    x++;
    Map[x][y] = 'T';
    break;
 
case 75:
    if(x == 0) x++;
    Map[x][y] = ' ';
    x--;
    Map[x][y] = 'T';
    break;
}
   }
 
    _getch();
    return 0;
}
0
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 06:02 #10
Цитата Сообщение от kazak Посмотреть сообщение
а return'а нигде нет.
return в main не нужен. По-умолчанию, происходит return 0;
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
18.08.2010, 06:17 #11
alexzak, Не следует на это полагаться. © Страуструп. Шилдт. И прочие. Гораздо полезнее возвращать самому ноль
0
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 06:21 #12
Цитата Сообщение от Lavroff Посмотреть сообщение
alexzak, Не следует на это полагаться. © Страуструп. Шилдт. И прочие. Гораздо полезнее возвращать самому ноль
Если ты даже не хочешь полагаться, то проверить тебе никто не запрещает? Все современные компиляторы в этом смысле соответствуют стандарту. Здесь не на что полагаться.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
18.08.2010, 06:34 #13
alexzak, Все равно лучше возвращать ноль вручную. Это правильнее.
0
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 06:39 #14
Цитата Сообщение от Lavroff Посмотреть сообщение
alexzak, Все равно лучше возвращать ноль вручную. Это правильнее.
Аргументируй.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
18.08.2010, 06:59 #15
alexzak, Руками всегда лучше. Всегда найдутся компиляторы, которые не возвращают ноль по дефолту, не из ТОП-овых конечно, но как знать с чем придется работать. Приучает к порядку. Понятнее, что функция возвращает код успешного выполнения программы явно, нежели неявно. Опять же код понятнее становится. И мало-ли что может быть, вдруг функция вернет мусор, а не 0, в от программы зависит что-то важное. Считайте, что обычная подстраховка. Хватит?
0
Yandex
Объявления
18.08.2010, 06:59
Ответ Создать тему
Опции темы

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