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

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

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

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

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

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
#define SIZE  4
#define NUMBS SIZE*SIZE
#define UP    0
#define DOWN  1
#define LEFT  2
#define RIGHT 3
 
int board[SIZE][SIZE];
 
void FillBoard   ( void );
//ведь в си нет bool?
int  HaveSolution( void );
int  EndOfGame   ( void );
void PrintBoard  ( void );    
void Move        ( int  );
 
 
int main( void )
{
    HANDLE cInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD dr;
    INPUT_RECORD  rec;
    //init
    system("title 15 P U ZZ L E");
    FillBoard();
    PrintBoard();
    //
    while( !EndOfGame() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_LEFT:
                Move(LEFT);
                break;
            case VK_RIGHT:
                Move(RIGHT);
                break;
            case VK_UP:
                Move(UP);
                break;
            case VK_DOWN:
                Move(DOWN);
                break;
            }
            PrintBoard();
        }
    }
    return 0;
}
 
void FillBoard( void )
{
    do
    {
        srand( time( NULL ));
        int numbers[NUMBS] = {0};
        int i;
        int nextNum;
        for(i = 0; i < NUMBS-1; i++)
            while(1)
            {
                nextNum = rand()%(NUMBS-1)+1;
                if(numbers[nextNum] == 0)
                {
                    numbers[nextNum] = 1;
                    board[ i/SIZE ][ i%SIZE ] = nextNum;
                    break;
                }
            }
    } while( !HaveSolution() );
}
 
int HaveSolution( void )
{
    int i, j;
    int inv = 0;
    for(i = 0; i < NUMBS; i++)
    {
        if(board[ i/SIZE ][ i%SIZE ] == 0)
            inv += i+1;
        for(j = 0; j < i; j++)
            if(board[ j/SIZE ][ j%SIZE ] > board[ i/SIZE ][ i%SIZE ])
                inv++;
    }
    return (inv%2 ? 0 : 1);
}
 
int EndOfGame( void )
{
    int i;
    for(i = 0; i < NUMBS-1; i++)
        if(board[ i/SIZE ][ i%SIZE ] != i+1)
            return 0;
    return 1;
}
 
void PrintBoard( void )
{
    system("cls");
    system("color 0F");
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD cPos;
    unsigned char BL = 219;
    SetConsoleTextAttribute(hCon, BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
    printf("15 P U ZZ L E");
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE);
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3;
            cPos.Y = i*2+1;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+2;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            if(board[i][j])
                printf("%c%2i%c", BL, board[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+3;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
    printf("\nM A Y O N E Z\n");
}
 
void Move( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board[i][j] = board[newy][newx];
                        board[newy][newx] = 0;
                    }
                return;
            }
}

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

  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
Похожие ответы