Как не показывать нулевой символ при вставке символа в 2d строку? - PullRequest
0 голосов
/ 12 октября 2018

Я делал довольно простую игру «Морской бой» для своего школьного проекта (Я ДОЛЖЕН использовать Turbo C ++) и столкнулся с проблемой.Я в основном использую 2D-строку 5х5 в качестве своей доски и скрываю в ней «корабль».То, что я пытаюсь сделать, это то, что всякий раз, когда пользователь делает неправильное предположение, я хочу заменить «O» на доске на «X», но когда я делаю это, «O» в следующем блоке заменяетсяна "/ 0" и показывает как пробел в выводе.Как мне это исправить?

Вот код:

#include<conio.h>
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<stdio.h>
//A function to initialize the board
void start_board(char a[5][5])
{
   for(int i=0;i<5;i++)
     {  for(int j=0;j<5;j++)
     {  strcpy(&a[i][j],"O");
     }
     }
}
//A function to display the board
void display_board(char a[5][5])
{  for(int i=0;i<5;i++)
     {  for(int j=0;j<5;j++)
     {  cout<<a[i][j]<<" ";
     }
     cout<<endl;
     }
}
class board
{   public:
     char board[5][5];
     void start()
     {  start_board(board);
     }
     void display()
     {  display_board(board);
     }
};
class ship
{   public:
    int ship_row, ship_col;
    ship()//CONSTRUCTOR FOR PUTTING COORDINATES OF SHIP
    {  randomize();
       ship_row= random(5);
       ship_col=random(5);
       cout<<ship_row<<endl<<ship_col;

    }
};
class guess: public board, public ship
{  public:
   int guess_row,guess_col;
   char vboard[5][5];
   guess()
   {  start_board(vboard);
   }
   void takeguess();

};
  void guess:: takeguess()
   { int count=0;
     while(count<3)
     {
   cout<<endl;
   cout<<"Guess a row ";
   cin>>guess_row;
   cout<<"Guess a column ";
   cin>>guess_col;
   if(guess_row==ship_row && guess_col==ship_col)
   {  cout<<"Congratulations! You sank the battleship!";
      break;
   }
   else if(guess_row>4 || guess_col>4)
   {  cout<<"invalid guess";
   }
   else
   {  clrscr();
      cout<<"Incorrect Guess!"<<endl;
      strcpy(&vboard[guess_row][guess_col],"X");
      display_board(vboard);
      count+=1;
   }
    if(count==3)
    {  cout<<"GAME OVER!";
    }
   }
   }
void main()
{  clrscr();
   board b;
   b.start();
   b.display();
   guess g;
   g.takeguess();
   getch();
}

Например, если пользователь угадает 0,2, а это не местоположение корабля, вывод будет отображаться:

OOX O
OOOOO
OOOOO
OOOOO
OOOOO

Извините за грязный код (он не полный) и любые ошибки, которые я допустил при написании этого поста, я впервые использую stackoverflow.Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 12 октября 2018

Не используйте strcpy !!Вы не копируете строку, вы устанавливаете значение одного символа в строке, поэтому используйте правильный инструмент для задания.

vboard[guess_row][guess_col] = 'X';

Это потому, что «X» - это фактически 2 символа'X' и '\ 0', поэтому ваши strcpy попадают в 2 ячейки в вашем массиве

...