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

"Змейка", C++ (консоль) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 53, средняя оценка - 4.68
Tabula
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 6
14.02.2013, 01:13     "Змейка", C++ (консоль) #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
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <iostream>
#include <string>
 
using namespace std;
 
char a[50][50];//размер поля в котором пройдет игра
int co_x[50], co_y[50];//координаты массива по х и у
const int N = 15, M = 45;////N - размер таблицы, а именно высота, M - ширина таблицы
int score;//
int num = 2;//num - количество ячеек змейки
 
void gotoxy( int column, int line )
    {
        COORD coord;
        coord.X = column;
        coord.Y = line;
        SetConsoleCursorPosition(
        GetStdHandle( STD_OUTPUT_HANDLE ),
        coord
    );
   }
 
void pole()// заполняем массив поля
    {
        for (int i = 0; i <= N + 1; ++i)
        for (int j = 0; j <= M + 1; ++j)
        a[i][j] = (i == 0 || j == 0 || i == N + 1 || j == M + 1 ? '#' : ' '); // выводим поле под игру
    }
 
void draw_wall()//выстраиваем края поля и прорисовываем их
    {
        system("cls");//очищаем экран
 
        for (int i = 0; i <= N + 1; ++i)
        for (int j = 0; j <= M + 1; ++j)
        cout << a[i][j] << (j <= M ? "" : "\n");
        cout << "\n";
 
        cout <<"Score : "<<score<<"\n\n";//счетчик
    }
 
void zmeika_start ()//определяем первоначальные коодинаты змейки
    {
        num = 2;
 
        co_x[1] = 1;
        co_y[1] = 1;
        co_x[2] = 2;
        co_y[2] = 1;
 
        for (int i = 1; i <= num; ++i)
        a[co_y[i]][co_x[i]] = '$';
    }
 
void check_coordinates() // проверяем, не вышла ли змейка за поле, если да то возвращаем ее обратно
 {
    if (co_x[1] > N) co_x[1] = 1;
    if (co_x[1] < 1) co_x[1] = N;
    if (co_y[1] > M) co_y[1] = 1;
    if (co_y[1] < 1) co_y[1] = M;
 }
 
void move ()// движение змейки
    {
    int temp_dir = 1;
    do
        {
            gotoxy (co_x[0],co_y[0]);
            cout << " ";
            for (int i =0; i< num-1; i++)
                {
                co_x[i] = co_x[i+1];
                co_y[i] = co_y[i+1];
                gotoxy (co_x[i],co_y[i]);
                cout <<"$";
 
                if (i>0)
                temp_dir = (co_x[i]-co_x[i-1])-2*(co_y[i]-co_y[i-1]);
                }
 
            check_coordinates();
 
            switch (temp_dir)
                {
                    case 1: co_x[num-1] += 1; 
                        break;
                    case -1: co_x[num-1] -= 1;
                        break;
                    case 2: co_y[num-1] -= 1;
                        break;
                    case -2: co_y[num-1] += 1; 
                        break;
                }
            
                gotoxy (co_x[num-1], co_y[num-1]);
                cout << "$";
                Sleep(100);
        }
        while (1);
    }
 
 
int main()// основная функция игры
    {
        pole ();
        zmeika_start ();
        draw_wall();
        check_coordinates();
        move();
        
        return 0;
    }
