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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.81
Duran
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 13
#1

Игра Змейка (хвост змеи) - C++

08.08.2009, 17:52. Просмотров 6430. Ответов 6
Метки нет (Все метки)

Немогу сообразить каким способом пришить змее хвост.Подкиньте пару идей.
PS:грубо,страшно написано но я пока по другому не умею )

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include<iostream>
#include<windows.h>
#include<conio.h>
using namespace std;
const int Y = 20, X = 50;
enum DIR{UP, DOWN, LEFT, RIGHT};
void main()
{
    int a[Y][X] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
    
    int currScore=0,Score=200,Speed=300;
    int lives = 100;//счетчик жизней
    int i,j,code='w';
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = {25,10};// Координаты смайла
    COORD coordjab={15,15};
    COORD coordLives = {0,21};// Координаты вывода счетчика жизней
    COORD coordScore = {0,22};// Координаты вывода счетчика Очков
    COORD coordSpeed = {0,23};// Координаты вывода счетчика Очков
/////Отрисовка поля>>>
    for(i=0;i<Y;i++)
    {
        for(j=0;j<X;j++)
        {
            switch(a[i][j]) 
            {
            case 1:cout << (char)177;break;
            case 0:cout << ' ';break;
            }
        }
        cout << '\n';
    }
/////Отрисовка поля>>>
 
/////Движение червя>>>
    while(code)
    {
        Sleep(Speed);//Задержка движения
    if(_kbhit())//Если пользователь нажал клавишу
        {
            code = _getch();//Получаем ее код
        }
    else
        {
        SetConsoleCursorPosition(console,coord);
            cout << ' ' << flush;//Стираем смайл
            if(code=='w')coord.Y--;
            else if(code=='s')coord.Y++;
            else if(code=='a')coord.X--;
            else if(code=='d')coord.X++;
        }
    //SetConsoleCursorPosition(console,udav[i]);
/////Движение червя>>>
/////Отрисовка яблока>>>
    if(coordjab.X==coord.X && coordjab.Y==coord.Y)
    {
        currScore+=100;
        SetConsoleCursorPosition(console,coordjab);
        coordjab.X = rand() % 48+1; //
        coordjab.Y = rand() % 18+1; //кординаты яблока
    }
/////Отрисовка яблока>>>
    if(Score==currScore)
    {
        Score+=300;
        Speed-=10;
    }
 
 
    if(a[coord.Y][coord.X] == 1)
            {
                lives--;
                coord.X = 25;
                coord.Y = 10;
            }
    if(lives == 0)
        {
            system("cls");
            COORD center={35,15};
            SetConsoleCursorPosition(console,center);
            cout << " G A M E  O V E R!!!\n\n\n\n"<<flush;
            _getch();
            break;
        }
        //червь
        SetConsoleTextAttribute(console, FOREGROUND_GREEN|FOREGROUND_INTENSITY);//Цвет смайла - зеленый
        SetConsoleCursorPosition(console,coord);
        cout << (char)1 << flush;//Выводим смайл
        SetConsoleTextAttribute(console, FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED);//Возвращаем белый цвет
        //яблоко
        SetConsoleCursorPosition(console,coordjab);
        SetConsoleTextAttribute(console, FOREGROUND_RED|FOREGROUND_INTENSITY);//Цвет врага - красный
        cout << (char)2 << flush;//Рисуем
        SetConsoleTextAttribute(console, FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED);//Возвращаем белый цвет
        //жизни
        SetConsoleCursorPosition(console,coordLives);
        cout << "Lives: " << lives << flush;
        SetConsoleCursorPosition(console,coordScore);
        cout << "Score: " << currScore << flush;
        SetConsoleCursorPosition(console,coordSpeed);
        cout << "Speed: " << Speed << flush;
    }//while(code)
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
08.08.2009, 18:15     Игра Змейка (хвост змеи) #2
Цитата Сообщение от Duran Посмотреть сообщение
Немогу сообразить каким способом пришить змее хвост.
хвост - это ещё одна голова. т.е. яблоко скушали - две головы теперь. ещё одно - три головы. и все головы дружно перемещаются одна за другой
Duran
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 13
08.08.2009, 19:15  [ТС]     Игра Змейка (хвост змеи) #3
не судьба моей змейке быть с хвотом...надоело химичить.
rangerx
1922 / 1531 / 139
Регистрация: 31.05.2009
Сообщений: 2,894
09.08.2009, 14:49     Игра Змейка (хвост змеи) #4
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <iostream>
#include <ctime>
 
#include <windows.h>
#include <conio.h>
 
using std::cout;
using std::flush;
 
const int Y = 20, X = 50;
enum DIR{UP, DOWN, LEFT, RIGHT};
 
/*функция для перестановки звеньев змейки местами: т.е. если,
  к примеру, у змейки 4 звена, то 4-ое становится 3-им, 3-е становится 2-ым,
  2-ое становится 1-ым, а 1-ое(голова змеи) в последствии перемещается на новую координату*/
//================================================================
void rebuild_snake(COORD *array, int array_count)
{
    for(int i = array_count-1; i >= 1; --i)
        array[i] = array[i-1];
 
}
//================================================================
 
int main()
{
 
        srand(time(NULL));
 
        int a[Y][X] = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} };
 
        int count = 1;               // количество звеньев в змейке
        int lives = 100;             // счетчик жизней
        int i, j, code = 'w';
        int currScore = 0, Score = 200, Speed = 300;
 
        HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD coord[10] = {{25,10}}; // Координаты смайла(размер массива можно увеличить или использовать динамический)
        COORD coordjab={15,15};
        COORD coordLives = {0,21};   // Координаты вывода счетчика жизней
        COORD coordScore = {0,22};   // Координаты вывода счетчика Очков
        COORD coordSpeed = {0,23};   // Координаты вывода счетчика Очков
 
