Курсовая работа (т): Розробка клавіатурного тренажеру засобами Microsoft Visual Studio, мовою програмування С++ з використанням об’єктно-орієнтованого підходу

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

-        Кожен об'єкт має незалежну пам'ять, яка складається з інших об'єктів.

- Кожен об'єкт є представником (екземпляром, примірником) класу, який виражає загальні властивості об'єктів.

-        У класі задається поведінка (функціональність) об'єкта. Таким чином усі об'єкти, які є екземплярами одного класу, можуть виконувати одні й ті ж самі дії.

         Класи організовані у єдину деревоподібну структуру з загальним корінням, яка називається ієрархією успадкування. Пам'ять та поведінка, зв'язані з екземплярами деякого класу, автоматично доступні будь-якому класу, розташованому нижче в ієрархічному дереві.

Клас - це спеціальна конструкція, яка використовується для групування пов'язаних змінних та функцій. При цьому згідно з термінологією ООП глобальні змінні класу (члени-змінні) називаються полями даних (також властивостями або атрибутами), а члени-функції називають методами класу. Створений та ініціалізований екземпляр класу називають об'єктом класу. На основі одного класу, можна створити безліч об'єктів, що відрізнятимуться один від одного своїм станом (значеннями полів). Усі примірники одного класу створені за одним шаблоном, тому мають один і той же набір полів та методів. Через методи реалізується поведінка об'єктів.

Об'єкт - окремий екземпляр класу (створюється після запуску програми і ініціалізації полів класу).

Практично вся робота з об'єктами відбувається через методи. Вони можуть змінювати стан об'єкта або ж просто надавати доступ до даних, які були інкапсульовані в об'єкті. Існує кілька видів методів, які мають деякі відмінності в різних мовах програмування. До методів та полів даних можна надавати різні права доступу, від яких залежатиме доступ до них з різних частин програмного коду. Права доступу та вид методів задаються модифікаторами при описі методів. Метод, який проводить створення та початкову ініціалізацію екземпляра класу називають конструктором класу. Метод, який проводить знищення об'єкта, називають деструктором класу.

Інкапсуляція - це приховування деталей про роботу класів від об'єктів, що їх використовують або надсилають їм повідомлення. Інкапсуляція досягається шляхом вказування, які класи можуть звертатися до членів об'єкта. Як наслідок, кожен об'єкт представляє кожному іншому класу певний інтерфейс - члени, доступні іншим класам. Інкапсуляція потрібна для того, аби запобігти використанню користувачами інтерфейсу тих частин реалізації, які, швидше за все, будуть змінюватись. Це дозволить полегшити внесення змін, тобто, без потреби змінювати і користувачів інтерфейсу.

2. Спеціальна частина

.1 Опис програмної реалізації

Реалізована у межах курсової роботи програма складається з двох частин: клас та демонстраційна програма, яка являє собою консольне застосування створене за шаблоном Console Application Win32 і використовує функції класу.

Розглянемо функції системи у вигляді UML діаграми прецедентів, на якій Виділено лише один користувач. Користувач може виконувати наступні функції (див. рис. 2.1):

         Почати тренування можна лише після вибору складності.

         Вибрати рівень (рівень складності впливає на час, визначений для введення слова).

         Вводити символи з клавіатури (введення одного некоректного символу одразу припиняє тренування з ознакою помилки).

         Завершити роботу програми натиснувши клавішу ESC.

Рисунок 2.1 - UML-діаграма прецедентів: користувач

Ядро системи виконує функції, представлені у вигляді діаграми прецедентів на рисунку 2.2. Нижче подано опис функцій системи:

1) Встановлювати рівень складності.

) Встановлювати час на введення слова в залежності від рівня складності.

) Перевіряти символ введений з клавіатури.

) Вивід нового слова на екран.

) Перевіряти правильність введеного слова.

) Вивід кількості введених слів за хвилину.

Рисунок 2.2 - UML-діаграма прецедентів: система

2.2 Опис власних класів

В межах курсової роботи для реалізації логіки гри реалізовано власну ієрархію класів. Нижче подано докладний опис класів. - головний клас, який забезпечує взаємодію між усіма частинами програми.

У таблиці 2.1 представлено опис властивостей класу Game.

Таблиця 2.1 - Опис властивостей класу Game

Властивість

Опис

int _DIFFICULTY_LEVEL

Цілочисленна змінна для встановлення рівня складності

int _DIFFICULTY_TIME

Цілочисленна змінна для встановлення часу на введення слова

const string _WORDS_ARRAY[25]

Масив слів, які повинен вводити користувач

string INDENT = " ";

Змінна символьного типу для відступів


У таблиці 2.2 представлено опис методів класу Game.

Таблиця 2.2 - Опис методів класу Game

