周六快乐!
我正在尝试自学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)
并满足这些要求。
答案 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) {
// ...
}
// ...
}