Моделирование игры "Крестики-нолики"

Разработка аналога игры "Крестики-нолики", где игроки выбирают размер поля. Правила игры. Интерфейс программы. Главная функция main. Класс XO. Метод вывода поля и хода игроков. Методы поиска крестиков, ноликов. Методы проверки выигрышных ситуаций игроков.

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

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

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

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

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего образования

"Московский технологический университет"

МИРЭА

Институт кибернетики

Кафедра высшей математики

КУРСОВОЙ ПРОЕКТ (РАБОТА)

по дисциплине

«Методы программирования»

Тема курсового проекта (работы)

«Моделирование игры “Крестики-нолики”»

Содержание

Введение

1. Теоретическая часть

1.1 Правила игры

1.2 Интерфейс программы

2. Описание программы “Крестики-нолики”

2.1 Главная функция main()

2.2 Класс XO

2.1.1 Метод вывода поля

2.1.2 Методы хода игроков

2.1.3 Методы поиска крестиков и ноликов

2.1.4 Методы проверки выигрышных ситуаций игроков

Заключение

Список литературы

Приложение

Введение

Цель данной курсовой работы - используя ООП, написать аналог игры “Крестики-нолики”, где игроки выбирают размер поля.

Игра “Крестики-нолики” была придумана очень давно, но до сих пор она является актуальной и распространённой по всему миру.

Реализация курсовой работы будет проведена на языке С++.

1. Теоретическая часть

1.1 Правила игры

игра интерфейс программа поле

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

1.2 Интерфейс программы

Программа предоставляет возможность играть в “крестики-нолики”. Для запуска программы нужно сделать двойной щелчок по ярлыку программы. На экране появится основное окно программы (Рис. 1).

Рис. 1

На рисунке представлено поле классической игры, и видно, как игрокам предложили ввести свои имена и количество крестиков (размер поля).

При победе одного из игроков выводится сообщение о выигрыше и предлагается сыграть заново (Рис. 2). Для примера на рисунке представлено поле 5 на 5 и выведено сообщение об ошибке. Она возникает тогда, когда игрок ставит свой символ на занятую клетку.

Рис. 2

На рис. 3 для примера рассмотрено поле 4 на 4. Игроки заполнили все клетки, и вывелось сообщение о ничьей.

Рис. 3

2. Описание программы “Крестики-нолики”

В начале программа узнает, как зовут игроков. Потом им предоставляется выбор размера поля. После ввода значения программа выводит в консоли квадратное поле и сообщение, какой игрок ходит и куда он ставит крестик или нолик. Если все условия выигрыша по классическим правилам игры соблюдены, то программа сообщит, какой пользователь выиграл, и предложит сыграть еще раз, или если игроки заполнят все поле, но будет ничья, то программа выведет сообщение: “StandoFF!”.После выигрыша одного из пользователей или после ничьей им будет возможность начать новую игру или завершить программу. Если игрок поставит свой символ на клеточку, которая занята его соперником, то на экран выведется ошибка, и появится возможность заново написать координаты свободной клетки поля.

2.1 Главная функция main()

В начале главной функции идет объявление переменных:

int sIzefield, x, y;

bool checkX, checkO;

charanswer;

char f_player[10], s_player[10];

Переменные xи у используются для задания координаты элементов. А переменная sIzefieldотвечает за размер поля.Массивы f_player[10] и s_player[10]используется для хранения имени пользователей. Послезапускапрограмма выводит сообщение игрокам о просьбе ввести имена:

cout << "Please, print in the name of the first player: "; cin >> f_player;

cout << "Please, print in the name of the second player: "; cin >> s_player;

Так как в конце завершенной игры предоставляется возможность начать заново, то основной код функции main() заключен в цикл,

do{ …}while(answer == 'y');

вкотором проверяется, будет ли начинаться новая игра или нет, только после того, как в цикле выполнится весь код.В начале цикла с постусловием программа выведет сообщение: “NewGame!”, - и предложит ввести размер поля.

В главной функции gameобъявляется, как объект класса XO, и в него передается переменная sIzefield,

XO game(sIzefield);

game.printfield();

а после программа выводит в консоли пустое поле, заполненное лишь точками.

Из-за того, что поле квадратное, то игроки могу делать количество ходов, равных квадрату заданного размера поля, поэтому воспользуемся циклом со счетчиком

