Програма перевірки логічного мислення

Розробка програми перевірки логічного мислення людини на мові програмування С++, результатом якої є моделювання координатного переміщення. Визначення структури вхідних та вихідних даних, вибір мови програмування. Розгляд алгоритму рішення задачі.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 28.04.2015
Размер файла 55,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ЗМІСТ
1. Вступ
2. Технічні характеристики
2.1 Постановка задачі
2.2 Визначення структури вхідних даних
2.3 Визначення структури вихідних даних
2.4 Визначення вимог до технічних засобів
2.5 Вибір мови програмування
2.6 Опис алгоритму рішення задачі
2.7 Виконання програми
Висновок
Список використаних джерел
Додаток А. Схема алгоритму програми
Додаток Б. Лістинг програми
1 ВСТУП

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

І це різноманіття завдань переходить в різноманіття програм, які повинні розробляти програмісти.

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

Одночасно вони звільняють програмістів від необхідності деталізувати програми до рівня занадто дрібних машинних команд і навіть від необхідності знати особливості конкретних обчислювальних машин.

Більше того, операційні системи покликані перетворити обчислювальні машини з предмета постійного занепокоєння в "істоти", які самі дбають про програміста і готові надавати всілякі послуги йому і його програмі.

В моїй курсовій роботі я розробив програму перевірки логічного мислення людини.

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

2. ТЕХНІЧНІ ХАРАКТЕРИСТИКИ

2.1 Постановка задачі

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

Розробка Програми перевірки логічного мислення людини потрібна для того, щоб перевіряти логічне мислення людини.

Програма повинна вміти:

­ Розташовувати гральне поле 3х3 на екрані;

­ Виводити на гральне поле символи Х та О у бажаному місці.

Програма повинна складатися з єдиного програмного модуля. Усі данні які виводить ця програма зберігаються у середовищі операційної системи.

2.2 Визначення структури вхідних даних

Структура вхідних даних показана в таблиці 2.1.

Таблиця 2.1 - Структура вхідних даних

Ідентифікатор

Тип

Діапазон

Пояснення

1

Minimax

int

0..255

Головна функція для алгоритму MiniMax

2

MinMove

int

0..255

Допоміжна функція для алгоритму

3

MaxMove

int

0..255

Допоміжна функція для алгоритму

2.3 Визначення структури вихідних даних

Результатом роботи програми є моделювання координатного переміщення.

Структура вихідних даних наведена у таблиці 2.2.

Таблица 2.2 - Структура вихідних даних

Ідентифікатор

Тип

Диапазон

Пояснення

1

Symbol

char

0..255

Гральний символ

2

Move

int

0..100

Змінна переміщення символу

3

Board

char

9

Гральне поле

2.4 Визначення вимог до технічних засобів

Програма „Статистика використання клавіатури" була розроблена на комп'ютері такої конфігурації:

­ Amd Athlon II X2 250 Processor;

­ Пам'ять 4 Гбайт;

­ Жорсткий диск 250 Гбайт;

­ Кольоровий монітор;

­ Операційна система Windows 8.1.

Для нормального функціонування Програми перевірки логічного мислення людини необхідний мінімальний набір технічних і програмних засобів :

­ Персональний комп'ютер сумісний з IBM PC/XT;

­ дискова операційна система DOS версією 5 і вище.

­ вмонтований накопичувач на магнітному диску загальним об'ємом не менше 10 Мбайт;

­ монітор кольоровий;

­ кількість вільної оперативної пам'яті не менше 900 Кбайт;

­ накопичувач для резервного копіювання інформації;

2.5 Вибір мови програмування

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

C++ має слідуючі можливості і особливості:

має простий синтаксис;

­ легкість реалізації на більшості сучасних ЕОМ;

­ підтримує різні парадигми програмування;

­ потужна мова, що містить засоби створення ефективних програм практично будь-якого призначення, від низькорівневих утиліт і драйверів до складних програмних комплексів самого різного призначення;

­ можливий доступ до тисячі раніше написаних програм;

­ гнучкість і надійність;

­ простота і ясність конструкцій;

­ можливість роботи на низькому рівні з пам'яттю, адресами, портами;

Недоліками мови С++ є:

­ погана підтримка модульності;

­ деякі перетворення типів не інтуїтивні;

­ препроцесор С ++ дуже примітивний;

­ мова C + + є складною для вивчення.

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

