Разработка игры «Крестики-нолики»

Автор работы: Пользователь скрыл имя, 30 Марта 2015 в 07:42, курсовая работа

Описание работы

В данной курсовой работе мы рассмотрим основные принципы и возможности программной среды C++. Для этого используем основные операторы программирования: ветвления, ввода и вывода, цикличности и ввода библиотек, генерации случайных чисел.
При выполнении курсовой работы использовались теоретические и практические знания полученные на уроках информатики, которые применены при выполнения курсового проекта на примере реализации игровых программ в программной среде C++.

Содержание работы

Введение
Введение в объектно-ориентированное программирование.
Интерфейс пользователя и Сценарии использования программы
Функциональные требования
Нефункциональные требования
Исключительные ситуации
Поэтапное описание создание кода игры
Заключение

Литература

Файлы: 1 файл

курсовая2.docx

— 263.95 Кб (Скачать файл)

стандартных классов. Обычно, объект находится в некотором уникальном состоянии, определяемом текущими значениями его атрибутов. Функциональность объектного класса определяется возможными операциями над экземпляром этого класса.

  Структуры.

Структура-группа данных различных типов и(или) назначения, которые представляют собой единый информационный элемент.

 

Поскольку в объектах также можно хранить группы разнотипных данных, то они тоже содержат структуры. Отличие структуры от класса в том, что в структуре нет закрытых и защищенных членов. Все члены структуры открыты.

Объявление структуры аналогично объявлению класса но вместо ключевого слова class ставится ключевое слово Struct :

struct идентификатор

{

Объявление данных или объектов

};

 

Объявлений структуры не подразумевает создание объекта или переменной. Объявление-это просто описание будущего объекта, в данном случае змейки. Чтобы использовать объект определенного класса или переменную определенного типа их сначала необходимо объявить в качестве объекта этого класса или переменной этого типа.

Аналогично для использования структурной переменной необходимо объявить переменную этой структуры.

Графический интерфейс.

Пользовательский интерфейс-это средства общения пользователя с вашей программой. которые могут включать в себя изображения, звуки и текст. Ориентируясь на среднего пользователя интерфейс должен быть простым и удобным. Это снизит вероятность ошибок.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1.   Интерфейс пользователя и Сценарии использования

 

Разрабатывается консольное приложения,

представляющего собой игру «Крестики нолики».

 

Разработчик:

Смысл игры: заключается в том, чтобы играть крестиками или ноликами и набрать больше выигранных комбинаций.

Правила и описание программы: в игру играют два пользователя, которые выбирают между собой чем будут играть крестиком или ноликом и по очереди вводят в окне консоли посредством клавиатуры числа, отвечающие за ячейки. Выигрывает тот пользователь который первым составит выигрышную комбинацию из 3-х подряд крестиков или ноликов по горизонтали, по вертикали или по диагонали. 

 

В меню Menu hodov отображаются цифры в клетках которые отвечают за клетки игровой доски. Пользователи вводят числа от 1 до 9 в строке Vvod chisla и для отображение символа нужно нажать Enter. Если пользаватель вводит 1 то символ икса отобразится в левой нижней клетке, а если введёт 5 символ нолика отобразится в средней клетке и т.д.

Пользователь ввёл выигрышную комбинацию из крестиков и отобразилось меню статистики в котором игроку, играющему иксом отобразился счёт +1. Ниже отображается запрос для пользователя, желает ли он продолжить игру и допустимые ответы y или n.  Для продолжения нужно ввести y или для выхода из игры n нажать Enter.

 

 

4. Функциональные требования

Для запуска игры нужно дважды кликнуть на исполняемом файле с названием игры с расширением exe. Для продолжения нужно ввести y или для выхода из игры n и нажать Enter. Для игры нужно использовать кнопки клавиатуры от 1 до 9, если будут введены другие числа, то появится сообщение в котором говорится что бы пользователь ввёл число от 1 до 9.


 

5. Нефункциональные требования

Приложение игра работает под операционной системой Windows и Linux с установленным wine. Приложение работает быстро и поскольку эта небольшая программа консольное приложение то требования для Персонального компьютера на котором будит использоваться минимальны.

 

6. Исключительные ситуации

