Алгоритм написания программы на си - C (СИ)

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

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

Пример алгоритмизации приложений на си План 1. Общая алгоритмизация. 2. Используемые функции программы 3. Используемые переменные 4. Текст программы 1 Общая алгоритмизация Предположим, что мы собираемся написать игру. Пусть это будет змейка. Для этого нам необходимо определиться с ходом нашей работы. Чем мы сейчас и займёмся. --Первым делом нам нужно создать поле игры, где собственно и будет происходить действие. В нашем случае обозначим его функцией gameBody(); Оно будет состоять из 20 знаков по вертикали и 20 по горизонтали, соответственно внутренняя часть должна быть пустой. Фактически у нас должен получиться прямоугольник из тех символов, какие мы захотим, в нашем случае пуст это будет знак “#” диез, или фунт, кому как удобно. --Во вторых нам следует определить функцию перемещения курсора в нужную нам позицию. Эта функция в стандартной библиотеке называется gotoxy(), но так как она сейчас участвует не во всех компиляторах, тем более новых, то по-видимому нам придётся написать свою такую функцию, что бы не встретить лишних проблем. …………………………………………………………………………………. Ну что ж, со стандартными средствами мы закончили. Думаю пора перемещаться к функциональному коду нашей программы, вернее к её алгоритму. --В третьих нам понадобиться структура данных, для того, что бы не перегружать массивы переменных. Так как мы с вами работаем с векторами, то и назовём её vec2i (Расшифруем: vec – Вектор 2i – 2 переменные типа инт) -- В четвёртых создадим переменные нашей структуры. Так как нам понадобится массив, для хранения последовательности и количества элементов нашей змейки. Назовём её snake[]. Вторая переменная должна отвечать тому элементу, который змейка будет есть, в нашем случае это яблоко. Потому и дадим соответствующее название для нашей переменной apple. Так! С переменными закончили. --Пора использовать наши переменные. Для этого создадим функцию paramSnake(), которая обозначит наш массив (snake[]) и проинициализирует его. Пусть в начале нашей игры, наша змейка будет иметь длину в 5 символов. Значит, нам нужно определить на этом этапе пять элементов нашего массива. Маленькая подсказка, делается это в цикле. Напомню, переменная snake это не простая переменная, а переменная структуры, потому она должна обращаться к элементам нашей структуры, это x и у. А как мы помним, x и y в алгебре обозначаются вектора, так же и в нашем случае, snake[] будет содержать 5 координат точек которые в последствии будут использованы при рисовании змейки. --Думаю, можно заняться рисованием нашей змеи.  Для этого нам понадобится наша функция gotoxy(); которая расставит курсор в местах, где должна появиться змейка. Опять же это делается через цикл. В нашем случае тело змеи будет состоять из * звёздочек, а голова из @  собаки. Для этого нам нужно внедрить маленькую проверочку if на соответствия точкам, если это первая координата, то ставим на экран @ если любая другая * Всё очень просто  --Ну, мы на старте, перед нами чёрный экран на котором виднеется прямоугольник и неподвижное чудовище с головой собаки смотрящей на нас недоумевающим взглядом. Всё, мы написали. Что-то не так? Ах да, ну какая же это игра, в которой мы не принимаем участия. Да и нет никакого яблока, которая змея должна есть. Да, видимо рано мы закончили. Тогда продолжим. -- Давайте сделаем функцию, которая будет следить за тем, чтобы на экране появлялось яблоко, если его съели. Для этого, нам потребуется воспользоваться стандартной функцией языка си rand напомню, эта функция для определения псевдослучайных чисел, но сама по себе эта функция работать не будет, это вам не php, нам потребуется инициализировать эту функцию. А делается это одной из двух зависимых функций, srand, или randomize. На сколько я помню, компилятор gcc не понимает функции randomize, потому мы будем использовать функцию с неблагозвучным названием srand(); Для того, что бы забить точки координат нашего яблока, нам придётся задействовать вторую переменную структуры apple, как вы помните она содержит так же элементы структуры x и y которые в свою очередь будут содержать координаты нашего яблока. Вы наверное должны были заметить, что яблоко не должно появляться с координатами 0 ни по какой из осей, иначе оно уничтожит нашу оболочку, или игровое поле, которое станет дырявым, поэтому нам нужно, что бы rand ни в коем случае не выдал нам нулевой результат. Для этого, нам потребуется помудрить с образованием чисел о получить такую функцию rand()%19 +1 Это значит следующее, получить случайное число от 0 до 18 и прибавить к нему 1, таким образом у нас никогда не получится 0. Да, случайное число, мы должны присвоить каждому элементу структуры! Далее всё просто, снова gotoxy() с параметрами нашего яблока, и printf с символом нашего яблока. Я выбрал $ что бы не повадно было финансовые кризисы устраивать  Но это только пол беды. Мы ни словом не обмолвились о проверке на съедение яблока, а для этого, целесообразнее написать зависимую функцию, которая будет заниматься исключительно проверкой. Для этого нам нужно проверить совпадение координат змеи с координатами нашего яблака, и если они равны, вызвать функцию ставящую яблоко на экран Пусть это будет createApple(), а функция проверки check() Компилируем, смотрим, ура, яблоко есть, но змея не шевелится, это явный признак… . Ну не будем об печальном. Правильно, мы же не сказали змее ползти… . Займёмся этим. Для этого нам понадобятся как минимум две функции move() – движение змеи и delSnake() удаление змеи, мы же не хотим, что бы хвост змеи болтался по всему экрану? Итак move() – для начала мы должны проверить нажатие клавиши, если мы конечно хотим манипулировать змеёй, если нет то она от нас просто уползёт, а потом поди её найди на просторах компьютерной памяти. Для того, что бы проверить нажата клавиша или нет, нам придётся воспользоваться стандартной функцией языка си kbhit() которая скажет нам, что произошло нажатие на клавиатуре. Если нажатие произошло, то можно сохранить нажатую клавишу в переменной, которой потом будем манипулировать. Назовём переменную key она будет ответственна за значение клавиш. Идём дальше. Для того, чтобы при каждой итерации цикла, происходило перемещение всей змеи, нужно пройтись по ней циклом, вернее инициализировать змею значением на единицу отстоящим от значения, которое в данный момент итерации используется программой. Если обойтись без этого цикла, змея будет не подвижна, а уползёт только одна голова. Я думаю змее эта шутка не очень понравится. Что ж, движение у нас есть. Осталось только устроить манипуляцию с этим движением. Для этого мы должны проверить значение нажатой клавиши, и произвести манипуляцию с координатой, которая должна изменьться в данном случае. Например, если мы велим змее ползти в право, то соответственно, у нас должно увеличиваться значение координаты x , y в этом случае остаётся неподвижным. Ну вот и всё, змея теперь двигается, только не происходит стирание змеи. Можно подумать она растёт. Правильно, мы же не написали функцию, которая следит за стиранием хвоста змеи, который уже не существует в переменной. Напишем её. Как вы помните, функция называется delSnake() Для этого, нам просто нам предстоит проётись по элементам массива и удалить [i]тый элемент. Всё. Фактически, игра готова. Я сейчас не буду углубляться в проверки положения змеи. Это каждый может зделать сам, главное для нас было понять принцип анимации в dos пространстве. Переходим к следующему пункту нашего меню. 2 Используемые функции программы Повторимся, мы будем использовать следующие функции:
Struct vec2i
{
Int x;
Int y;
};
Struct vec2i snake[50];
Struct vec2i apple;
 