Дякуючи своїй ефективності, простоті вона швидко отримала поширення у всьому світі. В наш час майже всі обчислювальні машини можуть працювати на цій мові. Тексти програм на цій мові легко перевіряються на правильність. Створена спеціально для навчання програмуванню мова стала успішною і відразу привернула увагу провідних спеціалістів. За короткий час мова С++ отримала широку популярність у всьому світі, тепер є на всіх машинах, починаючи з самих скромних мікрокомп'ютерів - до найбільших супер-ЕОМ, і практично для всіх операційних систем. Велика кількість програмістів використовує саме цю мову при розробці різного виду проектів. Очевидно, ця мова буде зберігати перше місце ще не один рік, при цьому як і раніше розвиваючись і вдосконалюючись.

2.6 Опис алгоритму рішення задачі

Програма моделювання координатного переміщення працює по такому алгоритму:

­ Завантаження Меню.

­ Після завантаження меню у ньому присутні три умови.

­ При виборі першої умови користувач починає гру з комп'ютером.

­ При виборі другої умови користувач починає гру з іншим користувачем.

­ При виборі третьої умови програма завершується.

­ Перевірка рахунку.

­ Ім'я переможця відображається на головному екрані.

логічний моделювання алгоритм програма

2.7 Виконання програми

Програма перевірки логічного мислення працює так: спочатку для запуску програми необхідно запустити виконавчий exe-файл.

Після того як з'явиться робоче вікно програми користувач повинен обрати одну з трьох умов. Для зупинення роботи програми користувач повинен обрати "Вихід". Після того як користувач натисне "Грати з комп'ютером" починається гра з комп'ютером.

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

ВИСНОВОК

В даній курсовій роботі розроблена Програма перевірки логічного мислення.

В результаті розробки проекту я здобув навички роботи у середовищі програмування С++. Розширив свої знання про структуру внутрішніх даних комп'ютера, а також багато дізнався про методи роботи з операційною системою за допомогою мови високого рівня С++. Відчув різницю між прикладним та системним програмуванням.

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Тихомиров Ю.С., Громов Ю.Ю. Мова програмування С ++, спец. вид. / Kyiv, 2007.

2. Програмування на мові високого рівня / Т.А. Павловська. - СПб .: Питер, 2009.

3. Давидов В. Г. Програмування та основи алгоритмізації. Учеб. посібник / Давидов В. Г. - М .: Вища школа, 2003.

ДОДАТОК А

Схема алгоритму програми

ДОДАТОК Б

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

#include <windows.h>

#include <iostream>

#include <string>

#include <ctime>

#include <list>

static const int INFINITY = 1000000;

static enum {START, PLAYING, QUIT, OWIN, XWIN, DRAW} state;

static enum {REGULAR, PROGRESSIVE} display_mode;

typedef struct {

std::string name;

char symbol;

int move;

int game_win;

int draw_num;

bool selected;

bool win;

} player;

void display_board();

void seed_random_generator();

void get_move();

void display_result();

void select_game_type();

void get_player_symbol();

void get_player_name();

void reset_player_name();

void find_winner();

void reset_winner();

void update_board();

void update_screen();

void verify_move();

void reset_state();

void reset_board();

void initialise_player_move();

void display_intro();

void display_game_progress();

void update_game();

void setup_game_screen();

bool wrong_symbol();

bool wrong_selection();

bool game_over();

bool free_square();

void generate_moves(char _board[9], std::list<int> &move_list);

void check_game_state(char board[9]);

int evaluate_position(char _board[9], player _player);

int MiniMax(char _board[9], player _player);

int MinMove(char _board[9], player _player);

int MaxMove(char _board[9], player _player);

static player player1, player2, current_player; //

static std::string game_type;

static std::string prev_game_type;

static char board[9] = {0};

static char cSymbol;

static int nMove;

int main() {

seed_random_generator();

setup_game_screen();

display_intro();

select_game_type();

if(state != QUIT) {

get_player_name();

get_player_symbol();

while(state != QUIT) {

while(state == PLAYING) {

initialise_player_move();

get_move();

update_game();

}

if(game_over()) {

find_winner();

display_result();

set_game_statistic();

reset_state();

reset_board();

display_intro();

}

select_game_type();

}

}

return 0;

}

void select_game_type() {

std::cout << " 1 - Igrat protiv computera." << std::endl;

std::cout << " 2 - Igrat protiv drugogo igroka." << std::endl;

std::cout << " 3 - Exit" << std::endl;

std::cout << "\nselection: ";

int choice;

std::cin >> choice;

if(!std::cin.good()) {

std::cout << "tol'ko integer'" << std::endl;

update_screen();

}

switch(choice) {

case 1:

game_type = "human vs computer";

break;

case 2:

game_type = "human vs human";

break;

case 3:

state = QUIT;

break;

default:

std::cout << "Nepravel'nui vibor'." << std::endl;

update_screen();

}

if(choice > 0 && choice < 3) {

if(prev_game_type != "" && game_type != prev_game_type) {

reset_game_statistic();

reset_player_name();

get_player_name();

get_player_symbol();

}

if(game_type.length() > 0) {

prev_game_type = game_type;

}

}

}