Если ввести число более 9-и символов или символ буквы программа перестаёт работать и сваливается в “штопор”. Если такое случится, то нужно срочно закрыть программу нажав красный крестик вверху окна. Почему программа реагирует именно так, решения не нашёл. Решение: добавить дополнительную проверку для символов букв, числа символов числа, самих символов, что бы при вводе таких символов появлялось сообщение “Vvedite chislo ot <1 do 9>”

 

 

 7. Поэтапное описание создание кода игры (8 этапов)

   

  1)  Создание доски в которой пользователь будит вводить данные. Подключается файл <iostream>, в котором объявлен объект cout, при помощи директивы include. Далее создаётся функция main внутри которой расположены инструкции ограниченные фигурными скобками ( { } ). Перед названием функции указывается тип возвращаемого значения. Ключевое слово int означает, что функция возвращает целое число.  Вывод строки на экран с помощью объекта cout. Чтобы исключить конфликт имён все стандартные идентификаторы в языке С++ определены в пространстве имён std. Поэтому перед именем объекта cout необходимо указать название пространства имён. Между названием пространством имён и названием объекта указывается два двоеточия (std::cout ). С помощью std: cout в окно выводится заголовок Menu hodov: и нумерация ячеек "-7-|-8-|-9-" и т.д.  Строки заканчиваются операторами \n (оператор перехода на новую строчку) и endl  в конце строк ( ;) Оператор return возвращает функции main()  0(ноль).

 

 

 

 

 

КОД: (меню выбора)

 

#include <iostream>

int main(){

     std::cout<<"Menu hodov: \n";

     std::cout<<"-7-|-8-|-9-" << std::endl;

     std::cout<<"-4-|-5-|-6-" << std::endl;

     std::cout<<"-1-|-2-|-3-" << std::endl;

     std::cout<<"\n\n";//два оператора \n означает пропуск 2-х строк

 return 0;

}

Консоль выводит:

 

2) Выводится ниже пустая доска с заголовком “Game board” (игровое поле) в которой и будут отображаться X или О. Для ввода X или О в ячейках пустой доски пользователь вводит цифру в строке ниже пустой доски, по средством ввода цифр отвечающих за данную клетку.  К примеру, введя цифру 5 для ячейки принадлежащей цифре 5 в доске "Menu hodov" и отобразится X или О, но в пустой доске расположенной ниже.

                 

КОД:

#include <iostream>

int main(){

  std::cout<<"Menu hodov: \n";//Меню ходов/вводов для                   пользователя

  std::cout<<"-7-|-8-|-9-" << std::endl;

  std::cout<<"-4-|-5-|-6-" << std::endl;

  std::cout<<"-1-|-2-|-3-" << std::endl;

  std::cout<<"\n\n"

  std::cout<<"Game board: \n";       //Игровая доска

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

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

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

  std::cout<<"Your move";

  return 0;

}

Консоль выводит:

 

  3) Создаётся своя функция которая и будит рисовать доску. Что бы не загромождать main. В main останется главная логика (начать программу, взять у пользователя его выбор, нарисовать его на доске). Функция эта будит называться “get_move()“  (Получить ввод пользователя). Переносится в неё из main строки досок (в листинге выделены красным и в main останется только оператор return, возвращающий ноль 0;) и размещаются в { }, точка с запятой после закрывающей функцию фигурной скобки не ставится. Что бы получить вход пользователя создаётся переменная “move” и просим что бы пользователь ввёл эту переменную (число) при помощи “std::cin >>” и возвращаем оператором return  значение  “move”.  Но пользователь может ввести/описаться число меньше 1 и больше 9. Чтобы напомнить пользователю что цифры меньше 1 и больше 9 не играют, создаётся цикл “while” который проверяет: “пока вход который дал пользователь больше 9 (move > 9) или (|| ) вход меньше  1 (move < 1 ). Если пользователь ввёл число меньше 1 и больше 9 то выводится на экран при помощи std::cout<<сообщение "Vvedite chislo ot 1 do 9:". Запрашивается с помощью std::cin>> у пользователя другой вход move(ввод числа от 1 до 9). В функции main пишется несколько строк что бы протестировать функцию. int move = get_move(); std::cout<< "the move you intereted is:"

<< move << std::endl;                                                                                                                                                                                                                                   Пишется с помощью std::cout<< в окне консоли сообщение "the move you intereted is:"

 

Код программы в Приложение 1

