В запускаемой функции main реализована следующая последовательность действий:
1. Объявление переменных;
2. Диалог с пользователем с помощью операторов if/else. Чтобы выполнить операцию, пользователь должен, выбрать один из предлагаемых пунктов;
3. Вызовы функций;
4. Выход из программы.
Блок - схема работы main() представлена на рисунке 3.
Рисунок 3 - Блок-схема главной функции игры «Алфавит»
3. ОПИСАНИЕ И ТЕСТИРОВАНИЕ РАБОТЫ ПРОГРАММЫ
Первое, что делает программа при запуске- это предлагает ознакомится с правилами игры (рисунок 4)
Рисунок 4 - Окно приветствие
Если пользователь вводит «Y», то на экран выводятся правила игры и следующее предложение о начале игры (рисунок 5), а если «N» - то просто запускает игру
Рисунок 5 - Окно ознакомления с правилами и предложением начать игру
После начала игры, пользователь вводит предполагаемые буквы до тех пор, пока не заполнит всё поле. После каждого хода будет выводится предложение сделать ещё ход. Если же будет введено не корректное значение программа выдаст ошибку и предложит ввести букву заново (рисунок 6).
Рисунок 6 - Ошибка ввода
Если игра прошла успешно, то на экран будет выведено сообщение о победе (рисунок 7).
Рисунок 7 - Игра, закончившиеся с победой
ЗАКЛЮЧЕНИЕ
Программа игры-головоломки «Алфавит» -- это простой и полезный программный продукт, способный развить у пользователя
В ходе проектирования курсового проектирования на языке высокого уровня C с использованием среды разработки Microsoft Visual Studio 2019 была реализована программа игры-головоломки. Разработанная программа реализует один сценарий игры - произвольный. В игре реализован диалог с пользователем
При решении поставленной задачи были выполнены следующие действия:
· Реализован запрос на ввод данных для координат и значение выбранной ячейки;
· Реализован диалог с пользователем и предоставление выбора в меню;
· Были реализованы функции для проверки корректности и правильности введенных значений;
· Проведена работа с научно-технической литературой;
· Проведена отладка программы и написана сопроводительная документация.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Стивен Прата. Язык программирования С, 6-е издание 2019.,926 с.
2. Минакова О.В. Основы программирования и алгоритмизации: практикум / О.В.Курипта, О.В. Минакова, Д.К. Проскурин; Воронежский ГАСУ. - Воронеж, 2015. - 132 с.
ПРИЛОЖЕНИЕ
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<locale.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define SIZE 9
#define LATER_COUNT (SIZE - 4)
void printer(char** tab);
void full_elements(char** K);
void step(char** tab);
int row_check(int coll, char** tab);
int coll_check(int coll, char** tab);
int is_correct_decision(char** tab);
void main()
{
setlocale(LC_ALL, "RUS");
char start, answer;
while (1) {
printf("%35c Игра головоломка-Алфавит %c\n", '*', '*');
printf("Хотите ознакмиться с правилами игры? (Y-да, N-нет)\n");
if (answer = getchar() == 'Y') printf("Задача - Заполнить головоломку буквами из указанного диапазона так,\n чтобы в каждом ряду и колонке каждая буква встречалась лишь однажды. Некоторые клетки могут оставаться пустыми.\n Буквы, стоящие на границе сетки, показывают, какая буква встретится первой в данном ряду (колонке). \n\n");
printf("Хотите начать игру? (Y-да, N-нет)\n");
scanf("%c", &start);
if ((start = getchar()) == 'N') break;
/*getchar();*///мешало запускать сразу
char** tablica;
tablica = (char**)calloc(9, sizeof(char*));
for (int i = 0; i < 9; i++)
{
tablica[i] = (char*)calloc(9, sizeof(char));
}
full_elements(tablica);
printer(tablica);
while (!is_correct_decision(tablica))
{
step(tablica);
}
printf("%35c Уровень пройден!!! %c\n", '*', '*');
for (int i = 0; i < 9; i++)
{
free(tablica[i]);
}
free(tablica);
system("pause");
}
}
void print_line()
{
for (int i = 0; i < 10 * 6; i++)
{
printf("-");
}
printf("\n");
}
void print_first_line()
{
printf("\n-----------");
for (int i = 0; i < 7; i++)
{
printf(" %d: ", i + 1);
}
printf("-------\n");
}
void printer(char** tab)// строка, столбец
{
for (int row = 0; row < 9; row++) {
if (row == 0)
{
print_first_line();
}
else
{
print_line();
}
if (row > 0 && row != 8)
{
printf("\n");
printf("%d: ", row);
}
else
{
printf(" ");
}
printf("|");
for (int i = 1; i <= 9; i++)
{
printf("|%4c ", tab[row][i - 1]);
}
printf("|");
printf("|");
printf("\n");
}
}
void full_elements(char** tab)
{
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
tab[i][j] = ' ';
if (i == 0 && j == 1)tab[i][j] = 'B';
if (i == 0 && j == 3)tab[i][j] = 'E';
if (i == 0 && j == 4)tab[i][j] = 'A';
if (i == 0 && j == 5)tab[i][j] = 'D';
if (i == 0 && j == 6)tab[i][j] = 'E';
if (i == 0 && j == 7)tab[i][j] = 'A';
if (i == 1 && j == 0)tab[i][j] = 'B';
if (i == 2 && j == 0)tab[i][j] = 'D';
if (i == 3 && j == 0)tab[i][j] = 'C';
if (i == 4 && j == 0)tab[i][j] = 'A';
if (i == 5 && j == 0)tab[i][j] = 'A';
if (i == 7 && j == 0)tab[i][j] = 'D';
if (i == 8 && j == 1)tab[i][j] = 'D';
if (i == 8 && j == 2)tab[i][j] = 'E';
if (i == 8 && j == 3)tab[i][j] = 'D';
if (i == 8 && j == 4)tab[i][j] = 'C';
if (i == 8 && j == 5)tab[i][j] = 'A';
if (i == 8 && j == 7)tab[i][j] = 'C';
if (i == 1 && j == 8)tab[i][j] = 'A';
if (i == 2 && j == 8)tab[i][j] = 'B';
if (i == 3 && j == 8)tab[i][j] = 'E';
if (i == 4 && j == 8)tab[i][j] = 'C';
if (i == 6 && j == 8)tab[i][j] = 'D';
}
}
}
void step(char** tab)
{
int row;
int coll;
char later;
printf("\nВведите позицию и букву в формате i:j=A, где i - номер строки, j - номер столбца, а A - буква\nЧтобы удалить букву используйтe символ '-': \n");
while (!scanf("%d:%d = %c", &row, &coll, &later)) {
scanf("%*s");
}
while (row >= SIZE || coll >= SIZE || row <= 0 || coll <= 0)
{
if (row == 0 && coll == 0 && later == 'E') exit(1);
printf(" Введите корректное значение в формате i:j=A, где i и j принадлежат отрезку [1, %d]:\n", SIZE-2);
scanf("%d:%d=%s", &row, &coll, &later);
}
if (later == '-') later = ' ';
tab[row][coll] = later;
printer(tab);
}
int row_check(int row, char** tab)
{
int tab_row = row + 1;
int* meetings = (int*)calloc(LATER_COUNT, sizeof(int));
for (int i = 0; i < LATER_COUNT; ++i)
{
meetings[i] = 0;
}
for (int i = 1; i < SIZE - 1; ++i)// идем по строке
{
int index = (int)tab[tab_row][i] - (int)'A';
if (tab[tab_row][i] == ' ')// неизмененные (пустые) элементы нас не интересуют
{
continue;
}
else if (index >= 0 && index < LATER_COUNT)
{
meetings[index] ++;
}
}
for (int i = 0; i < LATER_COUNT; ++i)
{
if (meetings[i] != 1)
{
return 0;
}
}
return 1;
}
int coll_check(int coll, char** tab)//для столбцов
{
int tab_coll = coll + 1;
int* meetings = (int*)calloc(LATER_COUNT, sizeof(int));
for (int i = 0; i < LATER_COUNT; ++i)
{
meetings[i] = 0;
}
for (int i = 1; i < SIZE - 1; ++i)// идем по строке
{
int index = (int)tab[i][tab_coll] - (int)'A';
if (tab[i][tab_coll] == ' ')// неизмененные (пустые) элементы нас не интересуют
{
continue;
}
else if(index >= 0 && index < LATER_COUNT)
{
meetings[index] ++;
}
}
for (int i = 0; i < LATER_COUNT; ++i)
{
if (meetings[i] != 1)
{
return 0;
}
}
return 1;
}
int is_correct_decision(char** tab)
{
int* correctness_of_rows = (int*)calloc((SIZE-2), sizeof(int));
int* correctness_of_colls = (int*)calloc((SIZE-2), sizeof(int));
for (int i = 0; i < SIZE-2; ++i)
{
correctness_of_rows[i] = row_check(i, tab);
correctness_of_colls[i] = coll_check(i, tab);
}
for (int i = 0; i < SIZE - 2; ++i)
{
if (correctness_of_rows[i] == 0 || correctness_of_colls[i] == 0)
return 0;
}
return 1;
}