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

Вот нашол такой код - C++

Восстановить пароль Регистрация
 
Taras_Z
 Аватар для Taras_Z
100 / 84 / 2
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
22.02.2012, 21:32     Вот нашол такой код #1
Вот нашол такой код :
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 <iostream> // cin, out
#include <clocale> // поддержка русского языка
#include <conio.h> // _getch()
#include <stdlib.h> // поддержка функции очистки экрана system("cls")
 
using namespace std;
const int s = 15; // глобальные константы определяющие количество
const int c = 20; // строк и столбцов
int game_init(char map[s][c]); // прототипы функций
int movement_if(int&, int&,char map[s][c]);
 
int main()
{
    setlocale(LC_CTYPE,"Russian");
    int x = 0;
    int y = 0;
    int e = 0; // переменная для хранения кодов ошибок
    char map[15][20]; //двумерный массив для хранения карты
    game_init(map); // вызов функции инициализации массива
    while (1) // основной цикл
    {
        system("cls");
        for (int i = 0; i < 15; i++)
        {
            for (int j = 0; j < 20; j++)
            {
                cout << map[i][j]; // в циклах поэлементно выводится массив
            }
            cout << "\n"; // переход на новую строку после каждого "ряда"
        }
        e = movement_if(x,y,map);
        if (e == 1)
            break;
    } // конец цикла while
    _getch();
    return 0;
} // конец main()
 
/* Функция инициализации массива */
int game_init(char map[s][c])
{
    for (int i = 0; i < s; i++)
    {
        for (int j = 0; j < c; j++)
        {
            map[i][j] = ' ';
        }
    }
    map[0][0] = 'Т';
    return 0;
} // конец game_init()
 
/* Функция для ввода с клавиатуры */
int movement_if (int& x, int& y, char map[s][c])
{
    char act;
    int ch;
    static int counter = 0; // статическая переменная для хранения количества ходов
    int e = 0;
    act = _getch();
    ch = static_cast<int>(act);
 
    if (ch == -32)
    {}
    else 
        if (ch == 27)
        {
            e = 1; /* мы больше не можем использовать break */
            cout << "Количество сделанных игроком ходов: " << counter << "\n";
        }
        else 
            if (ch == 75)
            {
                map[x][y] = ' '; // "Убираем" объект со старой координаты
                y--; // изменяем координаты
                map[x][y] = 'Т'; // "рисуем" объект на новом месте
                counter++; // увеличиваем значение счётчика ходов
            }
            else 
                if (ch == 77)
                {
                    map[x][y] = ' ';
                    y++;
                    map[x][y] = 'Т';
                    counter++;
                }
                else 
                    if (ch == 72)
                    {
                        map[x][y] = ' ';
                        x--;
                        map[x][y] = 'Т';
                        counter++;
                    }
                else 
                        if (ch == 80)
                        {
                            map[x][y] = ' ';
                            x++;
                            map[x][y] = 'Т';
                            counter++;
                        }
                        else
                        { /* здесь мы можем закодировать ещё какое-нибудь значение e */ }
    return e;
} // конец movement_if()


по идеи буковка должна бешать но когда она добегает до левой или правой граници она начинает с новой строкикак можно сделать чтоб она остановилась как около стени и дальше не шла?


Добавлено через 32 минуты
ауууу
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.02.2012, 21:42     Вот нашол такой код #2
какой-то левый c++.
то, что вы хотите сделать делается очень просто. вот пример движения вверх:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
elseif (ch == 75)
{
  if (y >= 0)
  {
    // т.е. теперь, прежде чем уменьшить координату и перерисовать там букву мы смотрим, а не равна ли эта координата
    // координате верхней стенки, т.е. не равна ли она нулю. Если не равна, значит мы еще не 
    // подошли к стенке и поэтому координату можно уменьшить на еденицу.
    // При движении в других направлениях, прежде чем изменять координату, точно так же 
    // нужно проверить, не является ли эта координата координатой стенки.
    // y == 0 - координата верхней границы
    // y == (mapHeight - 1) - координата нижней границы
    // x == 0 - координата левой границы
    // x == (mapWidth - 1) - координата правой границы
 
    map[x][y] = ' '; // "Убираем" объект со старой координаты
    y--; // изменяем координаты
    map[x][y] = 'Т'; // "рисуем" объект на новом месте
    counter++; // увеличиваем значение счётчика ходов
  }
}
Taras_Z
 Аватар для Taras_Z
100 / 84 / 2
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
22.02.2012, 22:12  [ТС]     Вот нашол такой код #3
да я так само написал но у меня фигура другая и вот что у меня выходит


я рисую фигуру так:


map[x][y] = ' ';
map[x][y-1] =
' ';
y++;
map[x][y] =
'Т';
map[x][y-1] =
'Т';
counter++;

и когда иду на лево до стенки то ождна буква лишается там а другая на другой стороне
T-------------------T
Изображения
 
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.02.2012, 22:46     Вот нашол такой код #4
написал же что перед изменением координаты нужно проверить, не является ли она координатой стенки. прочитайте еще раз внимательно.

char map[15][20]; - в памяти все символы размещены последовательно.
поэтому map[2][20] эквивалентно map[3][0]; т.е. несмотря на выход за пределы ширины матрицы все сходит с рук. пока не подберетесь к самому краю массива (правый нижний угол).
еще вы перепутали x c y;

C++
1
2
3
4
5
6
7
8
9
10
//Вот как работает в вашей ситуации
// тут x == 19
map[y][19] = ' ';
map[y][18] = ' '; // ок. стерли буквы
 
x++; // после этого x == 20, т.е. выход за пределы ширины матрицы, но прога пока еще не падает.
// map[y][20] = 'Т'; // из-за выхода за пределы ширины матрицы это эквивалентно map[y+1][0] = 'T';
// поэтому выполняется такой код:
map[y+1][0] = 'Т';
map[y][19] = 'Т';
Еще раз:
Чтобы такого не было, перед выполнением стирания и записи сделайте проверку
C++
1
2
3
4
if (x < 19) // 20 - 1, где 20 - ширина матрицы.
{
   // тут манипуляции с матрицей.
}
QWAN
56 / 55 / 1
Регистрация: 02.09.2008
Сообщений: 181
23.02.2012, 15:05     Вот нашол такой код #5
Вот немного подправил, работает. Немного запутался в твоих Х и Y, так что пришлост кое-что переделать.
Вложения
Тип файла: rar main.rar (1.4 Кб, 8 просмотров)
QWAN
56 / 55 / 1
Регистрация: 02.09.2008
Сообщений: 181
23.02.2012, 15:23     Вот нашол такой код #6
При изменении ширины и высоти, лучше переделать две строчки так:
C++
1
if(x==c-1)
C++
1
if(y==s-1)
Yandex
Объявления
23.02.2012, 15:23     Вот нашол такой код
Ответ Создать тему
Опции темы

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