Реализовать консольное игровое приложения "Пятнашки" (с чего начать, какую литературу и какие темы изучать?) - 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; } }
Объяснение кода листинга программы
- В коде реализована игра
Пятнашки
. - Игра реализована на языке C.
- Для работы с консолью используются библиотеки
, , и . - Игра состоит из основной функции main() и дополнительных функций FillBoard(), HaveSolution(), EndOfGame() и PrintBoard().
- Функция FillBoard() заполняет игровое поле случайными числами от 1 до 15.
- Функция HaveSolution() проверяет, есть ли в игре решение (набор чисел от 1 до 15 без пропусков).
- Функция EndOfGame() проверяет, достигнута ли конечная позиция (когда все числа от 1 до 15 расставлены).
- Функция PrintBoard() выводит игровое поле на экран.
- В основной функции main() происходит инициализация игрового поля, вывод его на экран, а затем начинается цикл игры, в котором пользователь управляет перемещением чисел с помощью клавиш со стрелками.
- Для управления курсором в консоли используется функция SetConsoleCursorPosition().
- Для перемещения чисел по игровому полю используется функция Move().
- В игре используется алгоритм поиска в глубину (DFS) для проверки наличия решения.
- Код содержит макросы и константы для удобства работы с игровым полем: SIZE (размер поля), NUMBS (общее количество ячеек), UP, DOWN, LEFT, RIGHT (коды направлений движения).
- В игре используется ASCII-кодировка для представления чисел и символов на игровом поле.
- Для генерации случайных чисел используется функция rand() из библиотеки
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д