С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Mr_Progger
24 / 24 / 9
Регистрация: 01.11.2013
Сообщений: 173
#1

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

23.11.2014, 20:59. Просмотров 880. Ответов 5
Метки нет (Все метки)

Доброго времени суток. Создаю консольную змейку. Поле на котором бегает змея это двумерный массив чаров. Змея отображается символами *
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;
}
0
Вложения
Тип файла: rar ConsoleApplication14.rar (614.8 Кб, 3 просмотров)
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2014, 20:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать управление стрелками в консольной змейке? (C++):

Управление стрелками C++ - C++
Написал программу, работает. Но вопрос в том, что когда нажимаю на стрелки, мой символ только обновляется с помощью system(&quot;cls&quot;). Нужно...

Управление стрелками в консоли - C++
Как сделать управление стрелками что-бы когда нажимаешь стрелочку выполнялось опридельоное действие вызавалась функция и тд.

Меню в консоли, управление стрелками - C++
Подскажите пожалуйста, как сделать меню типа: пункт 1 пункт 2 и так далее Чтобы между пунктами можно было перемещаться курсором и...

Движение объекта, управление стрелками. Перестает работать при нажатии любой клавиши - C++
Здравствуйте. Пишу игру в танчики. Borland C++ 3.1 1. Сейчас реализовал само движение объекта с помощью стрелок. Проблема в том, что...

Как на VC ++ в консольной программе узнать ... - C++
Как на VC ++ в консольной программе узнать, существует ли такая - то папка (или файл)?

Объясните как работает _getch() со стрелками - C++
Я недавно начал учить С++ и я совершенно не понимаю как эта функция работает со стрелками. Например код вида char ch; ch=_getch(); ...

5
Mr_Progger
24 / 24 / 9
Регистрация: 01.11.2013
Сообщений: 173
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;
}
0
Вложения
Тип файла: rar ConsoleApplication14.rar (7.41 Мб, 7 просмотров)
behollder
47 / 28 / 8
Регистрация: 23.01.2013
Сообщений: 124
Завершенные тесты: 1
25.11.2014, 01:29 #3
Потоки используй. В главном ждем ввод, в другом вертим змейку. Или что-то такое GetAsyncKeyState
0
SatanaXIII
Супер-модератор
Эксперт С++
5643 / 2678 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
25.11.2014, 09:05 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Mr_Progger Посмотреть сообщение
Как сделать управление стрелками?
Бесконечный цикл с kbhit проще всего.
Работа с while, kbhit() и getch()
( Только для вижуал студии: http://www.cyberforum.ru/blogs/34326/blog263.html )
Цитата Сообщение от Mr_Progger Посмотреть сообщение
Что стоит поменять
Геттеры сделать константными.

Цитата Сообщение от greenlight Посмотреть сообщение
Потоки используй
Сто годов они тут не нужны.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
25.11.2014, 09:24 #5
SatanaXIII, с какого это только для студии?
0
SatanaXIII
Супер-модератор
Эксперт С++
5643 / 2678 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
25.11.2014, 11:51 #6
Croessmah, отмочил неподумовши. Извиняюсь. Для винды.
0
25.11.2014, 11:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2014, 11:51
Привет! Вот еще темы с ответами:

Как создать механические часы (с циферблатом и стрелками) - C++
Всем привет) Мне в универе задали написать мех. часы, но как я поняла, они создаются при помощи классов... Меня это удивило, потому что...

Как вывести свою строку в заголовок консольной строки? - C++
Добрый вечер! Уважаемые форумчане, я делаю программу которая будет осуществлять поиск на диске, и мне нужно что бы проверяемая папка...

Добавить змейке хвостик - C++
Добрый день/утро/вечер. В общем написал консольную змейку, но не прикрепил ей хвостик, ей так грустно без хвоста и мне нужна ваша помощь в...

Найти ошибку в змейке!! - C++
Игра не полностью еще, прост решил проверить и ...Работаю в DevC++ #include &lt;graphics.h&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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