У меня вопрос, что не так с проверкой координат "змейки", т.к. она теперь бегает только до середины поля?-((((хотя раньше вообще за поля убегала, так как ограничений по координатам не было.

Спасибо за подсказку.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
14.02.2013, 06:16     "Змейка", C++ (консоль) #2
У вас с осями путаница. В функции void check_coordinates() M и N поменяйте местами.
KofeMNE
 Аватар для KofeMNE
5 / 5 / 1
Регистрация: 27.08.2009
Сообщений: 95
14.02.2013, 07:11     "Змейка", C++ (консоль) #3
http://www.youtube.com/watch?v=cEWNPLtBTAM Посмотрите этот видеоурок. В нем полностью объясняется как создать змейку средствами OpenGL.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
14.02.2013, 09:35     "Змейка", C++ (консоль) #4
Если это C++ то должен быть класс Snakes например в отдельных файлах .cpp .h посмотрите список литературы по C++ в этом форуме.

Также я бы сделал отдельный класс, который обновляет содержимое экрана
Tabula
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 6
20.02.2013, 00:20  [ТС]     "Змейка", C++ (консоль) #5
Вот что в итоге у меня получилось...

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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <iostream>
#include <string>
 
using namespace std;
 
#define DIR_RIGHT 1
#define DIR_LEFT -1
#define DIR_UP    2
#define DIR_DOWN -2
 
char a[50][50]; //размер поля в котором строится игра
int co_x[50], co_y[50], foodx, foody; //координаты змейки и еды
const int height = 16, width = 46; // высота игрового поля и ширина
int num = 2; //num - длинна первоначальной змейки
int direction=1;//изначально движение начинаем вправо 
int score = 0;// начальный подсчет очков
 
 
void gotoxy (int column, int line) 
{ //ремещаем курсор на заданную позицию
 
    COORD coord;
    coord.X = column;
    coord.Y = line;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
 
void init_field () 
    { 
 
        // инициализируем игровое поле
        for (int i = 0; i <= height; ++i) 
            for (int j = 0; j <= width; ++j)
                a[i][j] = (i == 0 || j == 0 || i == height || j == width ? '#' : ' '); //определяем границы
 
        // инициализируем структуру змейки
        num = 2;
 
        co_x[0] = 1;
        co_y[0] = 1;
        co_x[1] = 2;
        co_y[1] = 1;
 
        a[1][1] = '$';
        a[1][2] = '$';
 
    }
 
void generate_food ()  // размещаем еду на экране
    {  
 
        foody = (rand() % 15)+1;
        foodx = (rand() % 45)+1;
 
        gotoxy(foodx, foody);
        cout << "*";
 
    }
 
void draw_field () //выстраиваем края поля (границы) и прорисовываем их
    {
 
        int i,j;
 
        system("cls"); //очищаем экран
 
        for (i = 0; i <= height; ++i)
            {
                for (j = 0; j <= width; ++j)
                    cout << a[i][j]; 
                cout << "\n";   
            }
 
        cout << "\n";
 
        // инициализируем еду
        generate_food();
    }
 
bool isFoodField ()// помещаем еду на поле
    {
 
        if (co_x[num]==foodx && co_y[num]==foody) 
        {
            foodx=NULL;
            foody=NULL;
            score++;
            return true;
        }
    
        return false;
    }
 
bool dead () //проверяем, съела ли змейка саму себя
    { 
 
        int i;
 
        // врезалась в границы поля?
        if (co_x[num-1] == width) 
            return true;
        if (co_x[num-1] == 0) 
            return true;
        if (co_y[num-1] == height) 
            return true;
        if (co_y[num-1] == 0) 
            return true;
 
        // попала сама в себя?
        for (i = 0; i < num-3; ++i)
            if (co_x[i] == co_x[num-1] && co_y[i] == co_y[num-1])
               return true;
 
        return false;
    }
 
void move () //основные операции при движении
    { 
        char input;
        int temp_dir = direction;
        int speed=300;
        char ending[]="GAME OVER!";
    
        do {
        
            if (kbhit()) input = getch(); //проверяем нажатие клавиши на консоли 
            else input = 0;
 
            switch (input)//глобальное значение клавиши и игнорируем движение обратно
            {
                case 'P': 
                    if (direction==DIR_UP) //  если пробуем повернуть на верх, то ничего не получается
                        break;// операция прерывается
                    temp_dir=DIR_DOWN; // можно только вниз
                    break;
                case 'H': 
                    if (direction==DIR_DOWN) break;
                    temp_dir=DIR_UP;
                    break;
                case 'K':
                    if (direction==DIR_RIGHT) break;
                    temp_dir= DIR_LEFT; 
                    break;
                case 'M': 
                    if (direction==DIR_LEFT) break;
                    temp_dir= DIR_RIGHT; 
                    break;
                default:
                    break;
            }
 
            direction=temp_dir;
 
            switch (temp_dir) // движение от головы змейки по указанному направлению
            {
                case DIR_RIGHT:
                    co_x[num] = co_x[num-1]+1;
                    co_y[num] = co_y[num-1];
                    break;
                case DIR_LEFT:
                    co_x[num] = co_x[num-1]-1;
                    co_y[num] = co_y[num-1];
                    break;
                case DIR_UP:
                    co_y[num] = co_y[num-1]-1;
                    co_x[num] = co_x[num-1];
                    break;
                case DIR_DOWN:
                    co_y[num] = co_y[num-1]+1;
                    co_x[num] = co_x[num-1];
                    break;
                default:
                    break;
            }
 
            // если еда на поле и змейка ее съела то растет сама и появляется новая еда, скорость увеличивается
            if (isFoodField()) 
                {
                    gotoxy (co_x[num], co_y[num]);
                    cout << "$";
                    ++num;
                    speed=speed-10;
                    generate_food();
                } 
 
            else 
               {
                gotoxy (co_x[0],co_y[0]);
                cout << ' ';
 
                for (int i = 0; i < num; i++)
                {
                    co_x[i] = co_x[i+1];
                    co_y[i] = co_y[i+1];
                } 
 
                // 
                gotoxy (co_x[num], co_y[num]);
                cout << "$";
            }
 
            // если умерли то конец игре
            if(dead()) 
                {
                for (int i=0; i<11; i++) 
                    {
                        gotoxy (i+18, 7);
                        cout << ending[i];
                    }
            
                break;// подумать как начать заново и поставить сюда
                }
 
            // обозначаем скорость и подсчитываем координаты еды
            gotoxy(1,18);
            cout <<"Score : "<< score <<"\n\n";
 
            gotoxy(0,22);
            cout << foodx;
            gotoxy(0,23);
            cout << foody;
 
            Sleep(speed);
 
        } while (input!=27);
 
    }
 
 
int main() 
    { 
 
        init_field ();
        draw_field();
        move();
        return 0;
    }
Осталось понять 3 задачи:
1. Как сделать так чтобы игра начиналась с приглашения в нее
2. Как сделать так чтобы после окончания игры предлагалось начать ее снова
3. Как сделать так что бы змейка ходила не лесенкой __
|
___

а нормально (это самое непонятное пока).
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
20.02.2013, 00:47     "Змейка", C++ (консоль) #6
Ну 1-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
//Функция меню
int menu()
{
int k;
cout<<"1.Начать игру."<<endl;
...
cin>>k;
return k;
}
 
int main()
{
int k=menu();
while (k!=3)
{
switch(k)
{
case 1:
//Тут допустим начать игру.
break;
case 2: 
//Тут еще что-то
break;
case 3: 
//Выход
return 0;
}
k=menu();
}
return 0;
}
Tabula
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 6
21.02.2013, 00:22  [ТС]     "Змейка", C++ (консоль) #7
Wolkodav, спасибо - я через кейсы и начала двигаться 1 и 2 действительно просто ...я пока самое главное с 3 думаю. так как основной выложенный код только сегодня закончила - так что голова пока не варит. завтра буду доделывать.

Добавлено через 22 минуты
Хотя первая задача - начать игру через приветственное поле решается совсем просто.

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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <iostream>
#include <string>
 
using namespace std;
 
#define DIR_RIGHT 1
#define DIR_LEFT -1
#define DIR_UP    2
#define DIR_DOWN -2
 
char a[50][50]; //razmer polya v kotorom igra
int co_x[50], co_y[50], foodx, foody; //koordinaty zmeiki i edy
const int height = 16, width = 46; // visota i shirina
int num = 2; //num - dlina zmeiki
int direction=1;//iznachalno dvizhenie nachitaetsa napravo
int score = 0;// podschet ochkov nachinaetsa s nulua
 
 
void gotoxy (int column, int line) //peremeschaem kursor na zadannyu pozitsiu
    { 
 
        COORD coord;
        coord.X = column;
        coord.Y = line;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
    }
 
void menu ()
  {
    char s;
    gotoxy (19, 7);
    cout <<"SNAKE is the best game!\n\n";
    gotoxy (17, 8);
    cout<<"FOR STARTING GAME PRESS 'ENTER'\n\t";
    getch();
  }
 
void init_field () 
    { 
 
        // initsializiruem igrovoe pole
        for (int i = 0; i <= height; ++i) 
            for (int j = 0; j <= width; ++j)
                a[i][j] = (i == 0 || j == 0 || i == height || j == width ? '#' : ' '); //opredelyaem granitsy
 
        // initsializiruem strukturu zmeiki
        num = 2;
 
        co_x[0] = 1;
        co_y[0] = 1;
        co_x[1] = 2;
        co_y[1] = 1;
 
        a[1][1] = '$';
        a[1][2] = '$';
 
    }
 
void generate_food ()  // generiruem edy
    {  
 
        foody = (rand() % 15)+1;
        foodx = (rand() % 45)+1;
 
        gotoxy(foodx, foody);
        cout << "*";
 
    }
 
void draw_field () //vistraivaem polya
    {
 
        int i,j;
 
        system("cls"); //clean screen
 
        for (i = 0; i <= height; ++i)
            {
                for (j = 0; j <= width; ++j)
                    cout << a[i][j]; 
                cout << "\n";   
            }
 
        cout << "\n";
 
        // generatsia edy
        generate_food();
    }
 
bool isFoodField ()// eda na igrovom pole
    {
 
        if (co_x[num]==foodx && co_y[num]==foody) 
        {
            foodx=NULL;
            foody=NULL;
            score++;
            return true;
        }
    
        return false;
    }
 
bool dead () //pri kakih ysloviah zmeika mertva
    { 
 
        int i;
 
        // esli vrezalas v konets polya
        if (co_x[num-1] == width) 
            return true;
        if (co_x[num-1] == 0) 
            return true;
        if (co_y[num-1] == height) 
            return true;
        if (co_y[num-1] == 0) 
            return true;
 
        // esli popala sama na sebya
        for (i = 0; i < num-3; ++i)
            if (co_x[i] == co_x[num-1] && co_y[i] == co_y[num-1])
               return true;
 
        return false;
    }
 
void move () //jsnovnie operatsii pri dvizhenii
    { 
        char input;
        int temp_dir = direction;
        int speed=300;
        char ending[]="GAME OVER!";
    
        do {
        
            if (kbhit()) input = getch(); //proveryaem nazhatie klavishi na konsole
            else input = 0;//v buffer otkladivaem znachenie nazhatoi klavishi
 
            switch (input)//globalnoe znachenie napravleniya i ignor protivopolozhnogo
            {
                case 'P': 
                    if (direction==DIR_UP) //  esli daem dvizhenie naverh
                        break;// nichego ne poluchaetsa
                    temp_dir=DIR_DOWN; // idti tolko vniz
                    break;
                case 'H': 
                    if (direction==DIR_DOWN) break;
                    temp_dir=DIR_UP;
                    break;
                case 'K':
                    if (direction==DIR_RIGHT) break;
                    temp_dir= DIR_LEFT; 
                    break;
                case 'M': 
                    if (direction==DIR_LEFT) break;
                    temp_dir= DIR_RIGHT; 
                    break;
                default:
                    break;
            }
 
            direction=temp_dir;
 
            switch (temp_dir) // dvizhenie ot golovi po ukazannomy napravleniu
            {
                case DIR_RIGHT:
                    co_x[num] = co_x[num-1]+1;
                    co_y[num] = co_y[num-1];
                    break;
                case DIR_LEFT:
                    co_x[num] = co_x[num-1]-1;
                    co_y[num] = co_y[num-1];
                    break;
                case DIR_UP:
                    co_y[num] = co_y[num-1]-1;
                    co_x[num] = co_x[num-1];
                    break;
                case DIR_DOWN:
                    co_y[num] = co_y[num-1]+1;
                    co_x[num] = co_x[num-1];
                    break;
                default:
                    break;
            }
 
            // esli zmeika sela edy, to razmer i skorost uvelochivautsa i schet menyaetsa - poyavlaetsa novaya eda
            if (isFoodField()) 
                {
                    gotoxy (co_x[num], co_y[num]);
                    cout << "$";
                    ++num;// razmer
                    speed=speed-5;//schet
                    generate_food();//novaya eda
                } 
 
            else 
               {
                gotoxy (co_x[0],co_y[0]);
                cout << ' ';
 
                for (int i = 0; i < num; i++)
                {
                    co_x[i] = co_x[i+1];
                    co_y[i] = co_y[i+1];
                } 
 
                gotoxy (co_x[num], co_y[num]);
                cout << "$";
            }
 
            // esli usloviya smerti ispolnilis to konets igre
            if(dead()) 
                {
                for (int i=0; i<11; i++) 
                    {
                        gotoxy (i+18, 7);
                        cout << ending[i];
                    }
            
                break;
                }
 
            // oboznachenie scheta i koordinat edy na ekrane
            gotoxy(1,18);
            cout <<"Score : "<< score <<"\n\n";
 
            gotoxy(0,22);
            cout << foodx;
            gotoxy(0,23);
            cout << foody;
 
            Sleep(speed);
 
        } while (input!=27);
 
    }
 
 
int main() 
    { 
        menu ();
        init_field ();
        draw_field();
        move();
        return 0;
    }
Остальное сделаю завтра-) Сегодня овердоз уже-)

Добавлено через 21 час 49 минут
У меня очередной застой в идеях. В коде закрыла функцию, которая, по идее, начинает игру с начала когда возникает вопрос продолжить или нет. Что я сделала не так, т.к. если ее открыть то вопрос не возникает - тупо игра начинается заново-((((

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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <iostream>
#include <string>
 
using namespace std;
 
#define DIR_RIGHT 1
#define DIR_LEFT -1
#define DIR_UP    2
#define DIR_DOWN -2
 
char a[50][50]; //razmer polya v kotorom igra
int co_x[50], co_y[50], foodx, foody; //koordinaty zmeiki i edy
const int height = 16, width = 46; // visota i shirina
int num = 2; //num - dlina zmeiki
int direction=1;//iznachalno dvizhenie nachitaetsa napravo
int score = 0;// podschet ochkov nachinaetsa s nulua
 
 
void gotoxy (int column, int line) //peremeschaem kursor na zadannyu pozitsiu
    { 
 
        COORD coord;
        coord.X = column;
        coord.Y = line;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
    }
 
void menu ()
  {
    char s;
    gotoxy (19, 7);
    cout <<"SNAKE is the best game!\n\n";
    gotoxy (17, 8);
    cout<<"FOR STARTING GAME PRESS 'ENTER'\n\t";
    getch();
  }
 
void init_field () 
 
{ 
 
        // initsializiruem igrovoe pole
        for (int i = 0; i <= height; ++i) 
            for (int j = 0; j <= width; ++j)
                a[i][j] = (i == 0 || j == 0 || i == height || j == width ? '#' : ' '); //opredelyaem granitsy
 
        // initsializiruem strukturu zmeiki
        num = 2;
 
        co_x[0] = 1;
        co_y[0] = 1;
        co_x[1] = 2;
        co_y[1] = 1;
 
        a[1][1] = '$';
        a[1][2] = '$';
 
        // dlya prodolzheniya igry, esli polzovatel vibral nachat zanovo, to osnovine dannie dolzhni nachatsa s pervih harakteristik
        foodx=0;
        foody=0;
        direction =1;
        score=0;
    }
 
void generate_food ()  // generiruem edy
    {  
 
        foody = (rand() % 15)+1;
        foodx = (rand() % 45)+1;
 
        gotoxy(foodx, foody);
        cout << "*";
 
    }
 
void draw_field () //vistraivaem polya
    {
 
        int i,j;
 
        system("cls"); //clean screen
 
        for (i = 0; i <= height; ++i)
            {
                for (j = 0; j <= width; ++j)
                    cout << a[i][j]; 
                cout << "\n";   
            }
 
        cout << "\n";
 
        // generatsia edy
        generate_food();
    }
 
bool isFoodField ()// eda na igrovom pole
    {
 
        if (co_x[num]==foodx && co_y[num]==foody) 
        {
            foodx=NULL;
            foody=NULL;
            score++;
            return true;
        }
    
        return false;
    }
 
bool dead () //pri kakih ysloviah zmeika mertva
    { 
 
        int i;
 
        // esli vrezalas v konets polya
        if (co_x[num-1] == width) 
            return true;
        if (co_x[num-1] == 0) 
            return true;
        if (co_y[num-1] == height) 
            return true;
        if (co_y[num-1] == 0) 
            return true;
 
        // esli popala sama na sebya
        for (i = 0; i < num-3; ++i)
            if (co_x[i] == co_x[num-1] && co_y[i] == co_y[num-1])
               return true;
 
        return false;
    }
 
void move () //jsnovnie operatsii pri dvizhenii
    { 
        char input;
        int temp_dir = direction;
        int speed=300;
        char ending[]="GAME OVER!";
    
        do {
        
            if (kbhit()) input = getch(); //proveryaem nazhatie klavishi na konsole
            else input = 0;//v buffer otkladivaem znachenie nazhatoi klavishi
 
            switch (input)//globalnoe znachenie napravleniya i ignor protivopolozhnogo
            {
                case 'P': 
                    if (direction==DIR_UP) //  esli daem dvizhenie naverh
                        break;// nichego ne poluchaetsa
                    temp_dir=DIR_DOWN; // idti tolko vniz
                    break;
                case 'H': 
                    if (direction==DIR_DOWN) break;
                    temp_dir=DIR_UP;
                    break;
                case 'K':
                    if (direction==DIR_RIGHT) break;
                    temp_dir= DIR_LEFT; 
                    break;
                case 'M': 
                    if (direction==DIR_LEFT) break;
                    temp_dir= DIR_RIGHT; 
                    break;
                default:
                    break;
            }
 
            direction=temp_dir;
 
            switch (temp_dir) // dvizhenie ot golovi po ukazannomy napravleniu
            {
                case DIR_RIGHT:
                    co_x[num] = co_x[num-1]+1;
                    co_y[num] = co_y[num-1];
                    break;
                case DIR_LEFT:
                    co_x[num] = co_x[num-1]-1;
                    co_y[num] = co_y[num-1];
                    break;
                case DIR_UP:
                    co_y[num] = co_y[num-1]-1;
                    co_x[num] = co_x[num-1];
                    break;
                case DIR_DOWN:
                    co_y[num] = co_y[num-1]+1;
                    co_x[num] = co_x[num-1];
                    break;
                default:
                    break;
            }
 
            // esli zmeika sela edy, to razmer i skorost uvelochivautsa i schet menyaetsa - poyavlaetsa novaya eda
            if (isFoodField()) 
                {
                    gotoxy (co_x[num], co_y[num]);
                    cout << "$";
                    ++num;// razmer
                    speed=speed-5;//schet
                    generate_food();//novaya eda
                } 
 
            else 
               {
                gotoxy (co_x[0],co_y[0]);
                cout << ' ';
 
                for (int i = 0; i < num; i++)
                {
                    co_x[i] = co_x[i+1];
                    co_y[i] = co_y[i+1];
                } 
 
                gotoxy (co_x[num], co_y[num]);
                cout << "$";
            }
 
            // esli usloviya smerti ispolnilis to konets igre
            if(dead()) 
 
                {
                    int y=1;
                    
                for (int i=0; i<11; i++) 
                    {
                        gotoxy (i+10, 7);
                        cout << ending[i];
                    }
                cout <<"Start new game? y-1/n-other\n\n";
//вот тут начинаются траблы
                
            /*  if (y == 1)
                    {
                      init_field ();
                      draw_field();
                      move();
                    }
                    
                else
                    {
                        ExitProcess(0);
                    }*/
                break;
                }
 
            // oboznachenie scheta i koordinat edy na ekrane
            gotoxy(1,18);
            cout <<"Score : "<< score <<"\n\n";
 
            gotoxy(0,22);
            cout << foodx;
            gotoxy(0,23);
            cout << foody;
 
            Sleep(speed);
 
        } while (input!=27);
 
    }
 
 
int main() 
    { 
        menu ();
        init_field ();
        draw_field();
        move();
        return 0;
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 07:04     "Змейка", C++ (консоль)
Еще ссылки по теме:

Небольшой пример. Игра "змейка" - как в ней делают препятствия C++
C++ Как реализовать взаимодействие классов в игре "Змейка"
"Змейка", не работают кнопки направления движения C++

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

Или воспользуйтесь поиском по форуму:
NIch
 Аватар для NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
21.02.2013, 07:04     "Змейка", C++ (консоль) #8
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
            if(dead())
 
                {
                    int y=1;
 
                for (int i=0; i<11; i++) 
                    {
                        gotoxy (i+10, 7);
                        cout << ending[i];
                        Sleep(200); // Так прикольнее)
                    }
      
                gotoxy (10, 8);
                cout <<"Start new game? y-1/n-other\n\n";
 
                y = getch(); // Получай код символа
 
              if (y == 49) // Проверяй код
                    {
                      init_field ();
                      draw_field();
                      move();
                    }
 
                else
                    {
                        ExitProcess(0);
                    }
                break;
                }
Yandex
Объявления
21.02.2013, 07:04     "Змейка", C++ (консоль)
Ответ Создать тему
Опции темы

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