gameBody()// Функция рисует игровое поле
{
/*Текст программы*/
}
gotoxy(int x, int y)// Функция положения курсора
{
/*Текст программы*/
}
paramSnake() // Устанавливаем координаты змеи
{
/*Текст программы*/
}
createSnake() // Создаём тело змеи
{
/*Текст программы*/
}
createApple() // Создаём яблоко
{
/*Текст программы*/
}
check() // Проверка существование яблока
{
/*Текст программы*/
}
move()// Движение змеи
{
/*Текст программы*/
}
delSnake() // Удаление хвоста змеи
{
/*Текст программы*/
}
main() // Главная функция
{
/*Текст программы*/
}
3 Используемые переменные Int len – Переменная хранящая количество элементов змеи Struct vec2i apple – Переменная хранящая положение яблока на поле Struct vec2i snake[50] –Массив координат змеи int key -Переменная хранящая значение нажатой клавиши bool flag - Логическая переменная для цикла с условием bool end - Логическая переменная для цикла с условием coord - переменная структуры COORD Описание структуры в windows.h 4 Текст программы Пришло время выпустить зверя.
/*
*Programs Snake
*Educational material
*A printing-down is settled with reference on a mail author [email]removed@mail.ru[/email]
*/
 
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
#define TABLE 20
#define HEAD '@'
#define BODY '*'
#define APPLE '$'
 
struct vec2i
{
  int x;
  int y;
};
 
struct vec2i snake[50];
struct vec2i apple;
int key = 'd';
int len = 5;
int speed = 200;
bool end = true;
 
void gotoxy(int x, int y)
{
  COORD coord;
  coord.X = x;
  coord.Y = y;
  
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); 
}
 
void gameBody(void)
{
  char str = '#';
  
  for(int i = 0; i < TABLE; i++)
  {
    gotoxy(i, 0);
    printf("%c", str);
    if(i != 0 && i != TABLE-1)
    {
      gotoxy(0, i);
      printf("%c%19c", str, str);
    }
    gotoxy(i, TABLE - 1);
    printf("%c", str);
  }
}
 