Консоль выводит:

 

 

   4) Сейчас программа получает ход пользователя и рисует пустую доску. Чтобы отобразить ход(ввод)пользователя на доске переписывается нынешняя. Доска будит состоять из 9-и однобуквенных стринг char. Заменяется переменная стринг (-) на переменную board[] с номером клетки, т.к.  переменные начинаются с нуля, то вместо 1 пишется 0, вместо 2 пишется 1 и т.д. Пишется простой цикл for (int i=0; i<9; i++) для 9 ходов и два выражения ставятся в цикл int move = get_move()  std::cout <<

"the move you intereted is:" << move <<std::endl. Программа получает вход move, далее меняется массив board[] и пишется board[move-1]([move-1] потому, что когда  вводится 1 первая клетка/ячейка по таблице то изменятся должен 0(нулевой) элемент массива, потому как    клетка/ячейка  начинаются с 1, а элемент той ячейки в массиве начинается с 0(нуля)). Строкой if(i%2 == 0)  проверяется чётное или нечётное число ввёл пользователь т.е. если i по модулю 2 равняется 1, то это чётный ход,  то для board[move-1] задаётся значение ='X', а все остальные ходы будут нечётные и для board[move-1]  задаётся значение ='О'. В цикле while добавляется проверка клеток/ячеек на случай если там уже установлен символ. Добавляется || board[move-1]! =  '-' т.е.  board[move-1] (туда куда будит ставится знак)! = (не равняется) '-'(пустышке).

 

 

Код программы в Приложение 2

 

5) Создаётся функция void print_board(){ … } которая будит выводить  доску на экран. В фигурные скобки вырезается и переносится 4 строки:

 std::cout << "Game board:" << std::endl;

 std::cout << "-"<<board[6]<<"-|-"<<board[7]<<"-|-"<<board[8]<<"- \n";

std::cout << "-"<<board[3]<<"-|-"<<board[4]<<"-|-"<<board[5]<<"- \n";

  std::cout << "-"<<board[0]<<"-|-"<<board[1]<<"-|-"<<board[2]<<"- \n";

И заменяется эти выводы, т.е. место от куда их вырезали, выводом print_board(). В main прописывается вывод сообщения “the final board layout is: \n" в окне консоли” средством” std::cout<< и ниже пишется строка print_board() т.е. используется функция чтобы ещё раз напечатать доску(board). Создаётся функция

void clearscreen() для очистки экрана консоли, для этого заводится  цикл for(int i = 0;  i<100;  i++) который отсчитывает от 0 до 100 и при каждом повторении цикла выводит на экран std::cout<<std::endl; новую строчку. Теперь функция clearscreen() в main ставится в цикл.   Создаётся функция void clearboard()которая очищает доску. Далее для этого заводится цикл for(int i = 0;  i<9;  i++)) который в цикле проходит по всем 9-и ячейкам на доске. board[i] поставит туда  пустышку = '-‘. Это возвращает доску в своё изначальное состояние. Для этого она устанавливается в начале main. Остаётся char board[9]   пустой массив {} потому, что есть функция clearboard()  которая  очистит доску когда запустится main.

 

Код программы в Приложение 3

 