void get_player_name() {

std::cin.sync();

if(game_type == "human vs computer") {

std::cout << "\nVvedite vashe imya: ";

std::getline(std::cin, player1.name);

if(player1.name.length() == 0) {

get_player_name();

}

player2.name = "computer";

} else if(game_type == "human vs human") {

while(player1.name.length() == 0) {

std::cout << "\aIgrok 1, vvedite vashe imya: ";

std::getline(std::cin, player1.name);

}

while(player2.name.length() == 0) {

std::cout << "Igrok 2, vvedite vashe imya: ";

std::getline(std::cin, player2.name);

}

} else if(game_type == "computer vs computer") {

player1.name = "computer player1";

player2.name = "computer player2";

}

}

void reset_player_name() {

player1.name.erase();

player2.name.erase();

}

void get_player_symbol() {

if(game_type == "human vs computer") {

int selection = rand() % 2;

if(selection == 0) {

rand() % 2 == 0 ? player2.symbol = 'X' : player2.symbol = 'O';

cSymbol = player2.symbol;

player2.selected = 1;

std::cout << player2.name << " budet igrat'' \'" << player2.symbol << "\'" << std::endl;

} else if(selection == 1) {

std::cout << player1.name << " viberite vash simvol (X, O): ";

std::cin >> player1.symbol;

player1.symbol = toupper(player1.symbol);

cSymbol = player1.symbol;

player1.selected = 1;

}

} else if(game_type == "human vs human") {

int sel = rand() % 2;

std::string player_name = "";

if(sel == 0) {

player_name = player1.name;

player1.selected = 1;

} else if(sel == 1) {

player_name = player2.name;

player2.selected = 1;

}

std::cout << "\n" << player_name << " viberite vash simvol (X, O): ";

if(sel == 0) {

std::cin >> player1.symbol;

player1.symbol = toupper(player1.symbol);

cSymbol = player1.symbol;

} else {

std::cin >> player2.symbol;

player2.symbol = toupper(player2.symbol);

cSymbol = player2.symbol;

}

} else if(game_type == "computer vs computer") {

std::string player_name;

int sel = rand() % 2;

if(sel == 0) {

rand() % 2 == 0 ? player1.symbol = 'X' : player1.symbol = 'O';

player_name = player1.name;

player1.selected = 1;

cSymbol = player1.symbol;

} if(sel == 1) {

rand() % 2 == 0 ? player2.symbol = 'X' : player2.symbol = 'O';

player_name = player2.name;

player2.selected = 1;

cSymbol = player2.symbol;

}

std::cout << player_name << " budet igrat'' \'" << cSymbol << "\'" << std::endl;

}

if(!std::cin.good() || wrong_symbol()) {

std::cout << "tol'ko X ili O!'" << std::endl;

system("pause");

get_player_symbol();

}

if(!player2.selected) {

player1.symbol == 'X' ? player2.symbol = 'O' : player2.symbol = 'X';

player1.symbol == 'O' ? player2.symbol = 'X' : player2.symbol = 'O';

} else if(!player1.selected) {

player2.symbol == 'X' ? player1.symbol = 'O' : player1.symbol = 'X';

player2.symbol == 'O' ? player1.symbol = 'X' : player1.symbol = 'O';

}

state = PLAYING;

}