Метод

GameEngine()

Конструктор класу

~GameEngine()

Деструктор класу

void setDifficulty(int level = -1)

Встановлює рівень складності

bool play()

Відповідає за процес тренування

string ask()

Зчитує текст з консолі

void print(string str = "", bool same_line = false)

Виводить віповідний текст з результатами


.3 Розробка алгоритму та його опис

Програма розпочинається з вводу користувачем рівня складності. Далі користувач повинен вводити слова які відображаються на екрані за той час, який встановлюється відповідно рівню складності. Система зчитує введені користувачем символи і порівнює із потрібним словом.

Якщо користувач ввів дані вірно, то виводиться наступне слово. Якщо він помилився, то на екран виводиться його результати та команда натиснути відповідну клавішу для повернення в головне меню програми для вибору рівня складності. Користувач може вибрати рівень складності і почати тренуватися знову, або вийти із програми.

Рисунок 2.2 - Алгоритм загальної роботи програми

2.4 Інструкція програміста

Дана програма написана на мові програмування С++ в середовищі Microsoft Visual Studio 2015.

Для конкретної роботи програми на комп’ютері повинна бути встановлена ОС Windows XP/7/8/8.1/10. Комп’ютер повинен мати як 64 МБ оперативної пам’яті.

.5 Інструкція оператора

Щоб взаємодіяти з програмою, використовується клавіатура. Для запуску програми необхідно знайти файли Keyboard.exe та натиснути двічі ЛКМ на ньому.

Механізм взаємодії: на екрані почергово з’являються запити, на які користувач має відповідати задля продовження, використовуючи клавіатуру.

Рисунок 2.3 - Вікно головного меню програми для вибору рівня складності

Після вибору рівня складності користувачу відкривається вікно в якому виводиться слово, яке він повинен ввести за певний час, який залежить від рівня. (див. рис. 2.4).

Рисунок 2.4 - Вікно для вводу слів

Як тільки користувач робить помилку, то відкривається вікно з результатами та проханням натиснути клавішу “y”.

Рисунок 2.5 - Вікно з результатами

3. Лістинг програми

//game.class.h

#pragma onceGameEngine{:_DIFFICULTY_LEVEL = 0;_DIFFICULTY_TIME = 0;INDENT = " ";string _WORDS_ARRAY[25] = {"forever", "instagram", "twitter", "darling", "stairs", "sky", "keyboard", "abuse", "tasty", "jellyfish", "library", "book", "developer", "love", "ball", "hold", "translate", "bottle", "baloon", "chess", "message", "closed", "news", "array", "cobweb"};:(){

}setDifficulty(int level = -1){(level != -1 AND level <= 3){

_DIFFICULTY_LEVEL = level;

_DIFFICULTY_TIME = -level + 5;;

}("CLS"); // Clearing the screen(14);("Let's test how fast are you typing\n");();();(5);("Alright, now we need to choose the difficulty..");(INDENT + "1 - I could find the buttons on the keyboard");(INDENT + "2 - At least I can press some of them");(INDENT + "3 - How about the real typing?");();();

// Getting datatmp = std::atoi(this->ask().c_str());(tmp < 1) tmp = 1;(tmp > 3) tmp = 3;>setDifficulty(tmp);

}play(){("CLS");_word; // Current word_word_length; // Current word lengthtmp_char; // Entered symboltmp_word = ""; // All entered symbolstmp_in_length = 0; // Letter position in the wordis_word_set = false; // Is word set (userd the we need to change the word)is_game_over = false; // Is game over

// Counterc_minutes = 1;c_words_entered = -1;_t c_time_start = time(0);

// Difficulty timer_t d_time_start = time(0);dwPosition = {0, 0};

//CONSOLE_CURSOR_INFO cursor_info;(true){(!is_game_over) // Difficulty timer displaying((int) difftime(time(0), d_time_start) <= _DIFFICULTY_TIME){= {0, 0}; // Setting cursor position(GetStdHandle(STD_OUTPUT_HANDLE), dwPosition);(); // Clear the line("Words per minute: ", true);(2);(std::to_string(c_words_entered / c_minutes), true);();(", time left: ", true);(12);(std::to_string(_DIFFICULTY_TIME - (int) difftime(time(0), d_time_start) ));();

}else{("CLS");(14);("Game over, you lost it! Here are your stats:");(INDENT + "Minutes passed - " + std::to_string(c_minutes));(INDENT + "Words per minute - " + std::to_string(c_words_entered / c_minutes));();("\nPress \"y\" to cuntinue...");_game_over = true; // Game over flag

}(!is_word_set){ // If no more to input - set a new word

_word = _WORDS_ARRAY[getRand(0, 23)];

_word_length = strlen(_word.c_str());_word_set = true;= {0, 1}; // Setting cursor position(GetStdHandle(STD_OUTPUT_HANDLE), dwPosition);(); // Clear the line("Word - ", true);(14);(_word + "\n");();_words_entered++; // Words per minute counter

// Resetting the difficulty timer_time_start = time(0);

}(kbhit() AND !is_game_over){ // Waiting for input_char = getch(); // Reading last symbol= {0, 1}; // Setting cursor position(GetStdHandle(STD_OUTPUT_HANDLE), dwPosition);(); // Clear the line("Word - ", true);(14);(_word + "\n");();(_word.at(tmp_in_length) == tmp_char){ // If the symbol is correct_in_length++; // Moving to the next one(_word_length == tmp_in_length){_word = ""; // Resetting the symbols user have entered before_in_length = 0; // Setting input length to zero_word_set = false; // If the word has ended setting the flag to false to bring us a new word

}