for(int step = 0; step < sIzefield*sIzefield; step++){ … }

Первый игрок делает ход каждый раз, когда значение переменнойstepявляется четным числом, а второй ходит в остальных случаях.

if((step % 2) == 0){

Ход первого игрока

}else{

Ход второго игрока

}

За ход первого игрока отвечает метод класса XO с входными аргументами: x, y.

game.playingX(x, y);

game.playingO(x, y);

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

checkX = game.WinCross();

checkO = game.WinNull();

если первый игрок выигрывает, то есть переменная checkX равна истине, то программа выводит сообщение о победе первого игрока, происходит выход из цикла со счетчиком, и игра завершается

cout << "First player WIN!!!" << endl;

break;

Аналогично происходит и с победой второго игрока.

Если никто не может выиграть, то на последнем ходе первого игрока происходит проверка, если переменные не равны истине, то программа выводит сообщение о ничьей.

if (step == (sIzefield*sIzefield - 1))

if ((!checkX) && (!checkO))

cout << "StandoFF!" << endl;

В конце пользователям будет предложено сыграть заново, если переменнаяanswerбудет равна значению`y'.

2.2 Класс ХО

В начале класса описываются все его поля:

char** ptr;

int** numberarr;

int sizeField;

Поле numberarrбудет участвовать в создании числового массива, размер которого будет равняться переменной sizeField, а ptr для символьного массива, куда будут записыватьсякрестики и нолики.

Класс ХО содержит в себе конструктор и деструктор, метод вывода поля на экран:

voidprintfield(void);

Методыходаигроков:

intplayingX(intx, inty);

int playingO(int x, int y);

Методы нахождения крестиков и ноликов в столбце, строке и двух диагоналях, а также методы проверки выигрышных ситуаций:

int FindCross(int startX, int startY, int endX, int endY);

bool WinCross(void);

int FindNull(int startX, int startY, int endX, int endY);

bool WinNull(void);

В конструкторе класса задаются два динамических многомерных массива символов и целых чисел размера sizeFieldна sizeField. Первый заполняется точками, а во время игры игроки заполняют его своими символами, второй заполняется нулями, а когда пользователь ставит крестик или нолик в пустуюклеточку, то в ячейку данного массива ставится 1 или 2.

2.2.1 Метод вывода поля

Данный метод класса ХО отображает игровое поле. Так как в игре присутствуют элементы всего трех видов:“X”, “O” и “.”, то метод может отображать каждый из этих элементов. Чтобы нарисовать красивое поле для игры “Крестики-нолики”, используются некоторые символы с клавиатуры:

for (int i = 0, g = 0; i < (sizeField * 2 + 1); i++){

if (i % 2 == 0){

cout << "+";

for( int h = 0; h < sizeField; h++)

cout << "--+";

cout << endl;}

else{

cout <<"| " ;

for (int j = 0; j < sizeField; j++){

cout<< ptr[g][j] << " | "; }

cout<<endl;

g++;}}

2.2.2 Методы хода игроков

После того, как поле выведено на экран, то появляется сообщение, что ходит первый игрок. Тогда пользователю предлагается ввести координаты клеточки, куда он поставит свой символ. Для проверки правильности хода игрока отвечает цикл с постусловием

do{... } while(numberarr[x - 1][y - 1] != 0);

если клетка не занята, то произойдет завершение цикла и в массив numberarr передастся значение 1 или 2.

Также в самом цикле предусмотрена проверка и если координаты введены правильно, то в массив ptrпередается значение крестика или нолика.

if(numberarr[x - 1][y - 1] == 0){

ptr[x - 1][y - 1] = 'X';}

В другом случае программа выдаст ошибку и выведет сообщение, что клетка занята, и предложит ввести координаты другой.

2.2.3 Методы поиска крестиков или ноликов

intFindCross(intstartX, intstartY, intendX, intendY)

intFindNull(intstartX, intstartY, intendX, intendY)

Данныефункции принимают на вход четыре аргумента, благодаря которым происходит своеобразный выбор поиска ряда символов: по столбцам, по строкам и по двум диагоналям. В начале инициализируется переменная k, которая будет счетчиком символов, его будет возвращать функция.

Если значения startXиendX не равны, то в цикле со счетчиком проверяется строка поля:

for(inti = 0; i<endX; i++){

if(numberarr[endY][i] == 1)

k++;

else

return k;

Если следующее условие является истиннойif(startY != endY), то выполняется проверка по столбцам поля:

for(inti = 0; i<endY; i++){

if(numberarr[i][endX] == 1)

k++;

else

return k;}

Если два выше перечисленных условия являются ложными, то тогда следует проверка по диагоналям: значение startXравно размеру поля, в то время, как переменные startYиendYдолжны быть равны друг другу, но не равняться значению sIzefield, программа проверяет значения первой диагонали и если они не равны нулю, то счетчику kприбавляется единица:

for(inti = 0, j = (startX - 1); i<startX; i++, j-){

if(numberarr[j][i] == 1)

k += 1;

else

return k;}

А проверка второй диагонали выполняется тогда, когда переменная startY равна значению sIzefield:

for(inti = 0; i<sizeField; i++){

if(numberarr[i][i] == 1)

k += 1;

else

return k;}

При этом startX и endX не должны равняться размеру поля, но должны быть равны друг другу.

2.2.4 Методы проверки выигрышных ситуаций игроков

boolWinCross(void);

boolWinNull(void);

Данные методы имеют тип bool, когда игрок обыгрывает своего противника и ставит в ряд или в столбец, или по диагоналям свой символ, то возвращается значение true, в другом случае будет выводиться значение false. Они используют методы поискакрестиковилиноликов с определенными значениями, чтобы проверять все столбцы и строки. Сначала объявляются переменные:

introws, columns, diagonal1, diagonal2;

Для того, чтобы перебирались все возможные комбинации для входных аргументов в функции intFindCross() и intFindNull()используется цикл в цикле со счетчиком:

for(inti = 0; i<sizeField; i++){

for(int j = 0; j <sizeField; j++){проверка }

За проверку по строкам отвечает переменная rows, если она будет равна размеру поля, то метод возвращает значение true:

rows = FindCross(j, i, sizeField, i);

if(rows == sizeField)

return true;

Аргумент columnsответственен за проверку по столбцам, при равенстве этой переменной значению sizeField, будет возвращаться значение true:

columns = FindCross(i, j, i, sizeField);

if(columns == sizeField)

return true;

Аналогично производятся и проверки по диагоналям:

diagonal1 = FindCross(sizeField, j, sizeField, j);

if(diagonal1 == sizeField)

return true;

diagonal2 = FindCross(0, sizeField, 0, sizeField);

if(diagonal2 == sizeField){

returntrue;

Если все условия не выполняются, то возвратится значение false.

Заключение

В ходе курсовой рaботы углублены и зaкреплены теоретические и практические знания объектно-ориентированного программирования на C++.

Изначально был придуман план игры и были внесены небольшие корректировки в правилах классической игры “Крестики-нолики”. На базе полученных знаний по дисциплине “Методы программирования” была придумана реализация программы. Для завершения полной картины автором данной курсовой работы был написан аналог игры, где пользователи сами выбирают размер поля.

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

Список литературы

1. Шилдт, Г. Самоучитель С++: учебное пособие по программированию / Г. Шилдт. - Изд-во БХВ-Петербург. - 3-е изд.2003.- 681 с.

2. Доунсон М. Изучаем С++ через программирование игр: учеб.пособие/М. Доунсон. - Изд-во Питер.- 2016.-352 с.

3. Гарднер М. Крестики-нолики/ М. Гарден. - Изд-во Мир.-1988.-358 с.

Приложение

#include <iostream>

using namespace std;

class XO{

char** ptr;

int** numberarr;

intsizeField;

public:

XO(int sizeField1);

~XO();

voidprintfield(void);

intplayingX(int x, int y);

intplayingO(int x, int y);

intFindCross(intstartX, intstartY, intendX, intendY);

boolWinCross(void);

intFindNull(intstartX, intstartY, intendX, intendY);

boolWinNull(void);};

void XO::printfield(void){

for (inti = 0, g = 0; i< (sizeField * 2 + 1); i++){

if (i % 2 == 0){

cout<< "+";

for(int h = 0; h <sizeField; h++)

cout<< "--+";

cout<<endl;}

else{

cout<<"| " ;

for (int j = 0; j <sizeField; j++){

cout<<ptr[g][j] << " | ";}

cout<<endl;

g++;}}}

int XO::playingX(int x, int y){

do{

if(numberarr[x - 1][y - 1] == 0){

ptr[x - 1][y - 1] = 'X';

}else{

cout<< "\n\n\n ERROR!!!" <<endl;

cout<< "This cell is occupied. Please select free cell." <<endl;

cout<< "x, y: "; cin>> x >> y;

if(numberarr[x - 1][y - 1] == 0)

ptr[x - 1][y - 1] = 'X';}

} while(numberarr[x - 1][y - 1] != 0);

numberarr[x - 1][y - 1] = 1;

return 0;}

int XO::playingO(int x, int y){

do{

if(numberarr[x - 1][y - 1] == 0)

ptr[x - 1][y - 1] = 'O';

else{

cout<< "\n\n\n ERROR!!!" <<endl;

cout<< "This cell is occupied. Please select free cell." <<endl;

cout<< "x, y: "; cin>> x >> y;

if(numberarr[x - 1][y - 1] == 0)

ptr[x - 1][y - 1] = 'O';}

}while(numberarr[x - 1][y - 1] != 0);

numberarr[x - 1][y - 1] = 2;

return 0;}

int XO::FindCross(intstartX, intstartY, intendX, intendY){

int k = 0;

if(startX != endX){

for(inti = 0; i<endX; i++){

if(numberarr[endY][i] == 1)

k++;

else

return k;}

}else if(startY != endY){

for(inti = 0; i<endY; i++){

if(numberarr[i][endX] == 1)

k++;

else

return k;}

}else{

if(startX == sizeField){

for(inti = 0, j = (startX - 1); i<startX; i++, j-){

if(numberarr[j][i] == 1)

k += 1;

else

return k;}}

if(startY == sizeField){

for(inti = 0; i<sizeField; i++){

if(numberarr[i][i] == 1)

k += 1;

else

return k;}}}

return k;}

int XO::FindNull(intstartX, intstartY, intendX, intendY){

int k = 0;

if(startX != endX){

for(inti = 0; i<endX; i++){

if(numberarr[endY][i] == 2)

k++;

else

return k;}

}else if(startY != endY){

for(inti = 0; i<endY; i++){

if(numberarr[i][endX] == 2)

k++;

else

return k;}

}else{

if(startX == sizeField){

for(inti = 0, j = (startX - 1); i<startX; i++, j-){

if(numberarr[j][i] == 2)

k += 1;

else

return k;}}

if(startY == sizeField){

for(inti = 0; i<sizeField; i++){

if(numberarr[i][i] == 2)

k += 1;

else

return k;}}}

return k;}

bool XO::WinCross(void){

int rows = 0, columns = 0, diagonal1 = 0, diagonal2 = 0;

for(inti = 0; i<sizeField; i++){

for(int j = 0; j <sizeField; j++){

rows = FindCross(j, i, sizeField, i);

if(rows == sizeField)

return true;

columns = FindCross(i, j, i, sizeField);

if(columns == sizeField)

return true;

diagonal1 = FindCross(sizeField, j, sizeField, j);

if(diagonal1 == sizeField)

return true;

diagonal2 = FindCross(0, sizeField, 0, sizeField);

if(diagonal2 == sizeField){

return true;}}}

return false;}

bool XO::WinNull(void){

int rows, columns, diagonal1, diagonal2;

for(inti = 0; i<sizeField; i++){

for(int j = 0; j <sizeField; j++){

rows = FindNull(j, i, sizeField, i);

if(rows == sizeField)

return true;

columns = FindNull(i, j, i, sizeField);

if(columns == sizeField)

return true;

diagonal1 = FindNull(sizeField, j, sizeField, j);

if(diagonal1 == sizeField)

return true;

diagonal2 = FindNull(0, sizeField, 0, sizeField);

if(diagonal2 == sizeField)

return true;}}

return false;}

XO::XO(int sizeField1){

sizeField = sizeField1;

ptr = new char* [sizeField];

numberarr = new int* [sizeField1];

for (int h = 0; h <sizeField; h++){

ptr[h] = new char [sizeField];

numberarr[h] = new int [sizeField1];}

for (int row = 0; row <sizeField; row++){

for (int column = 0; column <sizeField; column++){

ptr[row][column] = '.';

numberarr[row][column] = 0;}}}

XO::~XO(){

for(int h = 0; h <sizeField; h++){

delete [] ptr[h];

delete [] numberarr[h];}}

int main(){

intsIzefield, x, y;

boolcheckX, checkO;

char answer;

charf_player[10], s_player[10];

cout<< "Please, print in the name of the first player: "; cin>>f_player;

cout<< "Please, print in the name of the second player: "; cin>>s_player;

cout<<endl;

do{

cout<< " New Game!" <<endl;

cout<< "Enter the number of crosses: "; cin>>sIzefield;

if(sIzefield< 3){

cout<< "\n Error! Wrong size of field" <<endl;

sIzefield = 3;}

XO game(sIzefield);

game.printfield();

for(int step = 0; step <sIzefield*sIzefield; step++){

if((step % 2) == 0){

cout<< " " <<f_player<< " move..." <<endl;

cout<< " Enter the row and the column: "; cin>> x >> y;

game.playingX(x, y);

game.printfield();

checkX = game.WinCross();

if(checkX == true){

cout<<f_player<<" WIN!!!" <<endl;

break;}

}else{

cout<< " " <<s_player<< " move..." <<endl;

cout<< " Enter the row and the column: "; cin>> x >> y;

game.playingO(x, y);

game.printfield();

checkO = game.WinNull();

if (checkO){

cout<<s_player<< " WIN!!!" <<endl;

break;}}

if (step == (sIzefield*sIzefield - 1))

if ((!checkX) && (!checkO))

cout<< "StandoFF!" <<endl;}

cout<< "\n\n\n Game over!" <<endl;

cout<< "Do you want to play again? (input 'y' or anything to exit) "; cin>> answer;

}while(answer == 'y');

return 0;}

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


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

  • Разработка популярной развлекательной игры крестики-нолики. Возможность играть с компьютером, который играет согласно созданному алгоритму. Новые возможности Visual Studio. Легкое усвоение программы. Удобный интерфейс - "визитная карточка" приложения.

    курсовая работа [74,6 K], добавлен 20.12.2009

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

    курсовая работа [236,5 K], добавлен 27.01.2014

  • Проект программы "Крестики-нолики". Блок-схема алгоритма. Описание работы программного продукта. Инструкция по инсталляции. Инструкция программисту, возможность доработки с целью упрощения исполняемых кодов. Инструкция по проверке и тестированию.

    курсовая работа [235,8 K], добавлен 05.12.2009

  • Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.

    курсовая работа [821,5 K], добавлен 13.02.2012

  • Разработка алгоритма, выполняющего поиск наилучшего решения на каждый ход в игре "крестики-нолики" (используя минимальный алгоритм). Обоснование выбора программных средств для решения задачи. Блок-схема интеллектуального алгоритма реализации программы.

    контрольная работа [380,0 K], добавлен 28.04.2014

  • Разработка консольного приложения: описание и сценарий использования программы, интерфейс пользователя. Поэтапное описание создание кода компьютерной игры "Крестики нолики". Функциональные и нефункциональные требования, описание исключительных ситуаций.

    методичка [819,6 K], добавлен 12.05.2013

  • Программный продукт для игры "Крестики-нолики". Описание пользовательского интерфейса. Факт базы данных, определяющий состояние счёта. Предикат изменяющий состояние игрового процесса и подсчитывающий количество занятых ячеек поля. Исходный код программы.

    курсовая работа [34,6 K], добавлен 19.05.2014

  • Общая характеристика языков программирования. Краткий обзор C, C++, Java, PHP, Python, Delphi и Visual Basic. Процесс разработки программы игра "Крестики и нолики" с помощью AppWizard. Компиляция и компоновка модулей, определение интерфейса приложения.

    курсовая работа [2,5 M], добавлен 27.05.2014

  • Разработка программы игры в крестики-нолики. Примеры игровой ситуации на игровом поле. Описание входных и выходных данных, переменных и функций программы. Реализация алгоритма работы программы на языке C++. Текст программы и примеры ее выполнения.

    курсовая работа [352,8 K], добавлен 14.04.2011

  • Технические и пользовательские характеристики игры, требования к программному обеспечению и среде разработки C#. Составление блок-схемы алгоритма, uml-диаграммы и текста программы, тестирование корректности компьютерного кода и результатов его работы.

    курсовая работа [1,8 M], добавлен 05.03.2013

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