void get_move() {

std::cin.sync();

if(game_type == "human vs human") {

if(player1.selected) {

std::cout << player1.name << " vvedite vash hod (1 - 9): ";

std::cin >> player1.move;

nMove = player1.move;

cSymbol = player1.symbol;

player1.selected = 0;

player2.selected = 1;

current_player = player1;

} else if(player2.selected) {

std::cout << player2.name << " vvedite vash hod (1 - 9): ";

std::cin >> player2.move;

nMove = player2.move;

cSymbol = player2.symbol;

player1.selected = 1;

player2.selected = 0;

current_player = player2;

}

} else if(game_type == "human vs computer") {

if(player1.selected) {

std::cout << "\n" << player1.name << " vvedite vash hod (1 - 9): ";

std::cin >> player1.move;

if(!std::cin.good()) {

std::cin.clear();

std::cin.sync();

}

nMove = player1.move;

cSymbol = player1.symbol;

current_player = player1;

player1.selected = 0;

player2.selected = 1;

Sleep(1000);

} else if(player2.selected) {

player2.move = MiniMax(board, player2);

nMove = player2.move;

cSymbol = player2.symbol;

current_player = player2;

player1.selected = 1;

player2.selected = 0;

reset_state();

Sleep(1500);

}

} else if(game_type == "computer vs computer") {

if(player1.selected) {

player1.move = MiniMax(board, player1);

nMove = player1.move;

cSymbol = player1.symbol;

current_player = player1;

player1.selected = 0;

player2.selected = 1;

reset_state();

Sleep(2500);

} else if(player2.selected) {

player2.move = MiniMax(board, player2);

nMove = player2.move;

cSymbol = player2.symbol;

current_player = player2;

player1.selected = 1;

player2.selected = 0;

reset_state();

Sleep(2500);

}

}

verify_move();

if(game_over()) {

return;

}

}

void set_game_statistic() {

if(state == START) {

player1.game_win = 0;

player1.draw_num = 0;

player1.win = 0;

player2.game_win = 0;

player2.draw_num = 0;

player2.win = 0;

} else if(state == XWIN || state == OWIN) {

if(player1.win) {

player1.game_win++;

player1.win = 0;

} else if(player2.win) {

player2.game_win++;

player2.win = 0;

}

} else if(state == DRAW) {

player1.draw_num++;

player2.draw_num++;

}

}

void reset_game_statistic() {

player1.game_win = 0;

player1.draw_num = 0;

player1.win = 0;

player2.game_win = 0;

player2.draw_num = 0;

player2.win = 0;

player1.selected = 0;

player2.selected = 0;

}

void display_game_statistic() {

if(state != START) {

std::cout << "\ngame statistic" << std::endl;

std::cout << "==============" << std::endl;

std::cout << player1.name << " has won " << player1.game_win << " game(s)." << std::endl;

std::cout << player2.name << " has won " << player2.game_win << " game(s)." << std::endl;

std::cout << player1.draw_num << " game(s) ended with a draw." << std::endl;

}

}

void find_winner() {

if(state == XWIN && player1.symbol == 'X') {

player1.win = 1;

} else if(state == OWIN && player1.symbol == 'O') {

player1.win = 1;

} else if(state == XWIN && player2.symbol == 'X') {

player2.win = 1;

} else if(state == OWIN && player2.symbol == 'O') {

player2.win = 1;

}

}

void reset_winner() {

player1.win = 0;

player2.win = 0;

}

bool wrong_symbol() {

return (cSymbol != 'X' && cSymbol != 'O');

}

bool wrong_selection() {

return !(nMove > 0 && nMove < 10);

}

void initialise_player_move() {

player1.move = -1;

player2.move = -1;

}

bool game_over() {

return (state == XWIN || state == OWIN || state == DRAW);

}

void reset_state() {

state = PLAYING;

}

void reset_board() {

for(int i = 0; i < 9; ++i) {

board[i] = 0;

}

}

void update_board() {

if(state == PLAYING) {

if(player1.move != -1 && player2.move == -1) {

board[player1.move - 1] = player1.symbol;

} else if(player2.move != -1) {

board[player2.move - 1] = player2.symbol;

}

}

}

void display_result() {

if(player1.win) {

std::cout << player1.name << " pobedil!" << std::endl;

} else if(player2.win) {

std::cout << player2.name << " pobedil!" << std::endl;

} else if(player1.win == 0 && player2.win == 0) {

std::cout << "nichya!" << std::endl;

}

system("pause");

system("cls");

}

void update_game() {

update_board();

display_game_progress();

check_game_state(board);

}

bool free_square() {

if(player1.move != -1 && player2.move == -1) {

return board[player1.move - 1] == 0;

} else if(player2.move != -1) {

return board[player2.move - 1] == 0;

}

return 0;

}

void display_board() {

std::cout << std::endl;

std::cout << " " << board[0] << " | " << board[1] << " | " << board[2] << std::endl;

std::cout << "-----------" << std::endl;

std::cout << " " << board[3] << " | " << board[4] << " | " << board[5] << std::endl;

std::cout << "-----------" << std::endl;

std::cout << " " << board[6] << " | " << board[7] << " | " << board[8] << std::endl;

std::cout << std::endl;

std::cin.sync();

}

void display_game_progress() {

if(display_mode == PROGRESSIVE) {

system("cls");

display_intro();

}

std::cout << "\npole posle hoda " << current_player.name << std::endl;

display_board();

}

