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

проверка коллизии - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Rashgild
 Аватар для Rashgild
4 / 4 / 1
Регистрация: 21.04.2011
Сообщений: 23
14.09.2012, 03:06     проверка коллизии #1
Элемент массива со значением "2" - игрок, хочу сделать, чтобы он не мог "наступать" на элементы со значением "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
#include <iostream>
#include <conio.h>
#include <Windows.h>
 
using namespace std;
 
int  x   = 1,    //х координата игрока
     y   = 1;   //у координата игрока
   
int mas[5][5] = 
{
    {1,1,1,1,1},
    {1,2,0,0,1},
    {1,0,1,1,1},
    {1,0,0,0,1},
    {1,1,1,1,1}
    
};
 
void cls () 
{ system("cls");}
 
void display()
{
    for(int i=0; i<5; ++i)
    {
        for(int j=0; j<5; ++j)
        {
            if(mas[i][j] ==1) {cout<<"#";}
            if(mas[i][j] ==0) {cout<<".";}
            if(mas[i][j] ==2) { cout<<"x";}
        }
        if(mas[5]) cout<<endl;
    }
}
 
int main()
{
    setlocale(LC_ALL, "russian");   
    int kd;
    while(1)
    {
    cls();
    display();
//  cout<<kd;
    cout<<"\n\n-------------\n"
        <<"| x="<<x<<" | "<<"y="<<y<<" |\n"
        <<"-------------\n";
    kd= _getch();
    kd = _getch();
    if(kd==80 && x!=3 /*&& (x&&y ==2)*/ ){ 
        mas[x][y]=0;
        mas[x+1][y]=2;
        kd=0; x++;
    }
    if(kd==72 && x!=1){ 
        mas[x][y]=0;
        mas[x-1][y]=2;
        kd=0; x--; 
    }
    if(kd==77 && y!=3)
    { 
        mas[x][y]=0;
        mas[x][y+1]=2;
        kd=0; y++;
    }
    if(kd==75 && y!=1)
    { 
        mas[x][y]=0;
        mas[x][y-1]=2;
        kd=0; y--;}
    }
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2012, 03:06     проверка коллизии
Посмотрите здесь:

C++ Проверка!
проверка C++
Проверка с if C++
C++ Проверка if
C++ Проверка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ProNoooob
71 / 71 / 6
Регистрация: 14.10.2009
Сообщений: 121
14.09.2012, 04:12     проверка коллизии #2
Это же элементарно.
+ проверка выхода за границы массива.

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
#include <iostream>
#include <conio.h>
#include <Windows.h>
 
using namespace std;
 
int  x   = 1,    //х координата игрока
     y   = 1;    //у координата игрока
   
int mas[5][5] = 
{
    {1,1,1,1,1},
    {1,2,0,0,1},
    {1,0,1,1,1},
    {1,0,0,0,1},
    {1,1,1,1,1}
};
 
void display()
{
    for(int i=0; i<5; ++i)
    {
        for(int j=0; j<5; ++j)
        {
            if(mas[i][j] ==1) {cout<<"#";}
            if(mas[i][j] ==0) {cout<<".";}
            if(mas[i][j] ==2) {cout<<"x";}
        }
        cout<<endl;
    }
}
 
void move(int _x, int _y)
{
    if(x > 0 && x < 5 && y > 0 && y < 5)
    {
        if(mas[_x][_y] != 1)
        {
            mas[x][y] = 0;
            mas[_x][_y] = 2;
 
            x = _x;
            y = _y;
        }
    }
}
 
int main()
{
    setlocale(LC_ALL, "russian");   
 
    for(int kd = 0; "forever"; kd = _getch())
    {
        switch(kd)
        {
        case 80:
            move(x + 1, y);
            break;
        case 72:
            move(x - 1, y);
            break;
        case 77:
            move(x, y + 1);
            break;
        case 75:
            move(x, y - 1);
            break;
        default:
            break;
        }
        system("cls");
        display();
        
        cout<<"\n\n-------------\n"
            <<"| x="<<x<<" | "<<"y="<<y<<" |\n"
            <<"-------------\n";
    }
 
    system("pause");
    return 0;
}
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
14.09.2012, 05:54     проверка коллизии #3
Если граница всегда состоит из 1, то проверку:
Цитата Сообщение от ProNoooob Посмотреть сообщение
C++
1
if(x > 0 && x < 5 && y > 0 && y < 5)
можно не делать
Rashgild
 Аватар для Rashgild
4 / 4 / 1
Регистрация: 21.04.2011
Сообщений: 23
17.09.2012, 19:26  [ТС]     проверка коллизии #4
Хочу вновь вернуться к этой теме, дабы не плодить тем. Спасибо ответившим выше.

Вопрос теперь следующий: При совершении шага игрока, массив начинает перерисовываться, в маленьком массиве этого не видно, но уже в 20х20 становится заметно. Знаю , в игровых движках используется видеобуфер. Поискав информацию "с++ видеобуфер" , наткнулся на некие "хэндлы".
Так что же это такое - handle и с чем его едят?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.09.2012, 19:35     проверка коллизии #5
хендл - это ни о чем. слишком общая штука, которая относится ко всяким ресурсам системы.
лучше копать в сторону двойной буферизации.
Но в консольной графике даже не знаю пригодится это или нет. Вот кстати я тут недавно приводил примеры, как можно было бы замутить хоть какую-то анимацию в консоле:
Закон отражения в ограниченой зоне на консольном приложении
последний код оттуда:
Закон отражения в ограниченой зоне на консольном приложении
Rashgild
 Аватар для Rashgild
4 / 4 / 1
Регистрация: 21.04.2011
Сообщений: 23
18.09.2012, 00:35  [ТС]     проверка коллизии #6
Проблема была решена невероятно простым способом, вместо system("cls"); была использована функция установки курсора в координаты (0,0), после которой идет "отрисовка поверх отрисованного", что делает не заметным это "мерцание"

вот функция:
C++
1
2
3
4
5
6
7
void setcur(int x, int y)
{
COORD xory;
xory.Y = y;
xory.X = x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), xory);
}
___
Кстати , реализация двойной буферизации ничего толком не дала (по крайне мере в моем исполнении))
Yandex
Объявления
18.09.2012, 00:35     проверка коллизии
Ответ Создать тему
Опции темы

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