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

Pseudo_Game - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
TheMachinist
 Аватар для TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
15.08.2010, 11:52     Pseudo_Game #1
Привет народ. Я со вчерашнего дня начал изучать 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";
}
    
}
Помогите пожалуйста чайнику.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyberHunter
12 / 12 / 1
Регистрация: 03.08.2010
Сообщений: 61
15.08.2010, 12:11     Pseudo_Game #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 - это операция присвоения, только сейсчас заметил)))
операция сравнения ==
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.08.2010, 12:11     Pseudo_Game #3
Цитата Сообщение от CyberHunter Посмотреть сообщение
if(ChkExit = 1)
это еще что? почему присваивание, а не сравнение?
else if(ChkExit = 0)
и здесь тоже
CyberHunter
12 / 12 / 1
Регистрация: 03.08.2010
Сообщений: 61
15.08.2010, 12:13     Pseudo_Game #4
замени ChkExit = 1 на ChkExit == 1 и всё будет ок
TheMachinist
 Аватар для TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
15.08.2010, 12:34  [ТС]     Pseudo_Game #5
Понял я в чем дело, только не знаю как правильно сделать.
В BASICе ChkExit = 1 была бы в Sub Globals , а тут не пойму куда ее девать и что с ней делать.

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

Цитата Сообщение от CyberHunter Посмотреть сообщение
int main()
а return'а нигде нет.
TheMachinist
 Аватар для TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
15.08.2010, 20:44  [ТС]     Pseudo_Game #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...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.08.2010, 21:54     Pseudo_Game #8
Цитата Сообщение от NikolaWhite Посмотреть сообщение
А я думал _getch() значит get character...
Ага, означает. А возвращают функции _getch() fgetc() getchar() etc... значение типа int, чтобы константу EOF равную -1 не путать с символом с кодом 255...
TheMachinist
 Аватар для TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
17.08.2010, 19:11  [ТС]     Pseudo_Game #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;
}
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 06:02     Pseudo_Game #10
Цитата Сообщение от kazak Посмотреть сообщение
а return'а нигде нет.
return в main не нужен. По-умолчанию, происходит return 0;
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.08.2010, 06:17     Pseudo_Game #11
alexzak, Не следует на это полагаться. © Страуструп. Шилдт. И прочие. Гораздо полезнее возвращать самому ноль
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 06:21     Pseudo_Game #12
Цитата Сообщение от Lavroff Посмотреть сообщение
alexzak, Не следует на это полагаться. © Страуструп. Шилдт. И прочие. Гораздо полезнее возвращать самому ноль
Если ты даже не хочешь полагаться, то проверить тебе никто не запрещает? Все современные компиляторы в этом смысле соответствуют стандарту. Здесь не на что полагаться.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.08.2010, 06:34     Pseudo_Game #13
alexzak, Все равно лучше возвращать ноль вручную. Это правильнее.
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 06:39     Pseudo_Game #14
Цитата Сообщение от Lavroff Посмотреть сообщение
alexzak, Все равно лучше возвращать ноль вручную. Это правильнее.
Аргументируй.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.08.2010, 06:59     Pseudo_Game #15
alexzak, Руками всегда лучше. Всегда найдутся компиляторы, которые не возвращают ноль по дефолту, не из ТОП-овых конечно, но как знать с чем придется работать. Приучает к порядку. Понятнее, что функция возвращает код успешного выполнения программы явно, нежели неявно. Опять же код понятнее становится. И мало-ли что может быть, вдруг функция вернет мусор, а не 0, в от программы зависит что-то важное. Считайте, что обычная подстраховка. Хватит?
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 07:02     Pseudo_Game #16
Цитата Сообщение от Lavroff Посмотреть сообщение
alexzak, Руками всегда лучше. Всегда найдутся компиляторы, которые не возвращают ноль по дефолту, не из ТОП-овых конечно, но как знать с чем придется работать. Приучает к порядку. Понятнее, что функция возвращает код успешного выполнения программы явно, нежели неявно. Хватит?
Это все субъективно. Найди хоть один компилятор, выпущенный в последние 10 лет, где это не работает. Мне больше кажется, что ты просто не знал этого факта, а теперь пытаешься найти своему незнанию оправдание.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.08.2010, 07:04     Pseudo_Game #17
alexzak, Знал. И знаю. И этот факт незачем использовать. Стоит возвращать ноль, хотя бы потому, что функция int main(). Не хотите возвращать пишите void main().
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 07:07     Pseudo_Game #18
Цитата Сообщение от Lavroff Посмотреть сообщение
alexzak, Знал. И знаю. И этот факт незачем использовать. Стоит возвращать ноль, хотя бы потому, что функция int main(). Не хотите возвращать пишите void main().
Ну, вот ты и показал свое незнание. Стандарт четко определяет прототип main. И 'void main()' там никакого нет. Компилятор, соответствующий стандарту откажется компилировать 'void main()'. Стандарт читал хоть раз?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.08.2010, 07:08     Pseudo_Game #19
alexzak, Поглядывал. Возможно не знаю. Только void main() вполне нормально компилится. В современных компиляторах. Что далее?
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 07:11     Pseudo_Game #20
Цитата Сообщение от Lavroff Посмотреть сообщение
alexzak, Поглядывал. Возможно не знаю. Только void main() вполне нормально компилится. В современных компиляторах. Что далее?
Очевидно, тебе пофиг на то, что правильно. Иначе ты бы не сказал, что void main вполне нормально.
Yandex
Объявления
18.08.2010, 07:11     Pseudo_Game
Ответ Создать тему
Опции темы

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