void verify_move() {

if(wrong_selection() || !free_square()) {

std::cout << "nepravelnui hod." << std::endl;

if(player2.move == -1) {

player1.selected = 1;

player2.selected = 0;

} else {

player1.selected = 0;

player2.selected = 1;

}

system("pause");

if(game_type == "human vs computer") {

player1.selected = 1;

player2.selected = 0;

}

get_move();

}

}

void seed_random_generator() {

srand((unsigned) time(NULL));

}

void display_intro() {

std::cout << "\n/////////////////////////////////////////" << std::endl;

std::cout << " Krestiki-Noliki " << std::endl;

std::cout << "/////////////////////////////////////////" << std::endl;

}

void setup_game_screen() {

system("mode con: cols=99 lines=300");

}

void update_screen() {

system("pause");

system("cls");

std::cin.clear();

std::cin.sync();

display_intro();

select_game_type();

}

void check_game_state(char board[9]) {

if ((board[0] == cSymbol && board[1] == cSymbol && board[2] == cSymbol) ||

(board[3] == cSymbol && board[4] == cSymbol && board[5] == cSymbol) ||

(board[6] == cSymbol && board[7] == cSymbol && board[8] == cSymbol) ||

(board[0] == cSymbol && board[3] == cSymbol && board[6] == cSymbol) ||

(board[1] == cSymbol && board[4] == cSymbol && board[7] == cSymbol) ||

(board[2] == cSymbol && board[5] == cSymbol && board[8] == cSymbol) ||

(board[0] == cSymbol && board[4] == cSymbol && board[8] == cSymbol) ||

(board[2] == cSymbol && board[4] == cSymbol && board[6] == cSymbol))

{

if(cSymbol == 'X') {

state = XWIN;

} else if(cSymbol == 'O') {

state = OWIN;

}

}

else {

state = DRAW;

for(int i = 0; i < 9; ++i) {

if(board[i] == 0) {

state = PLAYING;

break;

}

}

}

}

void generate_moves(char _board[9], std::list<int> &move_list) {

for(int i = 0; i < 9; ++i) {

if(_board[i] == 0) {

move_list.push_back(i);

}

}

}

int evaluate_position(char _board[9], player _player) {

check_game_state(_board);

if(game_over()) {

if((state == XWIN && _player.symbol == 'X') ||

(state == OWIN && _player.symbol == 'O')) {

return +INFINITY;

} else if((state == XWIN && _player.symbol == 'O') ||

(state == OWIN && _player.symbol == 'X')) {

return -INFINITY;

} else if(state == DRAW) {

return 0;

}

}

return -1;

}

int MiniMax(char _board[9], player _player) {

int best_val = -INFINITY, index = 0;

std::list<int> move_list;

char best_moves[9] = {0};

generate_moves(_board, move_list);

while(!move_list.empty()) {

_board[move_list.front()] = _player.symbol;

cSymbol = _player.symbol;

int val = MinMove(_board, _player);

if(val > best_val) {

best_val = val;

index = 0;

best_moves[index] = move_list.front() + 1;

} else if(val == best_val) {

best_moves[++index] = move_list.front() + 1;

}

_board[move_list.front()] = 0;

move_list.pop_front();

}

if(index > 0) {

index = rand() % index;

}

return best_moves[index];

}

int MinMove(char _board[9], player _player) {

int pos_value = evaluate_position(_board, _player);

if(pos_value != -1) {

return pos_value;

}

int best_val = +INFINITY;

std::list<int> move_list;

generate_moves(_board, move_list);

while(!move_list.empty()) {

_player.symbol == 'X' ? cSymbol = 'O' : cSymbol = 'X';

_board[move_list.front()] = cSymbol;

int val = MaxMove(_board, _player);

if(val < best_val) {

best_val = val;

}

_board[move_list.front()] = 0;

move_list.pop_front();

}

return best_val;

}

int MaxMove(char _board[9], player _player) {

int pos_value = evaluate_position(_board, _player);

if(pos_value != -1) {

return pos_value;

}

int best_val = -INFINITY;

std::list<int> move_list;

generate_moves(_board, move_list);

while(!move_list.empty()) {

_player.symbol == 'X' ? cSymbol = 'X' : cSymbol = 'O';

_board[move_list.front()] = cSymbol;

int val = MinMove(_board, _player);

if(val > best_val) {

best_val = val;

}

_board[move_list.front()] = 0;

move_list.pop_front();

}

return best_val;

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.