动态数组使用相同的值来实现整体

dynamic array fulfills whole with the same values

本文关键字:实现 数组 动态      更新时间:2023-10-16

程序正在尝试检查国际象棋是否有效(很抱歉,注释是用波兰语写的,我希望代码即使不理解也很清楚)。对于典当来说,一切都是正常的,但对于塔来说,这是一个问题。我调试了程序,当我在行中停止它时

if(fRow < tRow)

数组的每个字段都具有与sTab[0][0]相同的值。。数值较高的几行是正常的
我试着用这个做了大约两个小时的事情,但没有任何帮助,也许你会发现问题所在

代码:

main.cpp:

#include "main.h"
using namespace std;
int main() {
    chess test;
    test.show();
    cout << test.ifMove("F1->B1");
    getch();
    return 0;
}

chess.cp:

#include "main.h"
using namespace std;
////// Konstruktor, konstruktor kopiujący oraz destruktor //////
chess::chess() : tab2D(8, 8, 'c') {
        init();
};
chess::chess(chess&c) {
};
chess::~chess() {
    for(int i=0;i<height;++i)
        delete [] sTab[i];
    delete [] sTab;
};
////// Metody //////
////// Uzupełnianie kolorów pól oraz rozstawianie figur i pionków //////
void chess::init() {
    /// kolory pól: 0 - biały, 1 - czarny ///
    int last = 0;
    for(int i = 0; i < this->height; ++i) {
        for(int j=0; j < this->width; ++j) {
            if(last == 0) {
                this->sTab[i][j] = "1";
                last = 1;
            }
            else if(last == 1) {
                this->sTab[i][j] = "0";
                last = 0;
            }
        }
        if(last == 0)
            last = 1;
        else if(last == 1)
            last = 0;
    };
    /// rozstawienie pionków ///
    for(int i = 0; i < this->width; ++i) {
        sTab[1][i] = sTab[1][i] + "wp";
        sTab[6][i] = sTab[6][i] + "bp";
    };
    /// rozstawienie koni ///
    sTab[0][2] = sTab[0][2] + "wh";
    sTab[0][5] = sTab[0][5] + "wh";
    sTab[7][2] = sTab[7][2] + "bh";
    sTab[7][5] = sTab[7][5] + "bh";
    /// rozstawienie gońców ///
    sTab[0][1] = sTab[0][1] + "wj";
    sTab[0][6] = sTab[0][6] + "wj";
    sTab[7][1] = sTab[7][1] + "bj";
    sTab[7][6] = sTab[7][6] + "bj";
    /// rozstawienie wież ///
    sTab[0][0] = sTab[0][0] + "wt";
    sTab[0][7] = sTab[0][7] + "wt";
    sTab[7][0] = sTab[7][0] + "bt";
    sTab[7][7] = sTab[7][7] + "bt";
    /// rozstawienie królowych ///
    sTab[0][4] = sTab[0][4] + "wq";
    sTab[7][3] = sTab[7][3] + "bq";
    /// rozstawienie królów ///
    sTab[0][3] = sTab[0][3] + "wk";
    sTab[7][4] = sTab[7][4] + "bk";
    /// dopełnienie pustych pól zerami i jedynkami ///
    for(int i = 0; i < this->height; ++i) {
        for(int j=0; j < this->width; ++j) {
            if(sTab[i][j] == "0")
                sTab[i][j] = "000";
            else if(sTab[i][j] == "1")
                sTab[i][j] = "111";
        }
    };
    sTab[5][0] = "0bt";
};
////// Wyświetlenie szachownicy //////
void chess::show() {
    for(int i = 0; i < (this->height + 1); ++i) { /// przechodzimy po 1 polu więcej, żeby dodać kolumnę i wiersz z oznaczeniem kolumn i wierszy
        for(int j=0; j < (this->width + 1); ++j) {
            if(i == 0 && j == 0)
                cout << "   ";
            else if (i != 0 && j == 0) { /// numeracja wierszy
                switch (i) {
                case 1:
                    cout << "A  ";
                    break;
                case 2:
                    cout << "B  ";
                    break;
                case 3:
                    cout << "C  ";
                    break;
                case 4:
                    cout << "D  ";
                    break;
                case 5:
                    cout << "E  ";
                    break;
                case 6:
                    cout << "F  ";
                    break;
                case 7:
                    cout << "G  ";
                    break;
                case 8:
                    cout << "H  ";
                    break;
                default:
                    break;
                }
            }
            else if (i == 0 && j != 0) { /// numeracja kolumn
                cout << j << "   "; 
            }
            else {
                cout << this->sTab[i-1][j-1] << " ";
            }
        }
        cout << endl << endl;
    };
};
////// Metoda sprawdzająca czy ruch jest możliwy do wykonania //////
////// return 0 - ruch niemożliwy, 1 - ruch możliwy na puste pole, 2 - ruch możliwy + bicie, 3 - pole z którego chcemy ruszyć jest puste //////
int chess::ifMove(string move) {
    /// f - from (pole z którego ruszamy), t - to (pole docelowe), Col - kolumna, Row - wiersz ///
    const char *fChar = &move[1];
    int fCol = atoi(fChar) - 1;
    const char *tChar = &move[5];
    int tCol = atoi(tChar) - 1;
    int fRow, tRow;
    switch (move[0]) {
    case 'A':
        fRow = 0;
        break;
    case 'B':
        fRow = 1;
        break;
    case 'C':
        fRow = 2;
        break;
    case 'D':
        fRow = 3;
        break;
    case 'E':
        fRow = 4;
        break;
    case 'F':
        fRow = 5;
        break;
    case 'G':
        fRow = 6;
        break;
    case 'H':
        fRow = 7;
        break;
    default:
        break;
    }
    switch (move[4]) {
    case 'A':
        tRow = 0;
        break;
    case 'B':
        tRow = 1;
        break;
    case 'C':
        tRow = 2;
        break;
    case 'D':
        tRow = 3;
        break;
    case 'E':
        tRow = 4;
        break;
    case 'F':
        tRow = 5;
        break;
    case 'G':
        tRow = 6;
        break;
    case 'H':
        tRow = 7;
        break;
    default:
        break;
    }
    /// Sprawdzenie jaką figurą próbujemy poruszyć i sprawdzenie warunków ///
    string fField =  this->sTab[fRow][fCol];
    char figure = fField[2];
    char color = fField[1];
    char fieldColor = fField[0];
    string tField = this->sTab[tRow][tCol];
    char hit = tField[2];
    switch(figure) {
    case 'p': // pionek
        if(fCol == tCol) {
            if(color == 'w') { /// pionek biały
                if(fRow == 1 && tRow == 3 && (this->sTab[3][tCol] == "000" || this->sTab[3][tCol] == "111")) {
                    if(hit == '0' || hit == '1')
                        return 1;
                    else
                        return 2;
                }
                if((tRow - fRow) == 1) {
                    if(hit == '0' || hit == '1')
                        return 1;
                    else
                        return 2;
                }
                else
                    return 0;
            }
            else if(color == 'b')  { /// pionek czarny
                if(fRow == 6 && tRow == 4 && (this->sTab[4][tCol] == "000" || this->sTab[4][tCol] == "111")) {
                    if(hit == '0' || hit == '1')
                        return 1;
                    else
                        return 2;
                }
                if((fRow - tRow) == 1) {
                    if(hit == '0' || hit == '1')
                        return 1;
                    else
                        return 2;
                }
                else
                    return 0;
            }
        }
        else
            return 0;
        break;
    case 't': // wieża
        if(fCol == tCol && fRow != tRow) {
            for(int i = 1; i < abs(tRow - fRow); ++i) {
                if(fRow < tRow)
                    if(this->sTab[fCol][fRow-i] != "000" && this->sTab[fCol][fRow-i] != "111")
                        return 0;
                if(fRow > tRow)
                    if(this->sTab[fCol][fRow+i] != "000" && this->sTab[fCol][fRow+i] != "111")
                        return 0;
            }
            if(hit == '0' || hit == '1')
                return 1;
            else
                return 2;
        }
        else if(fCol != tCol && fRow == tRow) {
            for(int i = 1; i < abs(tCol - fCol); ++i) {
                if(fCol < tCol)
                    if(sTab[fCol-1][fRow] != "000" && sTab[fCol-1][fRow] != "111")
                        return 0;
                if(fCol > tCol)
                    if(sTab[fCol+1][fRow] != "000" && sTab[fCol+1][fRow] != "111")
                        return 0;
            }
            if(hit == '0' || hit == '1')
                return 1;
            else
                return 2;
        }
        else
            return 0;
        break;
    default:
        return 3;
        break;
    }
    return 1;
};

