Как сделать чтобы смайл не проходил сквозь стены - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста. Задача такая: написать программу на языке с, в которой в консольном приложении будет выводиться квадратик, внутри которого через клетку перегородки с дырками, в рандомных местах ,и смайлик, которым надо пройти этот лабиринт не проходя сквозь стены. Моя проблема в том , что смайл проходит сквозь стены.Помогите пожалуйста. Вид лабиринта: Вот код:
Листинг программы
  1. #include<iostream>
  2. #include<locale.h>
  3. #include<ctime>
  4. #include<cstdlib>
  5. #include<Windows.h>
  6. #include<algorithm>
  7. #include<conio.h>
  8. using namespace std;
  9. void main()
  10. {
  11. int d = 0, f = 0;
  12. int g = 1, h = 1;
  13. int k, sx, sy, sa, ss, sq, sw, se, sr;
  14. srand((int)time(0));
  15. sy = rand() % 9 + 1;
  16. sx = rand() % 9 + 1;
  17. sa = rand() % 9 + 1;
  18. ss = rand() % 9 + 1;
  19. sq = rand() % 9 + 1;
  20. sw = rand() % 9 + 1;
  21. se = rand() % 9 + 1;
  22. sr = rand() % 9 + 1;
  23. do{
  24. system("cls");
  25. f=0;
  26. do{
  27. d = 0;
  28. do{
  29. if (f == h&&d == g)
  30. cout << char(1);
  31. else if (f == 0 || f == 10|| d == 0 || d ==10 )
  32. cout << char(0xdb);
  33. else
  34. cout << ' ';
  35. 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)
  36. cout << ' ';
  37. else
  38. cout << char(0xdb);
  39. } while (++d<11);
  40. cout << '\n';
  41. } while (++f<11);
  42. k = _getch();
  43. if (k == 224 || k == 0)
  44. k = _getch();
  45. switch (k)
  46. {
  47. case 75:
  48. if (g>1)
  49. {
  50. --g;
  51. }
  52. break;
  53. case 77:
  54. if (g < 9)
  55. ++g;
  56. break;
  57. case 72:
  58. if (h > 1)
  59. --h;
  60. break;
  61. case 80:
  62. if (h < 9)
  63. ++h;
  64. break;
  65. }
  66. } while (k != 27);
  67. }

Решение задачи: «Как сделать чтобы смайл не проходил сквозь стены»

textual
Листинг программы
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include <stdbool.h>
  7. #include <conio.h>
  8.  
  9. #define WIDTH  17
  10. #define HEIGHT 11
  11.  
  12. int main() {
  13.     char level[HEIGHT][WIDTH + 1] = {"*****************",
  14.                                      "* * * * * * * * *",
  15.                                      "* * * * * * * * *",
  16.                                      "* * * * * * * * *",
  17.                                      "* * * * * * * * *",
  18.                                      "* * * * * * * * *",
  19.                                      "* * * * * * * * *",
  20.                                      "* * * * * * * * *",
  21.                                      "* * * * * * * * *",
  22.                                      "* * * * * * * * *",
  23.                                      "*****************"};
  24.     int i, j, key = 0;
  25.     int x = 1, y = 1;
  26.     bool redraw = true;
  27.  
  28.     srand(time(NULL));
  29.  
  30.     for (j = 2; j < WIDTH - 2; ++j) {
  31.         i = rand() % (HEIGHT - 2) + 1;
  32.         level[i][j] = ' ';
  33.     }
  34.  
  35.     while (key != 27) {
  36.         if (redraw) {
  37.             system("cls");
  38.             for (i = 0; i < HEIGHT; ++i) {
  39.                 for (j = 0; j < WIDTH; ++j) {
  40.                     if ((j == x) && (i == y)) {
  41.                         printf("%c", '\x01');
  42.                     }
  43.                     else {
  44.                         printf("%c", (level[i][j] == '*') ? '\xDB' : ' ');
  45.                     }
  46.                 }
  47.                 printf("\n");
  48.             }
  49.             redraw = false;
  50.         }
  51.  
  52.         switch ((key = _getch())) {
  53.             case 75:
  54.                 if (level[y][x - 1] == ' ') {
  55.                     x--;
  56.                     redraw = true;
  57.                 }
  58.                 break;
  59.  
  60.             case 77:
  61.                 if (level[y][x + 1] == ' ') {
  62.                     x++;
  63.                     redraw = true;
  64.                 }
  65.                 break;
  66.  
  67.             case 72:
  68.                 if (level[y - 1][x] == ' ') {
  69.                     y--;
  70.                     redraw = true;
  71.                 }
  72.                 break;
  73.  
  74.             case 80:
  75.                 if (level[y + 1][x] == ' ') {
  76.                     y++;
  77.                     redraw = true;
  78.                 }
  79.                 break;
  80.         }
  81.     };
  82.  
  83.     return 0;
  84. }

Объяснение кода листинга программы

В этом коде представлена игра Змейка, где пользователю нужно управлять движением смайлика (представленного как символ `), чтобы он не сталкивался со стенами (представленными символами*` в массиве 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы