2014-10-03 4 views
1

В настоящее время я работаю над игрой tic tac toe. Мне нужно сделать плату Tic Tac Toe, которая обновляет (показывает «X» и «O».) Каждый раз, когда игрок или компьютер совершают движение. До сих пор мне удалось создать доску, но я не знаю, как эффективно превращать вход пользователя в «X». Первое, что я сделал, это спам:C++: как взять пользовательский ввод и поместить его в плату Tic Tac Toe

if(playerChoice == 1) 
block[0][0] = "X"; 
if(playerChoice == 2) 
block[0][1] = "X"; 
if(playerChoice == 3) 
block[0][2] = "X"; 
if(playerChoice == 4) 
block[1][0] = "X"; 
if(playerChoice == 5) 
block[1][1] = "X"; 
if(playerChoice == 6) 
block[1][2] = "X"; 
if(playerChoice == 7) 
block[2][0] = "X"; 
if(playerChoice == 8) 
block[2][1] = "X"; 
if(playerChoice == 9) 
block[2][2] = "X"; 

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

Вот полный код (Это не завершено и не может даже работать.):

#include <iostream> 
#include <ctime> 
#include <cstdio> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
//random starting turn chooser 
int turnFirst; //variable to decide whoever goes first 
int computerRandomPick; //variable to decide which grid the computer will place "O" 
srand(time(0)); 
turnFirst = rand()% (2 - 1 + 1)+1;//generates starting person. 
computerRandomPick = rand()% (9 - 1 + 1)+1;//computer first random pick 

//board arrays 
string block[3][3]; 
block [0][0] = {" "}; 
block [0][1] = {" "}; 
block [0][2] = {" "}; 
block [1][0] = {" "}; 
block [1][1] = {" "}; 
block [1][2] = {" "}; 
block [2][0] = {" "}; 
block [2][1] = {" "}; 
block [2][2] = {" "}; 

//player interaction 
int playerChoice; 

//BEGIN OF PROGRAM 
cout << "Welcome to Tic Tac Toe!" <<endl<< endl; 


    if(turnFirst == 1)//player first 
    { 
      cout << "Please choose a grid to place (X): "<<endl<<endl; 
         cout << "  1 | 2 | 3"<< endl; 
         cout << "  -----+-----+-----" << endl; 
         cout << "  4 | 5 | 6" << endl; 
         cout << "  -----+-----+-----" << endl; 
         cout << "  7 | 8 | 9" << endl; 
         cout << "  -----+-----+-----" << endl<<endl; 
         cin >> playerChoice; 
         system("CLS"); 
    } 
       if(playerChoice == 1) 
        block[0][0] = "X"; 
       if(playerChoice == 2) 
        block[0][1] = "X"; 
       if(playerChoice == 3) 
        block[0][2] = "X"; 
       if(playerChoice == 4) 
        block[1][0] = "X"; 
       if(playerChoice == 5) 
        block[1][1] = "X"; 
       if(playerChoice == 6) 
        block[1][2] = "X"; 
       if(playerChoice == 7) 
        block[2][0] = "X"; 
       if(playerChoice == 8) 
        block[2][1] = "X"; 
       if(playerChoice == 9) 
        block[2][2] = "X"; 



    if(turnFirst == 2)//computer first 
    { 
      system("CLS"); 
      cout << "The computer picked: " <<endl<<endl; 
    } 
         if(computerRandomPick == 1) 
      block[0][0] = "O"; 
      if(computerRandomPick == 2) 
      block[0][1] = "O"; 
      if(computerRandomPick == 3) 
      block[0][2] = "O"; 
      if(computerRandomPick == 4) 
      block[1][0] = "O"; 
      if(computerRandomPick == 5) 
      block[1][1] = "O"; 
      if(computerRandomPick == 6) 
      block[1][2] = "O"; 
      if(computerRandomPick == 7) 
      block[2][0] = "O"; 
      if(computerRandomPick == 8) 
      block[2][1] = "O"; 
      if(computerRandomPick == 9) 
      block[2][2] = "O"; 



//Game Board. 


         cout << "  " << block[0][0] << " | " << block [0][1] << " | " << block [0][2] << endl; 
         cout << "  -----+-----+-----" << endl; 
         cout << "  " << block [1][0] << " | " << block [1][1] << " | " << block [1][2] << endl; 
         cout << "  -----+-----+-----" << endl; 
         cout << "  " << block [2][0] << " | " << block [2][1] << " | " << block [2][2] << endl; 
         cout << "  -----+-----+-----" << endl; 
    return 0; 
} 
+1

Если ваш код работает, и вы просто хотите знать, как вы можете улучшить его, рассмотреть вопрос о принятии его [codereview.stackexchange.com] (Http: //codereview.stackexchange. ком). Есть миллион способов улучшить это; и нет недостатка в примерах Tic-Tac-Toe на C и C++, чтобы учиться там. Но самое главное, вам нужно подумать об удалении повторения; зачем писать один и тот же код для размещения x и O, заданного числом два раза, когда вы можете сделать метод или функцию, которые вы передаете, и «X» или «O» в качестве параметра? Начинает резать вещи пополам прямо там ... – HostileFork

+0

Используйте больше функций. Общее правило состоит в том, что если у вас есть функция более 25 строк, вы, вероятно, делаете что-то неправильно. (Это не жесткое правило, но у вас должно быть очень сильное оправдание для любой функции дольше) – o11c

+0

Обратите внимание, что есть много вопросов с тегами [tag: tic-tac-toe] здесь, чтобы просмотреть, если вы хотите получить идеи (а теперь ваш - один из них). – HostileFork

ответ

4

Предположив блока [3] [3] объявлен как:

char block[3][3]; 

playerChoice может быть 1-9. Таким образом, вы можете оптимизировать как:

playerChoice --; // to make it 0-8 
block[playerChoice/3][playerChoice %3] = 'X'; // instead of "X" 
+0

Спасибо за помощь! – Shico75

+0

@ Shico75 ценят, если вы принимаете ans, pls делают так –

+0

Несомненно! - просто хотел сообщить вам, что вы забыли «)» после «игрока», который может смутить людей, читающих в будущем. – Shico75

0

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

Если playerChoice находится между 1 и 3, первый индекс равен 0. Если он находится между 4 и 6, индекс равен 1, а если он находится между 7 и 9, индекс равен 2. Это подразделяет входы на 3 группы 3. Фактически индекс равен (playerChoice - 1)/3 с целым делением.

Второй индекс повторяется каждые 3 варианта. Это означает, что использование модуля может помочь здесь. Фактически, индекс равен (playerChoice - 1) % 3.

Вы можете уменьшить весь код

block[(playerChoice-1)/3][(playerChoice-1)%3] = "X"; 

или некоторые вариации.