C++ C++;生成器-在棋盘上移动一个棋子将移动下一个棋子
我有个问题。我有一盘国际象棋,我想让我的棋子在棋盘上随机移动。我不知道为什么,但当我移动一块时,下一块会移动,所以我写了移动(第一块)。在这种情况下,只有第一块不能移动。如何解决这个问题 formaJoc.cppC++ C++;生成器-在棋盘上移动一个棋子将移动下一个棋子,c++,c++builder,chess,C++,C++builder,Chess,我有个问题。我有一盘国际象棋,我想让我的棋子在棋盘上随机移动。我不知道为什么,但当我移动一块时,下一块会移动,所以我写了移动(第一块)。在这种情况下,只有第一块不能移动。如何解决这个问题 formaJoc.cpp //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "formaJoc.h" //
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "formaJoc.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define MAX_FIGURI 20
TfJoc *fJoc;
Test fnc;
Piece *pc[MAX_FIGURI];
//---------------------------------------------------------------------------
__fastcall TfJoc::TfJoc(TComponent* Owner)
: TForm(Owner)
{
blBoard[0] = new Board (0, 0, fJoc);
BlackRook1[0] = new bkRook1 ( 40, 40, fJoc);
BlackRook1[0] -> LoadImg();
BlackRook2[0] = new bkRook2 (292, 40, fJoc);
BlackRook2[0] -> LoadImg();
BlackKnight1[0] = new bkKnight1( 76, 40, fJoc);
BlackKnight1[0] -> LoadImg();
BlackKnight2[0] = new bkKnight2(256, 40, fJoc);
BlackKnight2[0] -> LoadImg();
BlackBishop1[0] = new bkBishop1(112, 40, fJoc);
BlackBishop1[0] -> LoadImg();
BlackBishop2[0] = new bkBishop2(220, 40, fJoc);
BlackBishop2[0] -> LoadImg();
BlackQueen[0] = new bkQueen (148, 40, fJoc);
BlackQueen[0] -> LoadImg();
BlackKing [0] = new bkKing (184, 40, fJoc);
BlackKing [0] -> LoadImg();
BlackPawns[0] = new bkPawn ( 40, 76, fJoc);
BlackPawns[0] -> LoadImg();
BlackPawns[1] = new bkPawn ( 76, 76, fJoc);
BlackPawns[1] -> LoadImg();
BlackPawns[2] = new bkPawn (112, 76, fJoc);
BlackPawns[2] -> LoadImg();
BlackPawns[3] = new bkPawn (148, 76, fJoc);
BlackPawns[3] -> LoadImg();
BlackPawns[4] = new bkPawn (184, 76, fJoc);
BlackPawns[4] -> LoadImg();
BlackPawns[5] = new bkPawn (220, 76, fJoc);
BlackPawns[5] -> LoadImg();
BlackPawns[6] = new bkPawn (256, 76, fJoc);
BlackPawns[6] -> LoadImg();
BlackPawns[7] = new bkPawn (292, 76, fJoc);
BlackPawns[7] -> LoadImg();
WhiteRooks[0] = new whRook ( 40, 292, fJoc);
WhiteRooks[0] -> LoadImg();
WhiteRooks[1] = new whRook (292, 292, fJoc);
WhiteRooks[1] -> LoadImg();
WhiteKnights[0] = new whKnight( 76, 292, fJoc);
WhiteKnights[0] -> LoadImg();
WhiteKnights[1] = new whKnight(256, 292, fJoc);
WhiteKnights[1] -> LoadImg();
WhiteBishops[0] = new whBishop(112, 292, fJoc);
WhiteBishops[0] -> LoadImg();
WhiteBishops[1] = new whBishop(220, 292, fJoc);
WhiteBishops[1] -> LoadImg();
WhiteQueen[0] = new whQueen (148, 292, fJoc);
WhiteQueen[0] -> LoadImg();
WhiteKing [0] = new whKing (184, 292, fJoc);
WhiteKing [0] -> LoadImg();
WhitePawns[0] = new whPawn ( 40, 256, fJoc);
WhitePawns[0] -> LoadImg();
WhitePawns[1] = new whPawn ( 76, 256, fJoc);
WhitePawns[1] -> LoadImg();
WhitePawns[2] = new whPawn (112, 256, fJoc);
WhitePawns[2] -> LoadImg();
WhitePawns[3] = new whPawn (148, 256, fJoc);
WhitePawns[3] -> LoadImg();
WhitePawns[4] = new whPawn (184, 256, fJoc);
WhitePawns[4] -> LoadImg();
WhitePawns[5] = new whPawn (220, 256, fJoc);
WhitePawns[5] -> LoadImg();
WhitePawns[6] = new whPawn (256, 256, fJoc);
WhitePawns[6] -> LoadImg();
WhitePawns[7] = new whPawn (292, 256, fJoc);
WhitePawns[7] -> LoadImg();
}
int id, row, col;
int &porecla=id;
int rowColToPixel[10] = {40, 76, 112, 148, 184, 220, 256, 292, 0, 331};
//---------------------------------------------------------------------------
void movePiece(int piece, int col, int row)
{
int left = rowColToPixel[col];
int top = rowColToPixel[row];
switch (piece)
{
case(1): {fJoc->BlackRook1[1]->imPiece->Left=left;fJoc->BlackRook1[1]->imPiece->Top=top;break;}
case(2): {fJoc->BlackKnight1[1]->imPiece->Left=left;fJoc->BlackKnight1[1]->imPiece->Top=top;break;}
case(3): {fJoc->BlackBishop1[1]->imPiece->Left=left;fJoc->BlackBishop1[1]->imPiece->Top=top;break;}
case(4): {fJoc->BlackQueen[1]->imPiece->Left=left;fJoc->BlackQueen[1]->imPiece->Top=top;break;}
case(5): {fJoc->BlackKing[1]->imPiece->Left=left;fJoc->BlackKing[1]->imPiece->Top=top;break;}
case(6): {fJoc->BlackBishop2[1]->imPiece->Left=left;fJoc->BlackBishop2[1]->imPiece->Top=top;break;}
case(7): {fJoc->BlackKnight2[1]->imPiece->Left=left;fJoc->BlackKnight2[1]->imPiece->Top=top;break;}
case(8): {fJoc->BlackRook2[1]->imPiece->Left=left;fJoc->BlackRook2[1]->imPiece->Top=top;break;}
case(9): {fJoc->BlackPawns[8]->imPiece->Left=left;fJoc->BlackPawns[8]->imPiece->Top=top;break;}
}
}
//---------------------------------------------------------------------------
void __fastcall TfJoc::btnStartClick(TObject *Sender)
{
exit(0);
}
//---------------------------------------------------------------------------
void __fastcall TfJoc::btnExitClick(TObject *Sender)
{
exit(0);
}
//---------------------------------------------------------------------------
void __fastcall TfJoc::Image1Click(TObject *Sender)
{
void LoadImg();
}
//---------------------------------------------------------------------------
void __fastcall TfJoc::Button1Click(TObject *Sender)
{
fnc.Test123("Muie!");
}
//---------------------------------------------------------------------------
void __fastcall TfJoc::bkRook1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 1;}
void __fastcall TfJoc::bkKnight1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 2;}
void __fastcall TfJoc::bkBishop1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 3;}
void __fastcall TfJoc::bkQueenMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 4;}
void __fastcall TfJoc::bkKingMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 5;}
void __fastcall TfJoc::bkBishop2MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 6;}
void __fastcall TfJoc::bkKnight2MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 7;}
void __fastcall TfJoc::bkRook2MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 8;}
void __fastcall TfJoc::bkPawnMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 9;}
void __fastcall TfJoc::whRookMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 10;}
void __fastcall TfJoc::whKnightMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 11;}
void __fastcall TfJoc::whBishopMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 12;}
void __fastcall TfJoc::whQueenMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 13;}
void __fastcall TfJoc::whKingMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 14;}
void __fastcall TfJoc::whPawnMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {id = 15;}
void __fastcall TfJoc::imBoardMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (id != 99) {
col = (X - 40) / 36;
row = (Y - 40) / 36;
movePiece(::id-1, col, row);
id=99;
//ShowMessage(id);
}
}
您移动了
fJoc->BlackRook1[1]
,但该值超出了数组BlackRook1
的有效范围
线路
bkRook1* BlackRook1[1];
仅定义一个元素,即BlackRook1[0]
“下一步行动”的原因纯属偶然。处理超出其边界的数组对象是一种未定义的行为,实际上任何事情都可能发生,包括“似乎正常工作”,或者,在您的案例中,“似乎正常工作,除了这件小事”
我想它在您的案例中正好起作用,因为所有的对象初始化都是一个接一个的,所以“beyond”很高兴地指向下一个创建的对象。(除了最后一个,也就是说。请随意试验。)那么我应该如何使它们正确移动呢?我解决了这个问题。谢谢我将BlackRook1[1]更改为BlackRook1[0]。您可能想去某个论坛讨论您的代码。还有很大的改进空间。如果您有一大块代码,其中的代码行看起来非常相似,那么在大多数情况下,有一种更好的方法可以做到这一点。我可以问一下,为什么每个不同的作品都有自己的类别,而不是所有作品都有一个通用的类别?当你可以使用网格坐标时,为什么要使用像素坐标?
bkBishop1::bkBishop1(unsigned int a, unsigned int b, TfJoc* fJoc):Piece(a, b, fJoc)
{
nBishop1 = "Imagini/Nebun1.bmp";
imPiece -> Left = a;
imPiece -> Top = b;
imPiece -> OnMouseDown = fJoc -> bkBishop1MouseDown;
}
void bkBishop1::LoadImg()
{
imPiece->Picture->LoadFromFile(nBishop1);
}
bkBishop2::bkBishop2(unsigned int a, unsigned int b, TfJoc* fJoc):Piece(a, b, fJoc)
{
nBishop2 = "Imagini/Nebun1.bmp";
imPiece -> Left = a;
imPiece -> Top = b;
imPiece -> OnMouseDown = fJoc -> bkBishop2MouseDown;
}
void bkBishop2::LoadImg()
{
imPiece->Picture->LoadFromFile(nBishop2);
}
bkRook1* BlackRook1[1];