EDIT我为那些想重现错误的人添加了其余的代码:
表.cpp:

#include "main.h"
using namespace std;

////// Konstruktor domyślny, konstruktor, konstruktor kopiujący oraz destruktor //////
tab2D::tab2D() {
};
tab2D::tab2D(int x, int y, char c) {
    this->width = x;
    this->height = y;
    if (c == 'm') {
        this->iTab = new int*[this->height];
        for(int i=0;i<this->height;++i)
               this->iTab[i] = new int[this->width];
    }
    else if (c == 'c') {
        this->sTab = new string*[this->height];
        for(int i=0;i<this->height;++i)
               this->sTab[i] = new string[this->width];
    }
    else {
    }
};
tab2D::tab2D(tab2D&t) {
      tab2D(t.width, t.height, 't');
};
tab2D::~tab2D() {
};

main.h:

#pragma once
#include <iostream>
#include <conio.h>
#include <string>
#include <cstdlib>
using namespace std;
enum Row;
class tab2D {
protected:
    int width;
    int height;
    string **sTab;
    int **iTab;
public:
    tab2D();
    tab2D(int x, int y, char c);
    ~tab2D();
    tab2D(tab2D&t);
};
class chess: public tab2D {
public:
    chess();
    ~chess();
    chess(chess&c);
    void init();
    int ifMove(string move);
    void show();
};
class matrix: public tab2D {
public:
    matrix(int x, int y);
    ~matrix();
    matrix(matrix&m);
};

您似乎混淆了。在您的一些代码中,数组sTab由[row][column]索引,但在代码的这一部分中,它是另一种方式:

if(fRow < tRow)
  if(this->sTab[fCol][fRow-i] != "000" && this->sTab[fCol][fRow-i] != "111")
    return 0;

程序告诉你,塔可能不会从A6移动到A2(通过所有这些人)。