Създаване на игра Tic-Tac-Toe в C++

S Zdavane Na Igra Tic Tac Toe V C



Tic-tac-toe е интересна, стара и класическа игра, която е забавлявала поколенията. В tic-tac-toe двама играчи се състезават върху мрежа от 9 квадрата, която е маркирана с шаблон. Всеки играч поема своя ред и поставя символа (O или X) в едно от празните квадратчета. В тази статия ще проучим как да създадете тик-так игра на езика за програмиране C++. Следващият пример ще ви преведе през изграждането на проста, но ангажираща игра с тик-так пръсти, обхващайки основните концепции, разбивки на кода и съображения за създаване на интерактивно игрово изживяване.

Създайте игра Tic-Tac-Toe в C++

Следващият пример предоставя основите за създаване на тази интерактивна игра с тик-так-пръст за двама играчи. Той демонстрира прост и лесен подход за програмиране с C++ и предоставя добре документиран изходен код, за да преживеете тези предизвикателства от детството с приятели в нов, цифров формат. Нека видим следния код.

Пример: Основен Tic-Tac-Toe, базиран на конзола, без използване на 2D масив

В този пример ще използваме 2D масив, функции и условия if-else, за да направим играта tic-tac-toe в C++. В тази игра на двама играчи е разрешено да се редуват при въвеждането на своите ходове и това определя състоянието на играта чрез проверка за победител или равенство. Вижте следния даден код:







#include

използване на пространство от имена std ;

невалиден теглителна дъска ( въглен дъска [ 3 ] [ 3 ] ) ;

bool isMoveValid ( въглен дъска [ 3 ] [ 3 ] , вътр ред , вътр полк ) ;

bool еBoardFull ( въглен дъска [ 3 ] [ 3 ] ) ;

въглен checkWinner ( въглен дъска [ 3 ] [ 3 ] ) ;

вътр основен ( ) {

въглен дъска [ 3 ] [ 3 ] = { { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } } ;

вътр ред , полк ;

въглен currentPlayer = 'Х' ;

докато ( вярно ) {

теглителна дъска ( дъска ) ;

cout << 'Играч' << currentPlayer << 'на ред. Въведете ред (1-3) и колона (1-3): ' ;

храня се >> ред >> полк ;

ред --;

полк --;

ако ( isMoveValid ( дъска , ред , полк ) ) {

дъска [ ред ] [ полк ] = currentPlayer ;

въглен победител = checkWinner ( дъска ) ;

ако ( победител != ' ' ) {

теглителна дъска ( дъска ) ;

cout << 'Играч' << победител << ' е победител! ' ;

прекъсвам ;

}

ако ( isBoardFull ( дъска ) ) {

теглителна дъска ( дъска ) ;

cout << „Равенство е! ' ;

прекъсвам ;

}

currentPlayer = ( currentPlayer == 'Х' ) ? 'О' : 'Х' ;

} друго {

cout << „Невалиден ход. Изберете друга клетка. ' ;

} }

връщане 0 ;

}

невалиден теглителна дъска ( въглен дъска [ 3 ] [ 3 ] ) {

cout << 'b| \T 1 \T | \T 2 \T | \T 3 \T | ' ;

cout << ' ______________________ ' ;

за ( вътр м = 0 ; м < 3 ; м ++ ) {

cout << м + 1 << '| ' ;

за ( вътр T = 0 ; T < 3 ; T ++ ) {

cout << '' << дъска [ м ] [ T ] ;

ако ( T < 2 ) cout << ' \T | \T ' ;

}

cout << ' \T | ' ;

ако ( м < 2 ) cout << ' ______________________ ' ;

}

cout << ' ' ; }

bool isMoveValid ( въглен дъска [ 3 ] [ 3 ] , вътр ред , вътр полк ) {

връщане ( ред >= 0 && ред < 3 && полк >= 0 && полк < 3 && дъска [ ред ] [ полк ] == ' ' ) ;

}

bool еBoardFull ( въглен дъска [ 3 ] [ 3 ] ) {

за ( вътр м = 0 ; м < 3 ; м ++ ) {

за ( вътр T = 0 ; T < 3 ; T ++ ) {

ако ( дъска [ м ] [ T ] == ' ' ) {

връщане невярно ;

} } }

връщане вярно ; }

въглен checkWinner ( въглен дъска [ 3 ] [ 3 ] ) {

за ( вътр м = 0 ; м < 3 ; м ++ ) {

ако ( дъска [ м ] [ 0 ] == дъска [ м ] [ 1 ] && дъска [ м ] [ 1 ] == дъска [ м ] [ 2 ] && дъска [ м ] [ 0 ] != ' ' ) {

връщане дъска [ м ] [ 0 ] ;

}

ако ( дъска [ 0 ] [ м ] == дъска [ 1 ] [ м ] && дъска [ 1 ] [ м ] == дъска [ 2 ] [ м ] && дъска [ 0 ] [ м ] != ' ' ) {

връщане дъска [ 0 ] [ м ] ;

} }

ако ( дъска [ 0 ] [ 0 ] == дъска [ 1 ] [ 1 ] && дъска [ 1 ] [ 1 ] == дъска [ 2 ] [ 2 ] && дъска [ 0 ] [ 0 ] != ' ' ) {

връщане дъска [ 0 ] [ 0 ] ;

}

ако ( дъска [ 0 ] [ 2 ] == дъска [ 1 ] [ 1 ] && дъска [ 1 ] [ 1 ] == дъска [ 2 ] [ 0 ] && дъска [ 0 ] [ 2 ] != ' ' ) {

връщане дъска [ 0 ] [ 2 ] ;

}

връщане ' ' ;

}

Ето разбивка на неговата функционалност:



“#include ” е директива за препроцесор, която включва I/O поток библиотеката за входно/изходни операции. Използването на „именно пространство std“ позволява директно използване на функции cout, cin и т.н. в C++ програма, без да се изисква „std:: prefix“.



В тази програма има четири прототипа на функции – те са drawBoard(), isMoveValid(), isBoardFull() и checkWinner(). Декларацията на функцията е известна като прототип на функция. Въпреки че идва след основната функция в програмата, тя ще бъде използвана. Основната функция съдържа цикъл на играта и логика за управление на ходовете и ходовете на играчите. В рамките на основната функция дъската за игра се инициализира с интервали.





въглен дъска [ 3 ] [ 3 ] = { { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } } ;

След това се дефинират две променливи за ред и колона, за да съхраняват въведеното движение на играча. 'char currentPlayer = 'X';' определя, че играчът „X“ е първи.

Сега започва (истинската) цикъл на играта и продължава, докато има победител или равенство. Този цикъл „while“ извиква „drawBoard();“ за показване на таблото. След показване на дъската на конзолата, потребителят е помолен да избере клетка, която да маркира в следния код:



cout << 'Играч' << currentPlayer << 'на ред. Въведете ред и колона (1-3): ' ;

Играчът въвежда своя ход в “cin >> row >> col;”.

След като изберете клетка за маркиране, програмата първо ще провери валидността на въведеното, като се увери, че клетката вече не е попълнена чрез извикване на функцията isMoveValid().

дъска [ ред ] [ полк ] = currentPlayer ;

Това изявление поставя знака на играча върху дъската.

въглен победител = checkWinner ( дъска ) ;

ако ( победител != ' ' ) {

теглителна дъска ( дъска ) ;

cout << 'Играч' << победител << 'печели! ' ;

Тези твърдения проверяват за победител всеки път, когато играч маркира запис на дъската. Името на победителя ще бъде обявено, ако има победител, и програмата ще излезе от цикъла на играта.

ако ( isBoardFull ( дъска ) ) {

Това изявление проверява за равенство. Равенството възниква в случай, че дъската е пълна и няма победител. В този случай „Равенство е!“ се отпечатва на екрана.

currentPlayer = ( currentPlayer == 'Х' ) ? 'О' : 'Х' ;

Това изявление превключва играчите, за да даде на всеки играч шанс да изиграе своя ред.

cout << „Невалиден ход. Изберете друга клетка. ' ;

Ако преместването не е валидно, потребителят получава подкана да въведе отново и да избере друга клетка.

След „основната“ функция ще започнат дефинициите на функциите за прототипите на функции, които са декларирани преди това. Първата функция, която е дефинирана тук, е drawBoard(), която се използва за изчертаване на дъската с тик-так-пръст към конзолата. Функцията drawBoard() отпечатва текущото състояние на дъската, включително линиите на мрежата.

Следващата функция, която е дефинирана тук, е isMoveValid(). Тази функция се използва, за да се определи дали е разрешен ход както вътре в дъската, така и върху празна клетка. Функцията isBoardFull() се използва за проверка дали дъската все още е пълна. Това е условие за равенство, когато няма победител. IsBoardFull() проверява дали всички позиции на дъската са запълнени, което показва равенство, ако няма победител. Ако има победител, той може да бъде установен с помощта на функцията checkWinner(). CheckWinner() проверява всички потенциални печеливши линии за една и съща марка на играча („X“ или „O“) и връща марката на печелившия играч, ако бъде намерена, или символ за интервал „ “, ако все още няма победител. Следва изходът на програмата. Показва всеки ход от всеки играч.

Първо, дъската е ясна; играчът “X” е подканен да избере клетката, която да маркира. Тук играчът „X“ въвежда 2 и 2. Клетките на ред 2 и колона 2 са маркирани. Обърнете се към маркираната дъска в следното:

Сега е ред на играча O. Играчът е подканен да избере клетка, която да маркира. Играч “O” избира 1 за реда и 1 за колоната. Избраната клетка е маркирана за играч „O“, както е показано в следния изходен фрагмент:

Всички ходове за всеки играч ще следват същия модел. Ред е на играча X и играчът избира 1 за реда и 2 за колоната. Обърнете се към следните дадени изходни моментни снимки:

Сега редът е за играч „О“. Играчът избира 1 за реда и 3 за колоната.

Следващият ход отново е на играч „X“. Играчът избира 3 за реда и 1 за колоната.

Играч “O” избира 3 за реда и 2 за колоната.

Играчът “X” избира втория ред и третата колона.

Играч “O” сега избира втория ред и първата колона.

Този път играчът “X” избира третия ред и третата колона.

Никой играч не може да направи нито една линия хоризонтално, вертикално или диагонално, така че това е равенство. Няма победител за избрания масив от входове.

Като цяло, кодът включва основен цикъл на играта, който е отговорен за обработката на състоянието на играта и потребителския вход, заедно с няколко помощни функции, които се използват за изчертаване на дъската, валидиране на ходовете, проверка за пълна дъска и определяне дали има победител .

Заключение

Разработването на тик-так игра с помощта на C++ е отлично практическо упражнение за затвърждаване на вашите умения по програмиране. Статията точно обяснява как да създадете tic-tac-toe в C++. Насоките стъпка по стъпка, предоставени в тази статия, обхващат 2D масив, функции и условия if-else, за да могат читателите да разберат механиката на играта, взаимодействията с потребителите и ефективното структуриране на кода. Подробното разглеждане на кода и обяснението на функциите, които са от решаващо значение за основния геймплей, предоставят на читателите безценна информация както за практиките за програмиране на C++, така и за тънкостите на простата разработка на игри.