Почему курсор не проходит через невидимые преграды?
Игровое поле сделано через Матрицу 25 на 25. Идея в том, что есть игровое поле, в котором есть края и преграды через которые курсор не должен проходить. Свободное пространство сделано через char элемент ' '(пробел), стенки и преграды через char элемент '#'. Передвижение курсора('@' char элемент) осуществляется клавишами W, A, S, D. Все стенки и преграды, как и свободное пространство, сделаны из одного элемента, путем присвоения значения определенным элементам матрицы данных переменных( ' ', '#').
ПРОБЛЕМА: В некоторых местах поля курсор просто не проходит, а должен. А в некоторых местах проходит через преграды, хотя не должен. Все элементы как преграды, так и свободного пространства сделано из одного элемента.
#include <iostream>
#include <fstream>
#include <windows.h>
#include <conio.h>
using namespace std;
void Cursor(int, int);
int main() {
int x = 1;
int y = 1;
char s = ' ';
char w = '#';
bool Game = true;
// МАТРИЦЯ.
const int length = 25; // Розміри матриці.
char mas[length][length];
for (int i = 0; i < length; i++) {
for (int j = 0; j < length; j++) {
/* Один елемент матриці це 3 строкових елементи з клавіатури, чи букви,
чи символи, чи пробіли.*/
mas[i][j] = s; // Заповнення пустого місця.
mas[length - 1][j] = w; // Нижній рядок.
mas[0][j] = w; // Верхній рядок.
mas[i][length - 1] = w; // Правий стовбчик
mas[i][0] = w; // Лівий стовбчик
//mas[0][length - 1] = " ";
};
};
// ПЕРЕШКОДИ В СЕРЕДИНІ ІГРОВОГО ПОЛЯ
// Вертикальні перешкоди.
// 2 стовбчик
for (int i = 5; i < 9; i++) {
mas[i][2] = w;
};
//6 стовбчик
for (int i = 5; i < 10; i++) {
mas[i][6] = w;
};
for (int i = 15; i < 21; i++) {
mas[i][6] = w;
};
//10 стовбчик
for (int i = 3; i < 6; i++) {
mas[i][10] = w;
};
for (int i = 9; i < 14; i++) {
mas[i][10] = w;
};
for (int i = 16; i < 23; i++) {
mas[i][10] = w;
};
//15 стовбчик
for (int i = 1; i < 8; i++) {
mas[i][15] = w;
};
for (int i = 9; i < 12; i++) {
mas[i][15] = w;
};
for (int i = 17; i < 24; i++) {
mas[i][14] = w;
};
// 19 стовбчик.
for (int i = 1; i < 5; i++) {
mas[i][18] = w;
};
for (int i = 8; i < 14; i++) {
mas[i][19] = w;
};
for (int i = 19; i < 23; i++) {
mas[i][19] = w;
};
for (int i = 8; i < 20; i++) {
mas[i][22] = w;
};
// ГОРИЗОНТАЛЬНІ РЯДКИ.
// 2 рядок.
for (int i = 2; i < 7; i++) {
mas[2][i] = w;
};
for (int i = 12; i < 14; i++) {
mas[2][i] = w;
};
// 4 рядок.
for (int i = 2; i < 5; i++) {
mas[4][i] = w;
};
for (int i = 19; i < 22; i++) {
mas[4][i] = w;
};
// 6 рядок.
for (int i = 2; i < 7; i++) {
mas[6][i] = w;
};
for (int i = 18; i < 24; i++) {
mas[6][i] = w;
};
// 8 рядок.
for (int i = 19; i < 21; i++) {
mas[8][i] = w;
};
// 10 рядок.
for (int i = 2; i < 6; i++) {
mas[10][i] = w;
};
// 13 рядок.
for (int i = 12; i < 16; i++) {
mas[13][i] = w;
};
// 15 рядок.
for (int i = 1; i < 8; i++) {
mas[15][i] = w;
};
// 17 рядок.
for (int i = 14; i < 20; i++) {
mas[17][i] = w;
};
// 23 рядок.
for (int i = 9; i < 11; i++) {
mas[23][i] = w;
};
for (int i = 19; i < 23; i++) {
mas[23][i] = w;
};
while (Game == true) {
system("CLS");
// ВИВІД МАТРИЦІ.
for (int i = 0; i < length; i++) {
for (int j = 0; j < length; j++) {
cout << mas[i][j];
}
cout << endl;
};
Cursor(x, y);
char wad = _getch();
if (wad == 'w')
{
if (mas[x][y - 1] == s)
{
y = --y;
Cursor(x, y);
}
else if (mas[x][y - 1] != s)
{
Cursor(x, y);
}
}
else if (wad == 'a')
{
if (mas[x - 1][y] == s)
{
x = --x;
Cursor(x, y);
}
else if (mas[x - 1][y] != s)
{
Cursor(x, y);
}
}
else if (wad == 'd')
{
if (mas[x + 1][y] == s)
{
x = ++x;
Cursor(x, y);
}
else if (mas[x + 1][y] != s)
{
Cursor(x, y);
}
}
else if (wad == 's')
{
if ((mas[x][y + 1]) == s)
{
y = ++y;
Cursor(x, y);
}
else if (mas[x][y + 1] != s)
{
Cursor(x, y);
}
}
else if (wad == 'q')
{
Game = false;
};
}
}
void Cursor(int X, int Y) {
COORD cord;
cord.X = X;
cord.Y = Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cord);
char curs = '@';
cout << curs;
}
Ответы (1 шт):
Знакомая задача! :) Хорошо, что послушали совет и массив сделали char[][].
А вообще - всё очень просто. Вы перепутали X и Y. В матрице mas[][] чтобы двигаться по горизонтали нужно менять значение столбца, а чтобы по-вертикали - строки. Вы пишете mas[x][y], а надо mas[y][x]. Т.е. чтобы сдвинуть курсор вправо нужно увеличить индекс по столбцам mas[y][x++], а если вниз - то по строкам mas[y++][x].
Ещё несколько улучшений. Поскольку вы в матрице храните картинку поля, можно отказаться от функции Cursor() и рисовать курсор прямо в матрицу mas[y][x]=@; и стирать его так же в матрице mas[y][x]= ; Потом когда матрица будет выводиться на экран, сразу выведется и курсор.
Ну и огромный блок с if() ... else можно переписать более компактно
const char s = ' ';
const char w = '#';
const char curs = '@';
while (Game == true)
{
system("CLS");
mas[y][x] = curs; // нарисовать курсор в матрице!!! по текущим координатам
for (int i = 0; i < length; i++) // нарисовать матрицу на экран сразу с курсором в нужном месте
{
for (int j = 0; j < length; j++)
cout << mas[i][j];
cout << endl;
};
mas[y][x] = s; // стереть курсор в матрице!!! по текущим координатам
char wad = _getch();
if (wad == 'w' && mas[y - 1][x] == s)
{
--y;
}
else if (wad == 'a' && mas[y][x - 1] == s)
{
--x;
}
else if (wad == 'd' && mas[y][x + 1] == s)
{
++x;
}
else if (wad == 's' && mas[y + 1][x] == s)
{
++y;
}
else if (wad == 'q')
{
Game = false;
};
}
Ну и то, что я писал в прошлый раз - y = ++y; это то же самое, что ++y;
PS. Возможно поле игры проще (нагляднее) создавать вот так, чем через циклы. Всегда можно подправить, добавить/убавить стенок. И вывод матрицы упрощается - вместо посимвольного, становится построчным.
char mas[length][length+1] = {
"#########################",
"# # # #",
"# ##### ## # # #",
"# # # # #",
"# ### # # #### #",
"# # # # # #",
"# ##### # #######",
"# # # # #",
"# # # ## # #",
"# # # # # # #",
"# #### # # # # #",
"# # # # # #",
"# # # # #",
"# # #### # # #",
"# # #",
"######## # #",
"# # # #",
"# # # #",
"# # # #",
"# # # #",
"# # #",
"# #",
"# #",
"# #",
"#########################"
};
for(int i = 0; i < length; i++) // нарисовать матрицу на экран
cout << mas[i] << "\n";
Столбцов на 1 больше, чтобы вместился символ 0 - конец строки.
