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

  1. В начале кода определены основные переменные:
    • level - двумерный массив символов, представляющий поле игры.
    • i, j - индексы текущего положения смайлика.
    • key - ключ, используемый для обработки пользовательского ввода.
    • x, y - координаты текущего положения смайлика.
    • redraw - флаг, указывающий, нужно ли перерисовать поле игры.
    • width и height - размеры поля игры.
  2. Затем происходит инициализация массива level. Символы * заменяются на пробелы, чтобы создать пустое поле игры.
  3. Далее идет основной цикл игры, который продолжается до тех пор, пока пользователь не нажмет клавишу ESC. Внутри цикла выполняются следующие действия:
    • Если redraw равно true, то поле игры очищается и рисуется заново.
    • Затем происходит обработка пользовательского ввода, который определяется с помощью оператора switch.
    • Если пользователь нажимает клавишу вверх, то значение y уменьшается на 1.
    • Если пользователь нажимает клавишу вниз, то значение y увеличивается на 1.
    • Если пользователь нажимает клавишу влево, то значение x уменьшается на 1.
    • Если пользователь нажимает клавишу вправо, то значение x увеличивается на 1.
    • После обработки пользовательского ввода, поле игры перерисовывается.
  4. В конце кода возвращается значение 0, что означает успешное завершение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.667 из 5
Похожие ответы