Как сделать чтобы смайл не проходил сквозь стены - 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, что означает успешное завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д