void paramSnake(void)
{
  snake[0].x = 10;
  snake[0].y = 10;
  
  for(int i = 0; i < len; i++)
  {
    snake.x = snake[0].x;
    snake.y = snake[0].y - i;
  }
}
 
void createSnake(void)
{
  for(int i = 0; i < len; i++)
  {
    if(snake[0].x == 0)
      snake[0].x = 18;
    if(snake[0].x == 19)
      snake[0].x = 1;
    if(snake[0].y == 0)
      snake[0].y = 18;
    if(snake[0].y == 19)
      snake[0].y = 1;
      
    gotoxy(snake.x, snake.y);
    if(i == 0)
      printf("%c", HEAD);
    else
      printf("%c", BODY);
  }
}
 
void createApple(void)
{
  srand(unsigned(time(NULL)));
  apple.x = rand()%18 + 1;
  apple.y = rand()%18 + 1;
  
  gotoxy(apple.x, apple.y);
  printf("%c", APPLE);  
}
 
void check(void)
{
  for(int i = 0; i < len ; i++)
  {
    if(apple.x == snake.x && apple.y == snake.y)
      {
        createApple();
        len++;
        speed -= 2; 
      }
  }
}
 
void move()
{
  if(kbhit())
    key = getch();
    
  for(int i = len - 1; i > 0; i--)
  {
    snake.x = snake[i - 1].x;
    snake.y = snake[i - 1].y;
  }
  
  if(key == 'a')
    snake[0].x--;
  if(key == 'w')
    snake[0].y--;
  if(key == 's')
    snake[0].y++;
  if(key == 'd')
    snake[0].x++;
}
 
void delSnake(void)
{
  for(int i = 0; i < len; i++)
  {
    gotoxy(snake.x, snake.y);
    printf(" ");
  }
}
 
int main()
{
  gameBody();
  paramSnake();
  createApple();
  while(end)
  {
    gotoxy(25, 5);
      printf("Count len %i", len);
    gotoxy(25, 6);
      printf("Speed: %i", speed);
    createSnake();
    check();
    Sleep(speed);
    for(int i = 1; i < len; i++)
    {
      if(snake[0].x == snake.x && snake[0].y == snake.y)
      {
        gotoxy(5, 10);
        printf("Game Over!");
        end = false;
      }
    }
    if(len >=50)
    {
      gotoxy(5, 10);
      printf("Victoria!!!");
      end = false;
    }
    delSnake();
    move();
  }
  getch();
  return 0; 
}
Хочу отметиь, что это только пример и ход моей работы по созданию приложений. Хотя если вы предложите дополнение этого списка будет очень хорошо. P.S Исходник корректно компилируется в: Borland 5.5 dev-cpp-4.9.9.2 cfree 4.1 pro

Решение задачи: «Алгоритм написания программы на си»

textual
Листинг программы
void paramSnake(void)
{
     snake[0].x = 10;
     snake[0].y = 10;
     
     for(int i=0;i < len; i++)
     {
            snake[i].x = snake[0].x;
            snake[i].y = snake[0].y-i;
     }
}

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

  1. paramSnake - функция без параметров, которая меняет координаты частей тела змеи
  2. Переменная snake - массив структур, содержащих координаты частей тела змеи
  3. snake[0] - первая структура в массиве, содержащая координаты головы змеи
  4. snake[0].x = 10; - присваивает значение 10 координате x головы змеи
  5. snake[0].y = 10; - присваивает значение 10 координате y головы змеи
  6. len - переменная, содержащая длину змеи (не определена в данном коде)
  7. for(int i=0;i < len; i++) - цикл, который выполняется len раз
  8. snake[i].x = snake[0].x; - присваивает значение координаты x головы змеи всем структурам в массиве
  9. snake[i].y = snake[0].y-i; - присваивает значение координаты y головы змеи всем структурам в массиве, уменьшенное на i
  10. snake - массив структур, содержащих координаты частей тела змеи
  11. i - переменная цикла, содержащая текущее значение итерации цикла (не определена в данном коде)
  12. Значение i уменьшается на единицу на каждой итерации цикла
  13. snake[i].x и snake[i].y - координаты текущей части тела змеи
  14. Значение snake[i].y уменьшается на i на каждой итерации цикла
  15. Код в цикле изменяет координаты всех частей тела змеи, кроме головы
  16. Результат выполнения функции - изменение координат частей тела змеи в соответствии с заданным алгоритмом
  17. Алгоритм не предусматривает проверку выхода частей тела змеи за пределы экрана или других ограничений
  18. Данный код не содержит в себе графической визуализации змеи или ее движения
  19. Код не содержит комментариев, объясняющих его работу или цели
  20. Для полноценного понимания работы данного кода необходимо дополнительное описание постановки задачи и контекста использования

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


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

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

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