在Battleship游戏c ++中返回私有函数指针

时间:2014-05-25 01:21:48

标签: c++ pointers vector private

周六快乐!

我正在尝试自学C ++所以我正在做一个战舰计划。

此版本相当标准。玩家输入一个单元格的坐标以试图击中一艘船。程序说明船是否被击中。如果船舶占用的所有单元都被击中,程序将打印一条消息,指出该船已沉没。每次尝试后,程序都会通过向董事会显示分别由"*""x"标记的所有成功尝试来打印当前状态。

所以我有一个类似于战舰的董事会

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

这是我的标题文件,用于上下文:

#ifndef BOARD_H
#define BOARD_H
#include "Ship.h"
#include <vector>
class Board
{
  public:
    Board(void);
    void addShip(char type, int x1, int y1, int x2, int y2);
    void print(void);
    void hit(char c, int i);
    int level(void);
  private:
    std::vector<Ship *> shipList;
    char score[10][10];
    Ship *shipAt(int x, int y);
};
#endif

以下是我目前为CPP所做的事情(对于长篇代码感到抱歉,但有必要为此问题提供背景信息:

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


//member function definitions


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

void Board::addShip(char type, int x1, int y1, int x2, int y2)
{
    if(shipList.size()<=9)
    {
        shipList.push_back(Ship::makeShip((char) type, (int) x1, (int) y1, (int) x2, (int) 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++) {
        cout<<" "<< i <<"|" ;
        for (int j = 0; j < 10; j++) {
           cout << score[i][j];
        }
            if(i == 0){
                cout << "                  |";

            }
            else{
                cout << "                   |";
                }
        cout<< endl;

    }
    cout <<"  +-------------------+"<< endl;




}

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

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


    if (c == 'a'){
        int a = 0;
    }
    if (c == 'b'){
        int b = 1;
    }
    if (c == 'c'){
        int c = 2;
    }
    if (c == 'd'){
        int d = 3;
    }
    if (c == 'e'){
        int e = 4;
    }
    if (c == 'f'){
        int f = 5;
    }
    if (c == 'g'){
        int g = 6;
    }
    if (c == 'h'){
        int h = 7;
    }
    if (c == 'i'){
        int i = 8;
    }
    if (c == 'j'){
        int j = 9;
    }







}

Ship *shipAt(int x, int y) 如果船舶占用单元格(x,y),则此函数返回指向该船舶的指针。否则返回空指针。  vector<Ship *> shipList是 存储指向船只指针的基本指针向量

void hit(char c, int i) 当玩家试图击中由char c和int i定义的单元格时,将调用此函数。 该功能必须确定船是否被击中并相应地更新船的水平和船板状态。它使用私有函数shipAt。

基本上我不知道如何使用私有成员函数void hit(char c, int i)实现Ship *shipAt(int x, int y)并满足这些要求。

1 个答案:

答案 0 :(得分:0)

您可以减去小写或大写的ASCII字母(即使在不使用ASCII的编译器上也能正常工作)。所以我想你只想要:

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

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

    Ship* ship = shipAt(i, c-'a');
    if (ship) {
        // ...
    }
    // ...

}