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

时间:2014-05-27 08:55:50

标签: c++ arrays

我正在尝试自学C ++所以我正在做一个战舰计划。我有一个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用空格初始化我的得分数组。

char score[10][10] 

是存储板的每个单元的当前状态的char数组,其中char' x'和' *'分别代表不成功和成功的尝试,并且' ' (空间)未被击中的细胞。

这是我的董事会成员:

#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|                   |
  +-------------------+

1 个答案:

答案 0 :(得分:2)

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

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

这样就不会初始化成员。

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

我测试了print()方法,看起来没问题。无法看出为什么输出长度会增加的原因。