Реализовать консольное игровое приложения "Пятнашки" (с чего начать, какую литературу и какие темы изучать?) - C (СИ)

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

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

День добрый. Я - первокурсник, не так давно начал изучать язык С. И вот выдали мне тему курсового проекта: реализация игрового приложения "Пятнашки" в консоли на языке С. Квадратные глаза и n-ное кол-во кирпичей - вот так можно описать мое состояние. Срок сдачи приближается и я решился обратиться за помощью. Посоветуйте, с чего вообще начинать, какую литературу и какие темы изучать? И, может быть, у кого-нибудь завалялась готовая программа? =) Заранее спасибо.

Решение задачи: «Реализовать консольное игровое приложения "Пятнашки" (с чего начать, какую литературу и какие темы изучать?)»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <windows.h>
  5.  
  6. #define SIZE  4
  7. #define NUMBS SIZE*SIZE
  8. #define UP    0
  9. #define DOWN  1
  10. #define LEFT  2
  11. #define RIGHT 3
  12.  
  13. int board[SIZE][SIZE];
  14.  
  15. void FillBoard   ( void );
  16. //ведь в си нет bool?
  17. int  HaveSolution( void );
  18. int  EndOfGame   ( void );
  19. void PrintBoard  ( void );    
  20. void Move        ( int  );
  21.  
  22.  
  23. int main( void )
  24. {
  25.     HANDLE cInput = GetStdHandle(STD_INPUT_HANDLE);
  26.     DWORD dr;
  27.     INPUT_RECORD  rec;
  28.     //init
  29.     system("title 15 P U ZZ L E");
  30.     FillBoard();
  31.     PrintBoard();
  32.     //
  33.     while( !EndOfGame() )
  34.     {
  35.        
  36.         //Sleep(50);
  37.         ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
  38.         FlushConsoleInputBuffer(cInput);
  39.         if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
  40.         {
  41.             switch(rec.Event.KeyEvent.wVirtualKeyCode)
  42.             {
  43.             case VK_LEFT:
  44.                 Move(LEFT);
  45.                 break;
  46.             case VK_RIGHT:
  47.                 Move(RIGHT);
  48.                 break;
  49.             case VK_UP:
  50.                 Move(UP);
  51.                 break;
  52.             case VK_DOWN:
  53.                 Move(DOWN);
  54.                 break;
  55.             }
  56.             PrintBoard();
  57.         }
  58.     }
  59.     return 0;
  60. }
  61.  
  62. void FillBoard( void )
  63. {
  64.     do
  65.     {
  66.         srand( time( NULL ));
  67.         int numbers[NUMBS] = {0};
  68.         int i;
  69.         int nextNum;
  70.         for(i = 0; i < NUMBS-1; i++)
  71.             while(1)
  72.             {
  73.                 nextNum = rand()%(NUMBS-1)+1;
  74.                 if(numbers[nextNum] == 0)
  75.                 {
  76.                     numbers[nextNum] = 1;
  77.                     board[ i/SIZE ][ i%SIZE ] = nextNum;
  78.                     break;
  79.                 }
  80.             }
  81.     } while( !HaveSolution() );
  82. }
  83.  
  84. int HaveSolution( void )
  85. {
  86.     int i, j;
  87.     int inv = 0;
  88.     for(i = 0; i < NUMBS; i++)
  89.     {
  90.         if(board[ i/SIZE ][ i%SIZE ] == 0)
  91.             inv += i+1;
  92.         for(j = 0; j < i; j++)
  93.             if(board[ j/SIZE ][ j%SIZE ] > board[ i/SIZE ][ i%SIZE ])
  94.                 inv++;
  95.     }
  96.     return (inv%2 ? 0 : 1);
  97. }
  98.  
  99. int EndOfGame( void )
  100. {
  101.     int i;
  102.     for(i = 0; i < NUMBS-1; i++)
  103.         if(board[ i/SIZE ][ i%SIZE ] != i+1)
  104.             return 0;
  105.     return 1;
  106. }
  107.  
  108. void PrintBoard( void )
  109. {
  110.     system("cls");
  111.     system("color 0F");
  112.     HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
  113.     COORD cPos;
  114.     unsigned char BL = 219;
  115.     SetConsoleTextAttribute(hCon, BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
  116.     printf("15 P U ZZ L E");
  117.     SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE);
  118.     int i, j;
  119.     for(i = 0; i < SIZE; i++)
  120.     {
  121.         for(j = 0; j < SIZE; j++)
  122.         {
  123.             cPos.X = j*3;
  124.             cPos.Y = i*2+1;
  125.             //maybe at five or maybe at six
  126.  
  127.             SetConsoleCursorPosition(hCon, cPos);
  128.             printf("%c%c%c%c", BL, BL, BL, BL);
  129.             cPos.Y = i*2+2;
  130.             cPos.X = j*3;
  131.             SetConsoleCursorPosition(hCon, cPos);
  132.             if(board[i][j])
  133.                 printf("%c%2i%c", BL, board[i][j], BL);
  134.             else
  135.                 printf("%c  %c", BL, BL);
  136.             cPos.Y = i*2+3;
  137.             cPos.X = j*3;
  138.             SetConsoleCursorPosition(hCon, cPos);
  139.             printf("%c%c%c%c", BL, BL, BL, BL);
  140.         }
  141.     }
  142.     SetConsoleTextAttribute(hCon, BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
  143.     printf("\nM A Y O N E Z\n");
  144. }
  145.  
  146. void Move( int direction )
  147. {
  148.     int dy[] = {1,-1, 0, 0};
  149.     int dx[] = {0, 0, 1,-1};
  150.     int i, j;
  151.     for(i = 0; i < SIZE; i++)
  152.         for(j = 0; j < SIZE; j++)
  153.             if(board[i][j] == 0)
  154.             {
  155.                 int newy = i + dy[direction];
  156.                 int newx = j + dx[direction];
  157.                 if( newy >= 0 && newy < SIZE &&
  158.                     newx >= 0 && newx < SIZE)
  159.                     {
  160.                         board[i][j] = board[newy][newx];
  161.                         board[newy][newx] = 0;
  162.                     }
  163.                 return;
  164.             }
  165. }

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

  1. В коде реализована игра Пятнашки.
  2. Игра реализована на языке C.
  3. Для работы с консолью используются библиотеки , , и .
  4. Игра состоит из основной функции main() и дополнительных функций FillBoard(), HaveSolution(), EndOfGame() и PrintBoard().
  5. Функция FillBoard() заполняет игровое поле случайными числами от 1 до 15.
  6. Функция HaveSolution() проверяет, есть ли в игре решение (набор чисел от 1 до 15 без пропусков).
  7. Функция EndOfGame() проверяет, достигнута ли конечная позиция (когда все числа от 1 до 15 расставлены).
  8. Функция PrintBoard() выводит игровое поле на экран.
  9. В основной функции main() происходит инициализация игрового поля, вывод его на экран, а затем начинается цикл игры, в котором пользователь управляет перемещением чисел с помощью клавиш со стрелками.
  10. Для управления курсором в консоли используется функция SetConsoleCursorPosition().
  11. Для перемещения чисел по игровому полю используется функция Move().
  12. В игре используется алгоритм поиска в глубину (DFS) для проверки наличия решения.
  13. Код содержит макросы и константы для удобства работы с игровым полем: SIZE (размер поля), NUMBS (общее количество ячеек), UP, DOWN, LEFT, RIGHT (коды направлений движения).
  14. В игре используется ASCII-кодировка для представления чисел и символов на игровом поле.
  15. Для генерации случайных чисел используется функция rand() из библиотеки .

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


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

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

6   голосов , оценка 4.333 из 5

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

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

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