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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Преобразовать массив удвоив длину его серии http://www.cyberforum.ru/cpp-beginners/thread785959.html
Дано целое число K (> 0) и целочисленный массив размера N. Преобразовать массив, удвоив длину его серии с номером K. Если серий в массиве меньше K, то вывести массив без изменений. Под серией понимается ряд одинаковых цифр к примеру 1112222225555555
C++ Написать программу, которая находит сумму четных и сумму нечетных элементов массива Написать программу, которая находит сумму четных и сумму нечетных элементов массива. http://www.cyberforum.ru/cpp-beginners/thread785958.html
Написать программу, которая выводит содержимое массива наоборот C++
Написать программу, которая выводит содержимое массива наоборот. Пример: массив 23 11 6 превращается в 6 23 11.
C++ Как сделать вторую половину ромба
#include <iostream> using namespace std; void main () { for(int i=0; i<18; i++) { for(int j=18; j>i; j--) if(i-j<=18 && i+j<=18) { cout<<' ';
C++ Функция и двухмерный массив (Поменять в массиве местами строки) http://www.cyberforum.ru/cpp-beginners/thread785933.html
Дан массив действительных чисел размера m на n, где m и n – натуральные числа. Поменять в массиве местами строку с наибольшим и строку с наименьшим количеством различных элементов с использованием функции определения количества различных элементов в строке в двухмерном массиве. Помогите решить. Для одномерного вроде понял как, для двухмерного не могу никак понять.
C++ Поменять местами наибольшие по модулю элементы матрицы А(7*8) и массива В(76) Поменять местами наибольшие по модулю элементы матрицы А(7*8) и массива В(76). подробнее

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

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. Как сделать так что бы змейка ходила не лесенкой __
|
___

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