/////Отрисовка поля>>>
        for(i = 0; i < Y; ++i)
        {
                for(j = 0;j < X; ++j)
                {
                        switch(a[i][j])
                        {
                            case 1 : cout << (char)177;break;
                            case 0 : cout << ' ';break;
                        }
                }
                cout << '\n';
        }
/////Отрисовка поля>>>
 
/////Движение червя>>>
        while(code)
        {
            Sleep(Speed);                 // Задержка движения
            if(_kbhit()) code = _getch(); // Если пользователь нажал клавишу получаем ее код
            else
            {
                SetConsoleCursorPosition(console, coord[count-1]);
                cout << ' ' << flush; // Стираем смайл
 
                rebuild_snake(coord, count);
 
                if(code=='w')--coord[0].Y;
                else if(code=='s')++coord[0].Y;
                else if(code=='a')--coord[0].X;
                else if(code=='d')++coord[0].X;
            }
 
/////Движение червя>>>
/////Отрисовка яблока>>>
            if(coordjab.X==coord[0].X && coordjab.Y==coord[0].Y)
            {
                ++count;  // увеличиваем количество звеньев змейки
                currScore+=100;
                SetConsoleCursorPosition(console, coordjab);
 
                rebuild_snake(coord, count);
 
                coord[0].X = coordjab.X;
                coord[0].Y = coordjab.Y;
 
                /*без этого получается немного некрасиво )))
                  но при этом взять яблоко в такой ситуации
                |         
                |0 @@@   
                |         
                не получится. Только так  
                |@
                |@
                |@
                |         
                |0    
                |         
                хотя можно попробовать это исправить, но это уже без меня ))...*/
                if(code=='w')--coord[0].Y;
                else if(code=='s')++coord[0].Y;
                else if(code=='a')--coord[0].X;
                else if(code=='d')++coord[0].X;
                /*...*/
 
                coordjab.X = rand() % 48+1; //
                coordjab.Y = rand() % 18+1; // кординаты яблока
            }
/////Отрисовка яблока>>>
            if(Score==currScore) Score+=300, Speed-=10;
 
            if(a[coord[0].Y][coord[0].X] == 1)
            {
                --lives;
                coord[0].X = 25;
                coord[0].Y = 10;
            }
            if(lives == 0)
            {
                system("cls");
                COORD center = {35,15};
                SetConsoleCursorPosition(console,center);
                cout << " G A M E  O V E R!!!\n\n\n\n" << flush;
                _getch();
                break;
            }
 
 
 
            //**********************************************************************червь
            for(int i = 0; i < count; ++i)
            {
                SetConsoleTextAttribute(console, FOREGROUND_GREEN|FOREGROUND_INTENSITY);            // Цвет смайла - зеленый
                SetConsoleCursorPosition(console, coord[i]);
                cout << (char)1 << flush;                                                           // Выводим смайл                                                            //перестраиваем нашу змейку
            }
 
            SetConsoleTextAttribute(console, FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED);      // Возвращаем белый цвет
 
            //*********************************************************************яблоко
            SetConsoleCursorPosition(console,coordjab);
            SetConsoleTextAttribute(console, FOREGROUND_RED|FOREGROUND_INTENSITY);                  // Цвет врага - красный
            cout << (char)2 << flush;                                                               // Рисуем
            SetConsoleTextAttribute(console, FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED);      // Возвращаем белый цвет
 
            //**********************************************************************жизни
            SetConsoleCursorPosition(console,coordLives);
            cout << "Lives: " << lives << flush;
            SetConsoleCursorPosition(console,coordScore);
            cout << "Score: " << currScore << flush;
            SetConsoleCursorPosition(console,coordSpeed);
            cout << "Speed: " << Speed << flush;
        }//while(code)
 
        return 0;
}
Otaka
1821 / 677 / 18
Регистрация: 11.12.2008
Сообщений: 1,019
09.08.2009, 14:54     Игра Змейка (хвост змеи) #5
Вообще, то элементы совершенно необязательно переставлять полностью. Нужно просто взять последний элемент хвоста, и поставить его перед головой. Алгоритм очень простой.
rangerx
1922 / 1531 / 139
Регистрация: 31.05.2009
Сообщений: 2,894
09.08.2009, 15:48     Игра Змейка (хвост змеи) #6
Нужно просто взять последний элемент хвоста, и поставить его перед головой. Алгоритм очень простой.
Звучит конечно красиво... Если змейка у нас массив, то переставив последний элемент перед головой(получается на место первого элемента массива естественно), не станет ли у нас бывший первый елемент теперь вторым, а второй третьим и т.д(т.е. не произойдёт ли смещение элементов)? Или змейка у нас не массив?
И как поставить последний на место первого, если последний имеет свои координаты(находится в противоположном направлении)...
P.S. Если немного не понял идею, то заранее извиняюсь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2009, 16:04     Игра Змейка (хвост змеи)
Еще ссылки по теме:

C++ Баг в функции еды, игра змейка (Glut + C++)
C++ Почему в выводе отбросился хвост из ffffff?
C++ Игра Змейка. Нужны входные и выходные данные
Игра Змейка. Узнать по коду что за сюрприз в конце + как изменить начальную заставку? C++
C++ Игра Змейка. Узнать по коду что за сюрприз в конце

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

Или воспользуйтесь поиском по форуму:
Otaka
1821 / 677 / 18
Регистрация: 11.12.2008
Сообщений: 1,019
09.08.2009, 16:04     Игра Змейка (хвост змеи) #7
Массив конечно, но массив кольцевой. В линейном массиве у нас есть индексы головы и хвоста. Типа как в буффере клавиатуры МС-ДОС. Такой алгоритм змейки используется в тетрисах, и других очень маломощных устройствах. Но, конечно же , подойдет и любой другой алгоритм, ведь чего стоит передвинуть несколько элементов массива для современного компа?

Добавлено через 3 минуты 10 секунд
Можешь глянуть в тему Подскажите с управлением в "Змейке"..
Yandex
Объявления
09.08.2009, 16:04     Игра Змейка (хвост змеи)
Ответ Создать тему
Опции темы

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