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

Как сделать управление стрелками в консольной змейке? - C++

Восстановить пароль Регистрация
 
Mr_Progger
22 / 22 / 9
Регистрация: 01.11.2013
Сообщений: 163
23.11.2014, 20:59     Как сделать управление стрелками в консольной змейке? #1
Доброго времени суток. Создаю консольную змейку. Поле на котором бегает змея это двумерный массив чаров. Змея отображается символами *
1 - Змейка не управляема. Как сделать управление стрелками? если делать просто через std:cin то движение змейки будет останавливаться пока не будет нажата клавиша.

2 - Проблема с функцией Snake::Eat. По смыслу если на пути попадается символ '*', то в змею добавляться кусок (Point с координатами этой '*' добавляем в начало дека), на деле получается ерунда

3 - Как сделать так чтобы при запуске приложение было развернуто?

4 - Что стоит поменять в коде в плане хорошего стиля и правильного подхода к написанию кода?

Point.h - класс для описания куска змеи
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
class Point
{
    int x;
    int y;
public:
    Point(int xx = 0, int yy = 0) : x(xx), y(yy) {};
    Point(const Point&);
    void SetPoint();
    int GetPointX() { return x; };
    int GetPointY() { return y; };
};

Point.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "Point.h"
 
 
Point::Point(const Point& p)
{
    x = p.x;
    y = p.y;
}
 
 
void Point::SetPoint()
{
    if (x + 1 <= 50)
        x++;
    else
        x = 0;
}

Snake.h - класс для описания змеи целиком
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
#include <deque>
#include "Point.h"
class Snake
{
    std::deque<Point> snake;
public:
    void AddSnake(const Point&);
    bool pr(int, int);
    void MoveSnake();
    void Eat(char, int, int);
    Snake();
    ~Snake();
};

Snake.cpp
Кликните здесь для просмотра всего текста

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
#include "Snake.h"
 
 
void Snake::AddSnake(const Point& p ) //Создание 
{
    snake.push_front(p);
}
 
void Snake::Eat(char c, int ii, int jj )  // Ест
{
    std::deque<Point>::iterator iter;
    for (iter = snake.begin(); iter != snake.end(); iter++)
    if ((*iter).GetPointX() == jj && (*iter).GetPointY() == ii && c == '*')
    {
        snake.push_front(Point(ii, jj));
        return;
    }
}
 
bool Snake::pr(int ii, int jj)  // Если кордината куска змеи совпадает с i j циклов из мейна то вернуть true
{
    bool p = false;
    std::deque<Point>::iterator iter;
    for (iter = snake.begin(); iter != snake.end() ; iter++)
        if ((*iter).GetPointX() == jj && (*iter).GetPointY() == ii)
            p = true;
    return p;
}
 
 
void Snake::MoveSnake()  // Двигаем змею. Голова получает новые координаты, каждый кусок змеи получет старые координаты впереди идущего куска
{
    for (size_t i = snake.size()-1; i > 0; i--)
        snake[i] = snake[i - 1];
    snake[0].SetPoint();
}
 
 
Snake::Snake()
{
}


Main.cpp
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <deque>
#include <Windows.h>
#include "Point.h"
#include "Snake.h"
 
 
int main()
{
 
    char pole[50][50];
    Point snake1(0, 5);
    Point snake2(1, 5);
    Point snake3(2, 5);
    Point snake4(3, 5);
    Snake BigSnake;
    BigSnake.AddSnake(snake4);
    BigSnake.AddSnake(snake3);
    BigSnake.AddSnake(snake2);
    BigSnake.AddSnake(snake1);
    while (1)
    {
        for (size_t i = 0; i < 50; i++)         
        for (size_t j = 0; j < 50; j++)
        {
            
            BigSnake.Eat(pole[i][j], i, j);
            if (BigSnake.pr(i,j))
                pole[i][j] = '*';
            else
                pole[i][j] = ' ';
        }   
        for (size_t i = 0; i < 50; i++)
        {
            for (size_t j = 0; j < 50; j++)
                std::cout << pole[i][j];
            std::cout << std::endl;
        }
 
        Sleep(500);
        BigSnake.MoveSnake();
        system("cls");
    }
    system("pause");
    return 0;
}
Вложения
Тип файла: rar ConsoleApplication14.rar (614.8 Кб, 3 просмотров)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr_Progger
22 / 22 / 9
Регистрация: 01.11.2013
Сообщений: 163
24.11.2014, 21:50  [ТС]     Как сделать управление стрелками в консольной змейке? #2
Поправил, теперь змейка ест и растёт. Как сделать управление стрелками?

snake.h
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
#include <deque>
#include "Point.h"
class Snake
{
    std::deque<Point> snake;
    Point hvost, golova;   //коородината хвоста и головы змеи
public:
    void AddSnake(const Point&);        //увеличение змеи
    std::deque<std::pair<int,int>> pr();
    void MoveSnake();
    void Eat();
    void Hvost();
    void Golova();
    Point GetHvost();
    Point GetGolova();
    Snake();
    ~Snake();
};