6) Создаётся функция bool has_wonQ(char player)которая проверяет когда игра закончилась. Функция has_wonQ возвращает bool(правда или ложь, т.е. bool это переменная с двумя состояниями либо 0(ноль) если состояние ложь и либо 1(единица) если состояние правда) и передаётся знак (char player)игрока которого проверяем. Ниже создаётся двухмерный массив wins[8][3](8 по 3) в котором перечисляются все выигрышные варианты и пишется рядом/ниже с доской(функцией которая очищает доску).  Далее/ниже заводится цикл for который повторяется 8 раз (int i = 0; i<8; i++)и в этом цикле запускается ещё цикл for который повторяется 3 раза (int j = 0; j<3; j++).  Этими циклами проверяется если у одного из игроков есть фишки на всех трёх местах из какой-нибудь из тройки. К примеру если один из игроков первым поставил крестики или нолики в клетках 1, 2, 3 (т.к. переменные отсчитываются с 0(ноля) тогда эквивалент клеток 1, 2, 3 в окне консоли в коде {0,1,2} ) то он выиграл. После/ниже первого цикла for [i] прописывается переменная int счётчик count и задаётся ей значение =0. Грубо говоря цикл for (int i = 0; i<8; i++)проверяет массив[8], а цикл  for(int j = 0; j<3; j++) проверяет массив [3]. Далее: If если (на boardдоске на квадратике который задан в массиве[wins]по элементу[i] и [j] будит ровняться player (проверяемого X или О (char player)) Если на этом месте в массиве доска стоит X то увеличивается count на единицу ++. В конце цикла говорится If если (счётчик count равняется== 3) т.е. к примеру, проходится троечка {0,1,2} и все три ровняются крестику(Х) или нолику(О) то возвращается return правда true (он выиграл), а если это не произошло, то возвращается return ложь false (он не выиграл). В int main создаётся переменная turn(ход) типа int изначально будит первой ход и ровняться= 0. Ниже вместо цикла for пишется цикл while (не! выиграл пользователь has_wonQ играющий иксом(X)('x') и && не! выиграл пользователь has_wonQ играющий ноликом(О)('О')) то выполняется код ниже. В if (i%2 == 0) заменяется i на turn(вход). В конце цикла говорится turn(ход) на единицу++

 

Код программы в Приложение 4

 

  7) Главная функция вынимается из main и переносится выше. Создаётся функция play_and_get_winner () она будит возвращать char (символ) т.е.  сыграть в игру и получить выигравшего. После выбора Х или О говорится if если (has_wonQ('X’) пользователь играющий за 'X' если он выиграл, то печатается поздравление "X,Pozdravlyau vi vuigrali!" и возвращает return из функции 'X' что пользователь играющий 'X' выиграл. Тоже самое прописывается для пользователя играющего ‘O’. Далее turn ход ++увеличивается if если (turn вход ==ровняется 10). Если ввод равен 10, то НЕЧЬЯ. T.е. ставить крестик или нолик некуда тогда выводится на экран сообщение "nechya" и оператор return возвращает значение D. Пишется чтобы функция print_board принимала стринг под названием индент, void print_board(std::string indent){}. Находится ниже print_board() и в скобках пишется пустой стринг (два двоеточие)  print_board(““), а в функции main талб\t     print_board("\t  "). В главной функции main прописывается выполнение play_and_get_winner ()(главный цикл)и дать   char winner (выигравший). char winner ровняется= play_and_get_winner()

 

Код программы в Приложение 5


8) В функции main первой строкой пишется строка для вывода приветственное сообщения "Privetstvuyu" средством std::cout и оператором <<, и ниже продекларировать стринг reply(ответ). reply(ответ) по началу "y"(то бишь ДА(YES)).Строится цикл while пока ответ положительный, т.е. пока ответ ==ровняется "y". Пишется перечень переменных типа int x_wins=0 (это количество раз, когда пользователь играющий иксами выиграл), o_wins=0(это количество раз, когда пользователь играющий ноликами выиграл), ties=0 (количество ничьи) и всем присвоено нулевое значение. Пишется switch (это конструкция “если, то” при разных значениях ((winner) выигравший) будут выполнятся разные куски кода). Первое значение case 'X', если выиграл пользователь играющий иксами тогда переменная x_wins увеличивается на единицу++ и останавливается break. Второе значение case 'О', если выиграл пользователь играющий ноликами тогда переменная о_wins увеличивается на единицу++ и останавливается break. Третье значение case 'D', если нечья тогда переменная ties увеличивается на единицу++ и останавливается break. Прописывается статистика, выводится статистика на экран/в окно консоли с помощью std::cout <<

"Winer statistic\nPlayer X: " << x_wins, это сколько раз пользователь играющий Х выиграл, "Player 0: "<<o_wins << " and Ties: "<<ties<<" это сколько раз пользователь играющий О выиграл. Сколько ничьи,

"would you like to play again? (y/n):" задаётся вопрос: “желаете продолжить игру?”, а с помощью объекта cin пользователь может ввести значение reply (ответ) y, а если пользователь не хочет играть, то нужно ввести n. Далее пишется цикл while (пока значение reply (ответ)! =не равно "y" или&& пока значение reply (ответ)! =не равно "n") то цикл бесконечен. Следующая строка просит пользователя ввести ещё значение, если до этого не было введено y или n. Следующая строка с помощью объекта cin выводит на экран введённое пользователем значение и опять проверяется в цикле.

Информация о работе Разработка игры «Крестики-нолики»