gpt4 book ai didi

c++ - 在 BattleShip 游戏程序 C++ 中保持 BattleShip 命中和未命中

转载 作者:行者123 更新时间:2023-11-30 04:04:12 25 4
gpt4 key购买 nike

我正在尝试自学 C++,所以我正在做一个 Battleship 程序。我有一个 Ship、Board 和 BattleShip Driver 类。

这个版本相当标准。玩家输入一个单元格的坐标以尝试击中一艘船。说明船只是否被击中的程序。如果一艘船占据的所有单元格都被击中,程序会打印一条消息,说明该船已沉没。每次尝试后,程序通过在板上显示所有成功尝试并分别用“*”或“x”标记来打印当前状态。

我有一个战列舰的棋盘

   a b c d e f g h i j
+-------------------+
0| |
1| |
2| |
3| |
4| |
5| |
6| |
7| |
8| |
9| |
+-------------------+

所以我的 Board Constructor 用空格初始化了我的 scores 数组。

char score[10][10] 

是一个 char 数组,用于存储棋盘上每个单元格的当前状态,其中字符 'x' 和 '*' 分别代表不成功和成功的尝试,' '(空格)表示未命中的单元格。

这是我的董事会类(class):

#include "Board.h"
#include "Ship.h"
#include <iostream>
using namespace std;
#include <vector>
#include <string.h>
#include <stdexcept>


//member function definitions

Board::Board(void)

{
char score[10][10] = {' '};
for (int i = 0; i < 10; i ++) {
for (int j = 0; j < 10; j++) {
score[i][j] = ' ';
}
}

}

void Board::addShip(char type, int x1, int y1, int x2, int y2)
{
if(shipList.size()<10)
{
shipList.push_back(Ship::makeShip(type,x1,y1,x2,y2));
}
}

void Board::print(void){

cout<< " a b c d e f g h i j"<< endl;
cout <<" +-------------------+"<< endl;

for (int i = 0; i < 10; i++) {
// print the first character as part of the opener.
cout<< " " << i << "|" << score[i][0];
for (int j = 1; j < 10; j++) {
// only add spaces for subsequent characters.
cout << " " << score[i][j];
}
cout << " |" << endl;
}
cout <<" +-------------------+"<< endl;
}

void Board::hit(char c, int i){

if (c<'a' || c>'j' || i > 9 || i<0){
throw invalid_argument("invalid input");
}

Ship* ship = shipAt(i, c-'a');


if (ship) {
score[i][c-'a']= '*';
}
else{
score[i][c-'a']= 'x';

}

}

Ship* Board::shipAt(int x, int y)
{
for(Ship* ship : shipList){
if(ship->Ship::includes(x, y)){
return ship;
}
else{
return NULL;
}
}

}

int Board::level(void)
{
int lev = 0;
std::vector<Ship *>::iterator iter = shipList.begin();
std::vector<Ship *>::iterator end = shipList.end();
for ( ; iter != end; ++iter )
{
lev += (*iter)->level();
}

return lev;

}

不幸的是,无论我如何更改函数,我的输出都是错误的,我得到的输出如下所示:(如您所见,每次点击时右侧的垂直线都会向右推出。

   a b c d e f g h i j
+-------------------+
0|* |
1| |
2| |
3| x |
4| |
5| |
6| |
7| |
8| |
9| |
+-------------------+

我尝试重新实现我的 void Board::print(void)void Board::hit(char c, int i),然后重新实现我的 Board构造函数,但似乎没有任何工作错误继续存在。我的董事会一直被推到右边。我不确定如何解决这个问题。

理想情况下,我希望产生如下输出:

  a b c d e f g h i j
+-------------------+
0| |
1| |
2| |
3| |
4| |
5| |
6| |
7| |
8| x |
9| |
+-------------------+
a b c d e f g h i j
+-------------------+
0| |
1| |
2| |
3| |
4| |
5| |
6| |
7| |
8| x * |
9| |
+-------------------+

最佳答案

我猜分数是一个成员变量。但是在构造函数中,您通过使用相同名称声明一个局部变量来隐藏它:

Board::Board(void)
{
char score[10][10] = {' '};

这样成员就不会被初始化。

在 Board::print(void) 行
cout << " |" << endl;
应该是
cout << "|" << endl;

我测试了 print() 方法,看起来没问题。看不出输出长度会增加的任何原因。

关于c++ - 在 BattleShip 游戏程序 C++ 中保持 BattleShip 命中和未命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23885041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com