shake.cpp
Кликните здесь для просмотра всего текста

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
#include "Snake.h"
 
 
void Snake::AddSnake(const Point& p ) //Создание 
{
    snake.push_front(p);
}
 
void Snake::Eat()  // Ест
{
    snake.push_back(hvost);
}
 
 
std::deque<std::pair<int, int>> Snake::pr()  //Форимрование массива кородинат каждого куска змеи для дальнейшего занесения в массив поля
{
    std::deque<Point>::iterator iter;
    std::pair<int, int> xy;
    std::deque<std::pair<int, int>> dek;
    for (iter = snake.begin(); iter != snake.end(); iter++)
    {
        xy.first = (*iter).GetPointX();
        xy.second = (*iter).GetPointY();
        dek.push_back(xy);
    }
 
    return dek;
}
 
 
void Snake::MoveSnake()  // Двигаем змею. Голова получает новые координаты, каждый кусок змеи получет старые кородинаты впереди идущего куска
{
    for (size_t i = snake.size()-1; i > 0; --i)
        snake[i] = snake[i - 1];
    snake[0].SetPoint();
}
 
 
void Snake::Hvost()
{
    std::deque<Point>::iterator iter = --snake.end();
    Point temp((*iter).GetPointX(), (*iter).GetPointY());
    hvost = temp;
}
 
void Snake::Golova()
{
    std::deque<Point>::iterator iter = snake.begin();
    Point temp((*iter).GetPointX(), (*iter).GetPointY());
    golova = temp;
}
 
 
Point Snake::GetHvost()
{
    return hvost;
}
 
Point Snake::GetGolova()
{
    return golova;
}
 
Snake::Snake()
{
}
 
 
Snake::~Snake()
{
}


Point.h
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
class Point
{
    int x;
    int y;
public:
    Point(int xx = 0, int yy = 0) : x(xx), y(yy) {};
    Point(const Point&);
    void SetPoint();
    int GetPointX() { return x; };
    int GetPointY() { return y; };
};


Point.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "Point.h"
 
 
Point::Point(const Point& p)
{
    x = p.x;
    y = p.y;
}
 
 
void Point::SetPoint()
{
    if (x + 1 < 30)
        x++;
    else
        x = 0;
}


main.cpp
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <deque>
#include <Windows.h>
#include "Point.h"
#include "Snake.h"
 
 
int main()
{
    int const n = 30;
    char pole[n][n];
    Point snake1(0, 5);
    Point snake2(1, 5);
    Point snake3(2, 5);
    Point snake4(3, 5);
    Snake BigSnake;
 
    BigSnake.AddSnake(snake4);
    BigSnake.AddSnake(snake3);
    BigSnake.AddSnake(snake2);
    BigSnake.AddSnake(snake1);
    
    while (1)
    {   
            
        BigSnake.Golova();
        for (size_t i = 0; i < n; i++)
        for (size_t j = 0; j < n; j++)
            pole[i][j] = ' ';
        pole[5][9] = '*';
        if (BigSnake.GetGolova().GetPointX() == 9 && BigSnake.GetGolova().GetPointY() == 5)
            BigSnake.Eat();
        std::deque<std::pair<int, int>> dek = BigSnake.pr();
        std::deque<std::pair<int, int>>::iterator iter;
        for (iter = dek.begin(); iter!=dek.end(); iter++)
            pole[(*iter).second][(*iter).first] = '*';
 
 
        
        for (size_t i = 0; i < n; i++)
        {
            for (size_t j = 0; j < n; j++)
                std::cout << pole[i][j];
            std::cout << std::endl;
        }
 
 
        BigSnake.Hvost();
        Sleep(200);
        BigSnake.MoveSnake();
        system("cls");
    }  
 
    system("pause");
    return 0;
}
Вложения
Тип файла: rar ConsoleApplication14.rar (7.41 Мб, 5 просмотров)
greenlight
 Аватар для greenlight
39 / 20 / 7
Регистрация: 23.01.2013
Сообщений: 104
Завершенные тесты: 1
25.11.2014, 01:29     Как сделать управление стрелками в консольной змейке? #3
Потоки используй. В главном ждем ввод, в другом вертим змейку. Или что-то такое GetAsyncKeyState
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
25.11.2014, 09:05     Как сделать управление стрелками в консольной змейке? #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Mr_Progger Посмотреть сообщение
Как сделать управление стрелками?
Бесконечный цикл с kbhit проще всего.
Работа с while, kbhit() и getch()
( Только для вижуал студии: http://www.cyberforum.ru/blogs/34326/blog263.html )
Цитата Сообщение от Mr_Progger Посмотреть сообщение
Что стоит поменять
Геттеры сделать константными.

Цитата Сообщение от greenlight Посмотреть сообщение
Потоки используй
Сто годов они тут не нужны.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
25.11.2014, 09:24     Как сделать управление стрелками в консольной змейке? #5
SatanaXIII, с какого это только для студии?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
25.11.2014, 11:51     Как сделать управление стрелками в консольной змейке? #6
Croessmah, отмочил неподумовши. Извиняюсь. Для винды.
Yandex
Объявления
25.11.2014, 11:51     Как сделать управление стрелками в консольной змейке?
Ответ Создать тему
Опции темы

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