// Displaying= {0, 4}; // Setting cursor position(GetStdHandle(STD_OUTPUT_HANDLE), dwPosition);(); // Clear the line(tmp_in_length != 0){_word += tmp_char;(tmp_word);

}

}else{ // If the user made a mistake("CLS");(14);("Game over, you lost it! Here are your stats:");(INDENT + "Minutes passed - " + std::to_string(c_minutes));(INDENT + "Words per minute - " + std::to_string(c_words_entered / c_minutes));();("\nPress \"y\" to cuntinue...");();_game_over = true; // Game over flag

}

}(kbhit() AND is_game_over){ // Leaving the game loop(getch() == 'y') break;

}((int) difftime(time(0), c_time_start) == 60 AND !is_game_over){ // Counting minutes_time_start = time(0); // If we passed one minute - resetting the time_minutes++;

}(100); // Delay (decreases lags by slowing down the loop iteration speed), default 10

}false; // Telling that the user has lost

}ask(){tmp = "";(cin, tmp);tmp;

}print(string str = "", bool same_line = false){<< str << (!same_line ? "\n" : "");

}

~GameEngine(){

}

};

//util.h

#pragma once

// DefinesgetConsoleWidth();printLine();setConsoleColor(int);getConsoleWidth(){ // Get the console width in symbols_SCREEN_BUFFER_INFO csbi;(GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))csbi.srWindow.Right - csbi.srWindow.Left;return 0;

}clearLine(){(int i = 0; i < getConsoleWidth(); i++){<< " ";

}<< "\r";

}printLine(){(14);(int i = 0; i < getConsoleWidth(); i++){<< "-";

}getRand(int a, int b){((unsigned)time(0));rand() % (b - 1) + a;

}setConsoleColor(int color){

/*

+ Console colors

- green

- dark red // Important data

- purple // Stuzer

- dark orange

- dark grey (default)

- grey

- blue

- green

- red

- pink

- yellow // Error

- white

*/hConsole = GetStdHandle(STD_OUTPUT_HANDLE);(hConsole, color);

}setConseleDefaultColor(){(7);

}

//main.cpp

#define elseif else if

#define null 0

#define OR ||

#define AND &&

// Common defines

#include <windows.h>

#include <iostream>

#include <string>

#include <conio.h>

#include <time.h>

#include <cstdlib>

#include <ctime> namespace std;std::cin;std::cout;std::endl;std::string;

// App includes

#include "util.h"

#include "game.class.h"main(char* argv[], int argc){("title The keyboard trainer");*Game = new GameEngine();>setDifficulty();TheGameLoop = true;(TheGameLoop){(!Game->play()){ // If user lost>setDifficulty();

}

}("PAUSE");

}

Висновок

клавіатурний інкапсуляція програмний тренажер

В ході написання курсової роботи було реалізовано застосування для тренування швидкого десяти пальцевого набору.

Ця задача була реалізована за допомогою мови програмування С++. Мова С++ - мова програмування високого рівня з підтримкою декількох парадигм програмування: об'єктно-орієнтованої, узагальненої та процедурної.

Також було обрано середовище програмування: Microsoft Visual Studio на платформі Windows 10.

Під час виконання курсової роботи була розроблена програма для навчання сліпого методу друку, яка дозволяє задіяти для набору все десять пальців рук; збільшити швидкість набору; зменшити кількість помилок; поліпшити ритмічність набору (що дозволяє зменшити втому при наборі).

Література

1.      Р. Лафоре. Обьектно-ориентированое программирование, 4-е издание. Санкт-Петербург, 2004.

2.      Бьерн Страуструп. Язык программирования С++ - специальное издание. Москва, 2006.

.        Березин Б.И., Березин С.Б. Начальний курс С и С++. 2001.

Источник: https://www.bibliofond.ru/detail.aspx?id=897007