Как сделать чтобы смайл не проходил сквозь стены - C (СИ)
Формулировка задачи:
Помогите пожалуйста. Задача такая: написать программу на языке с, в которой в консольном приложении будет выводиться квадратик, внутри которого через клетку перегородки с дырками, в рандомных местах ,и смайлик, которым надо пройти этот лабиринт не проходя сквозь стены.
Моя проблема в том , что смайл проходит сквозь стены.Помогите пожалуйста.
Вид лабиринта:
Вот код:
#include<iostream>
#include<locale.h>
#include<ctime>
#include<cstdlib>
#include<Windows.h>
#include<algorithm>
#include<conio.h>
using namespace std;
void main()
{
int d = 0, f = 0;
int g = 1, h = 1;
int k, sx, sy, sa, ss, sq, sw, se, sr;
srand((int)time(0));
sy = rand() % 9 + 1;
sx = rand() % 9 + 1;
sa = rand() % 9 + 1;
ss = rand() % 9 + 1;
sq = rand() % 9 + 1;
sw = rand() % 9 + 1;
se = rand() % 9 + 1;
sr = rand() % 9 + 1;
do{
system("cls");
f=0;
do{
d = 0;
do{
if (f == h&&d == g)
cout << char(1);
else if (f == 0 || f == 10|| d == 0 || d ==10 )
cout << char(0xdb);
else
cout << ' ';
if(f==sx&&d==1||f==sa&&d==2||f==ss&&d==3||f==sy&&d==4||f==sq&&d==5||f==sw&&d==6||f==se&&d==7||f==sr&&d==8)
cout << ' ';
else
cout << char(0xdb);
} while (++d<11);
cout << '\n';
} while (++f<11);
k = _getch();
if (k == 224 || k == 0)
k = _getch();
switch (k)
{
case 75:
if (g>1)
{
--g;
}
break;
case 77:
if (g < 9)
++g;
break;
case 72:
if (h > 1)
--h;
break;
case 80:
if (h < 9)
++h;
break;
}
} while (k != 27);
}Решение задачи: «Как сделать чтобы смайл не проходил сквозь стены»
textual
Листинг программы
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#include <conio.h>
#define WIDTH 17
#define HEIGHT 11
int main() {
char level[HEIGHT][WIDTH + 1] = {"*****************",
"* * * * * * * * *",
"* * * * * * * * *",
"* * * * * * * * *",
"* * * * * * * * *",
"* * * * * * * * *",
"* * * * * * * * *",
"* * * * * * * * *",
"* * * * * * * * *",
"* * * * * * * * *",
"*****************"};
int i, j, key = 0;
int x = 1, y = 1;
bool redraw = true;
srand(time(NULL));
for (j = 2; j < WIDTH - 2; ++j) {
i = rand() % (HEIGHT - 2) + 1;
level[i][j] = ' ';
}
while (key != 27) {
if (redraw) {
system("cls");
for (i = 0; i < HEIGHT; ++i) {
for (j = 0; j < WIDTH; ++j) {
if ((j == x) && (i == y)) {
printf("%c", '\x01');
}
else {
printf("%c", (level[i][j] == '*') ? '\xDB' : ' ');
}
}
printf("\n");
}
redraw = false;
}
switch ((key = _getch())) {
case 75:
if (level[y][x - 1] == ' ') {
x--;
redraw = true;
}
break;
case 77:
if (level[y][x + 1] == ' ') {
x++;
redraw = true;
}
break;
case 72:
if (level[y - 1][x] == ' ') {
y--;
redraw = true;
}
break;
case 80:
if (level[y + 1][x] == ' ') {
y++;
redraw = true;
}
break;
}
};
return 0;
}
Объяснение кода листинга программы
В этом коде представлена игра Змейка, где пользователю нужно управлять движением смайлика (представленного как символ `), чтобы он не сталкивался со стенами (представленными символами*` в массиве level).
- В начале кода определены основные переменные:
level- двумерный массив символов, представляющий поле игры.i,j- индексы текущего положения смайлика.key- ключ, используемый для обработки пользовательского ввода.x,y- координаты текущего положения смайлика.redraw- флаг, указывающий, нужно ли перерисовать поле игры.widthиheight- размеры поля игры.
- Затем происходит инициализация массива
level. Символы*заменяются на пробелы, чтобы создать пустое поле игры. - Далее идет основной цикл игры, который продолжается до тех пор, пока пользователь не нажмет клавишу
ESC. Внутри цикла выполняются следующие действия:- Если
redrawравноtrue, то поле игры очищается и рисуется заново. - Затем происходит обработка пользовательского ввода, который определяется с помощью оператора
switch. - Если пользователь нажимает клавишу
вверх, то значениеyуменьшается на 1. - Если пользователь нажимает клавишу
вниз, то значениеyувеличивается на 1. - Если пользователь нажимает клавишу
влево, то значениеxуменьшается на 1. - Если пользователь нажимает клавишу
вправо, то значениеxувеличивается на 1. - После обработки пользовательского ввода, поле игры перерисовывается.
- Если
- В конце кода возвращается значение 0, что означает успешное завершение программы.