voodoo Дата: Пн, 23 Дек 2013, 01:38 | Сообщение # 1
Сообщений: 122
Награды:
7
Репутация:
54
Статус: Offline
Всем привет! Прошу вашей помощи, начал писать змейку на c, всё было хорошо, пока не встал вопрос насчёт хвоста, алгоритм в голове есть, но не могу это программно закрепить. Вот фрагмент кода, если вас не затруднит, напишите для хвоста функцию, отталкиваясь от этого кода: Код
#include <iostream> #include <conio.h> #include <stdlib.h> #include <windows.h> #include <ctime> using namespace std; enum keys { Top = 119, Down = 115, Left = 97, Right = 100 }; int move_Y(int pos_Y, int key_pressed) { switch (key_pressed) { case Top: --pos_Y; break; case Down: ++pos_Y; break; } return pos_Y; } int move_X(int pos_X, int key_pressed) { switch (key_pressed) { case Left: --pos_X; break; case Right: ++pos_X; break; } return pos_X; } int main() { COORD cursor = { 0, 0 }; const int width = 30; const int height = 20; char plane[width][height] = {0}; int pos_Y = height / 2; int pos_X = 0; int key_pressed = Right; while (true) { Sleep(100); if (_kbhit() == true) { key_pressed = _getch(); } pos_Y = move_Y(pos_Y, key_pressed); pos_X = move_X(pos_X, key_pressed); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursor); for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { plane[j][i] = 0; plane[pos_X][pos_Y] = 1; } } for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { cout << plane[j][i]; } cout << endl; } } return 0; }
Сообщение Всем привет! Прошу вашей помощи, начал писать змейку на c, всё было хорошо, пока не встал вопрос насчёт хвоста, алгоритм в голове есть, но не могу это программно закрепить. Вот фрагмент кода, если вас не затруднит, напишите для хвоста функцию, отталкиваясь от этого кода: Код
#include <iostream> #include <conio.h> #include <stdlib.h> #include <windows.h> #include <ctime> using namespace std; enum keys { Top = 119, Down = 115, Left = 97, Right = 100 }; int move_Y(int pos_Y, int key_pressed) { switch (key_pressed) { case Top: --pos_Y; break; case Down: ++pos_Y; break; } return pos_Y; } int move_X(int pos_X, int key_pressed) { switch (key_pressed) { case Left: --pos_X; break; case Right: ++pos_X; break; } return pos_X; } int main() { COORD cursor = { 0, 0 }; const int width = 30; const int height = 20; char plane[width][height] = {0}; int pos_Y = height / 2; int pos_X = 0; int key_pressed = Right; while (true) { Sleep(100); if (_kbhit() == true) { key_pressed = _getch(); } pos_Y = move_Y(pos_Y, key_pressed); pos_X = move_X(pos_X, key_pressed); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursor); for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { plane[j][i] = 0; plane[pos_X][pos_Y] = 1; } } for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { cout << plane[j][i]; } cout << endl; } } return 0; }
Автор - voodoo Дата добавления - 23 Дек 2013 в 01:38
seaman Дата: Пн, 30 Дек 2013, 12:31 | Сообщение # 2
Гуру
Сообщений: 1748
Награды:
10
Репутация:
660
Статус: Offline
Нужно не для хвоста функцию писать, а для всего тела. Т.е. нужно сохранять в массиве позиции каждого символа тела. Для чего? Чтобы искать пересечение с собой. В натуральной змейке, если она себя "кусает" - игра заканчивается. Ну а если есть координаты всех частей тела - стирание хвоста будет простым - выводишь в позицию последнего символа пробел и все. Чтобы не переписывать весь массив при движении змеи,- лучше подумать о какой-то другой структуре, а не о просто массиве. Типа о связном списке.
Сообщение Нужно не для хвоста функцию писать, а для всего тела. Т.е. нужно сохранять в массиве позиции каждого символа тела. Для чего? Чтобы искать пересечение с собой. В натуральной змейке, если она себя "кусает" - игра заканчивается. Ну а если есть координаты всех частей тела - стирание хвоста будет простым - выводишь в позицию последнего символа пробел и все. Чтобы не переписывать весь массив при движении змеи,- лучше подумать о какой-то другой структуре, а не о просто массиве. Типа о связном списке. Автор - seaman Дата добавления - 30 Дек 2013 в 12:31