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