Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 26
1

Движущийся хвост змейки

01.05.2019, 11:46. Показов 1831. Ответов 12

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<Windows.h>
#include<conio.h>
#include<ctime>
using namespace std;
void print_field(HANDLE hconsole, COORD n, int x = 40, int y = 15) {
    for (int s = 0; s < y; s++) {
 
        SetConsoleCursorPosition(hconsole, n);
        for (int c = 0; c < x; c++)
            if (s == 0 || s == y - 1 || c == 0 || c == x - 1)
                cout << '+';
            else
                cout << ' ';
        cout << endl;
        n.Y++;
    }
}
void main() {
    srand(time(NULL));
    int count = 0;
    int tailX[100], tailY[100];
    HANDLE hconsole = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD n;
    COORD temp;
    COORD f;
    temp.X = 0;
    temp.Y = 0;
    n.X = 10, n.Y = 5;
    print_field(hconsole, n);
    int code = 0;
    n.X = 11, n.Y = 6;
    f.X = rand() % 38 + 11;
    f.Y = rand() % 13 + 6;
    SetConsoleCursorPosition(hconsole, f);
    cout << "0";
    do {
        if (n.Y <= 5 || n.X <= 10 || n.X >= 49 || n.Y >= 19) {
            system("cls");
            cout << "Game Over" << endl;
            cout << "YOUR SCORE is " << count << endl;
            break;
        }
        else {
            SetConsoleCursorPosition(hconsole, temp);
            cout << "YOUR SCORE: " << count;
            while (n.X == f.X && n.Y == f.Y) {
                f.X = rand() % 38 + 11;
                f.Y = rand() % 13 + 6;
                SetConsoleCursorPosition(hconsole, f);
                cout << "F";
                count++;
            }
            SetConsoleCursorPosition(hconsole, n);
            for (int i = 0; i < n.X; i++) {
                for (int j = 0; j < n.Y; j++) {
                    if(n.X)
                }
            }
/*Тут хочу придумать что-то с хвостом. Понимаю, что надо предыдущий элемент увеличить на один когда змея съела фрукт. Не могу сообразить как решить*/
            cout << "*";
            code = _getch();
            if (code == 224)code = _getch();
            switch (code) {
            case 75:
                n.X -= 1;
                break;
            case 72:
                n.Y -= 1;
                break;
            case 77:
                n.X += 1;
                break;
            case 80:
                n.Y += 1;
            }
        }
    } while (code != 13);
 
    system("pause");
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2019, 11:46
Ответы с готовыми решениями:

Игра змейка С++ . Хвост. как создать хвост змейки
День добрый помогите, не знаю как сделать хвост. Код был взят с форума и переделан. Но с хвостом не...

Хвост змейки на Unity
Здравствуйте, подскажите, как сделать хвост змейки, как в игре AxySnake. Есть предположение, что...

Хвост змейки на Unity
Здравствуйте, как сделать хвост змейки? Сейчас есть шарики, которые катаются друг за другом, но...

Нужно отсечь хвост змейки
Кто модет поставить на пусть истиный, понятно, что если ты входишь в коллайдер змейки, то удаляется...

12
10 / 8 / 3
Регистрация: 10.04.2019
Сообщений: 43
01.05.2019, 15:54 2
...........
0
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 26
01.05.2019, 15:59  [ТС] 3
Я попросил помочь мне с хвостом змеи в МОЕМ коде, зачем мне целый код змеи, таких полно в интернете. Спасибо за понимание.
0
3672 / 2856 / 785
Регистрация: 25.03.2012
Сообщений: 10,476
Записей в блоге: 1
01.05.2019, 16:41 4
Это похвально, что ты хочешь разобраться, но для хранения змейки "в переменной", одной координаты недостаточно.
Заводи себе массив/вектор/список/лучше конечно очередь из координат клеток тела змейки.
По одной координате головы, или даже по нескольким координатам, например головы и хвоста, ты её не воспроизведёшь.
1
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 26
01.05.2019, 17:47  [ТС] 5
Да, мне говорили, что нужно хранить массив змеи из координат ее хвоста. Я не понимаю как заставить хвост бегать за змеей и расти по съедению фрукта
0
10 / 8 / 3
Регистрация: 10.04.2019
Сообщений: 43
01.05.2019, 19:02 6
.......
0
3672 / 2856 / 785
Регистрация: 25.03.2012
Сообщений: 10,476
Записей в блоге: 1
01.05.2019, 19:03 7
pogen, по принципу очереди
0
2 / 2 / 0
Регистрация: 14.03.2019
Сообщений: 25
01.05.2019, 20:14 8
pogen, Начните лучше имхо с морского боя, там двухмерный массив для поля, и поднаберетесь опыта манипулирования состоянием массива. А я сам хотел гоночки написать, даже немного сделал, но оказалось дорога в другую сторону движется, согласно стандартному выводу поэтому отложил это дело
0
3672 / 2856 / 785
Регистрация: 25.03.2012
Сообщений: 10,476
Записей в блоге: 1
01.05.2019, 20:17 9
new Anatoly, да почему же? Змейка гораздо проще, всего одна динамическая очередь из координат тела и её ежетактное обновление.
0
815 / 502 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
01.05.2019, 20:55 10
pogen, Как вариант, можно создать класс аля 'SnakeBody' хранящий координаты одного элемента и прочее, затем создать вектор (изначально 1 элемент голова уже должен быть там) и наполнять его объектами того класса, когда что-то съели. А вот для перемещения змеи можно брать последний элемент хвоста, и сказать что теперь это голова. То-есть не мусолить массив, а просто менять координаты внутри хвостового элемента на те, куда змея должна шагнуть. Заодно поиграетесь с указателями, ведь надо будет отслеживать начало и конец змеи. Запутанно рассказал, так что уточню: сам вектор при перемещении трогать не надо, только менять координаты внутри объектов класса.
0
3672 / 2856 / 785
Регистрация: 25.03.2012
Сообщений: 10,476
Записей в блоге: 1
01.05.2019, 20:56 11
nalbe666, ты сам-то пробовал делать то, что предлагаешь?
0
815 / 502 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
01.05.2019, 20:58 12
Kuzia domovenok, ясен пень, что такого сложного?

Не по теме:



Миниатюры
Движущийся хвост змейки  
1
3672 / 2856 / 785
Регистрация: 25.03.2012
Сообщений: 10,476
Записей в блоге: 1
01.05.2019, 21:05 13
nalbe666, нифига не понял, я говорю об этом принципе
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
#include <windows.h>
#include <list>
using namespace std;
int main()
{
    list<COORD> snake({ { 5, 0 },{ 4, 0 },{ 3, 0 },{ 2, 0 },{ 1, 0 } });
    COORD dir = { 1, 0 };
    bool gameover = false;
    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    while (!gameover)
    {
        if (GetAsyncKeyState(VK_LEFT) & 0x1) dir = { -1, 0 };
        if (GetAsyncKeyState(VK_UP) & 0x1) dir = { 0, -1 };
        if (GetAsyncKeyState(VK_DOWN) & 0x1) dir = { 0, 1 };
        if (GetAsyncKeyState(VK_RIGHT) & 0x1) dir = { 1, 0 };
 
        COORD head = snake.front();
        head.X += dir.X;
        head.Y += dir.Y;
        {///пишем пробел в хвост
            unsigned long  written;
            SetConsoleCursorPosition(out, snake.back());
            WriteConsole(out, " ", 1, &written, NULL);
        }
        snake.pop_back();//удаляем хвост
        for (list<COORD>::iterator it = snake.begin(); it != snake.end() && !gameover; ++it)
            gameover = (it->X == head.X && it->Y == head.Y);//проверка всех клеток на столкновение с головой.
 
        snake.push_front(head);//добавим голову
        {///пишем клетку в голову
            unsigned long  written;
            SetConsoleCursorPosition(out, head);
            WriteConsole(out, "*", 1, &written, NULL);
        }
        Sleep(300);
    }
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2019, 21:05

Голова хвост
Нужно просто поменять местами голову и хвост списка, вот, что я наделал: (defun...

Создание змейки
движение головы автоматически происходит. это не суть void MoveSnake(Vector3 newPosition) {...

Движение змейки
Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles...

Перемещение змейки
#include &lt;iostream&gt; //стандартная библиотека #include &lt;time.h&gt; //случайные числа #include...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru