Я новичок в аллегро и не очень хорошо приправлен C++, но у меня есть знание языка, поэтому я хотел закодировать шахматную игру. Но поскольку я хотел использовать изображения в этой игре, я заглянул в Allegro 5, чтобы запрограммировать его. Я придумал (не полный конечно) заголовочный файл для инициализации каждой шахматной фигуры в игре:Visual C++ и Allegro5: не могут распознавать объекты из абстрактного класса из заголовочного файла
Piece.h
#pragma once
#include <allegro5/allegro.h>
#include <allegro5/allegro_native_dialog.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_image.h>
#include <iostream>
#include <string>
using namespace std;
class Piece
{
private:
int pieceX;
int pieceY;
bool inGame;
char pieceColor;
string imgAddress;
ALLEGRO_BITMAP *pieceImage;
public:
Piece(int pieceX, int pieceY, bool inGame, char pieceColor, string imgAddress)
{
this->pieceX = pieceX;
this->pieceY = pieceY;
this->inGame = inGame;
this->pieceColor = pieceColor;
this->imgAddress = imgAddress;
pieceImage = al_load_bitmap(imgAddress.c_str());
}
int getPieceX()
{
return pieceX;
}
int getPieceY()
{
return pieceY;
}
bool isInGame()
{
return inGame;
}
char getPieceColor()
{
return pieceColor;
}
string getImageAddress()
{
return imgAddress;
}
void setPieceX(int newx)
{
pieceX = newx;
}
void setPieceY(int newy)
{
pieceY = newy;
}
void setinGame(bool newingame)
{
inGame = newingame;
}
void setImageAddress(string newimgaddr)
{
imgAddress = newimgaddr;
}
void reloadImage()
{
pieceImage = al_load_bitmap(imgAddress.c_str());
}
Piece(void)
{
}
~Piece(void)
{
}
};
и все остальное будет обработан в главном классе, шахматы. каст
#include <allegro5/allegro.h>
#include <allegro5/allegro_native_dialog.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_image.h>
#include "Piece.h"
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
const int SIDELENGTH = 50;
const int ROWCOLSPAN = 8;
const int WINDOW_WIDTH = (SIDELENGTH * ROWCOLSPAN) + 240;
const int WINDOW_HEIGHT = (SIDELENGTH * ROWCOLSPAN) + 40;
const float FPS = 60;
const int MAXPIECES = ROWCOLSPAN * 2;
const int MAXSPACES = ROWCOLSPAN * ROWCOLSPAN;
setupBoard(Piece [MAXPIECES], Piece [MAXPIECES], char [MAXSPACES]);
int main()
{
ALLEGRO_DISPLAY *gameDisplay;
if (!al_init()) cout << "Failed to load Allegro 5 for Chess++..." << endl;
gameDisplay = al_create_display(WINDOW_WIDTH, WINDOW_HEIGHT);
al_set_window_title(gameDisplay, "Chess++");
if (!gameDisplay) cout << "Couldn't create Allegro 5 display for Chess++..." << endl;
al_init_primitives_addon(); //allows to load primitives
al_install_keyboard(); //allows for keyboard use*/
al_install_mouse(); //installs the mouse to be able to use it
al_init_image_addon(); //prepares image loading
ALLEGRO_EVENT_QUEUE *gameQueue = al_create_event_queue(); //queue that receives events and acts them in order
al_register_event_source(gameQueue, al_get_keyboard_event_source()); //registers keyboard events to be recognized within event_queue
ALLEGRO_KEYBOARD_STATE keyState;
ALLEGRO_TIMER *gameTimer = al_create_timer(1.0/FPS);
al_register_event_source(gameQueue, al_get_keyboard_event_source()); //registers keyboard events to be recognized within event_queue
al_register_event_source(gameQueue, al_get_timer_event_source(gameTimer)); //registers a timer to work within event_queue
al_register_event_source(gameQueue, al_get_display_event_source(gameDisplay)); //registers the window to be able to give it events
al_register_event_source(gameQueue, al_get_mouse_event_source()); //register the installed mouse
bool gameOver = false;
bool draw = false;
bool quitclose = false;
int X = 0;
int Y = 0;
Piece blackPieces[MAXPIECES];
Piece whitePieces[MAXPIECES];
//The 8 by 8 board with the pieces; lowercase for black, uppercase for white
char chessboard[] = "rnbqkbnr\n"
"pppppppp\n"
"--------\n"
"--------\n"
"--------\n"
"--------\n"
"--------\n"
"PPPPPPPP\n"
"RNBQKBNR";
//setupBoard(blackPieces, whitePieces, chessboard);
al_start_timer(gameTimer); //starts the specified timer
gameloop:
while(!gameOver)
{
ALLEGRO_EVENT gameEvents; //create receiver for events
al_wait_for_event(gameQueue, &gameEvents); //waits for an event from event_queue to be passed on to ALLEGRO_EVENT events
if (gameEvents.type == ALLEGRO_EVENT_KEY_UP/*DOWN*/)
{
}
else if (gameEvents.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
{
quitclose = true;
gameOver = true;
}
else if (gameEvents.type == ALLEGRO_EVENT_MOUSE_AXES) //determines the movement of the mouse coordinates
{
}
else if (gameEvents.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) //if a mouse button is pressed
{
}
if (gameEvents.type == ALLEGRO_EVENT_TIMER)
{
draw = true;
}
if (draw)
{
draw = false;
int squareX = 20;
int squareY = 20;
bool colorchange = true;
for (int i = 1; i <= MAXSPACES;i++)
{
ALLEGRO_COLOR squarecolor = al_map_rgb(255, 255, 255);
if (!colorchange) squarecolor = al_map_rgb(0, 100, 0);
al_draw_filled_rectangle(squareX, squareY, squareX + SIDELENGTH, squareY + SIDELENGTH, squarecolor);
squareX += SIDELENGTH;
if (i % ROWCOLSPAN != 0) colorchange = !colorchange;
if (i % ROWCOLSPAN == 0)
{
squareY += SIDELENGTH;
squareX = 20;
}
}
al_flip_display();
al_clear_to_color(al_map_rgb(0, 0, 0)); //clears the canvas (display) like Java's repaint()
}
}
if (quitclose)
{
int quit = al_show_native_message_box(gameDisplay, "CHES++: QUIT", "ARE YOU SURE YOU WANNA QUIT?", "Please select YES or NO", NULL, ALLEGRO_MESSAGEBOX_YES_NO);
if (quit == 0)
{
gameOver = false;
goto gameloop;
}
}
al_destroy_display(gameDisplay);
/*cin.sync();
cout << "\n\nPress any key to finish...";
cin.get();*/
return 0;
}
void setupBoard(Piece bp[MAXPIECES], Piece wp[MAXPIECES], char cb[])
{
int barrindex = 0;
int warrindex = 0;
int x = 20;
int y = 20;
for (int i = 0; i < MAXSPACES; i++)
{
if (cb[i] == 'r')
{
bp[barrindex] = new Piece(x, y, true, 'b', "images/br.png");
barrindex++;
x += SIDELENGTH;
}
if (cb[i] == 'n')
{
bp[barrindex] = new Piece(x, y, true, 'b', "images/bn.png");
barrindex++;
x += SIDELENGTH;
}
if (cb[i] == 'b')
{
bp[barrindex] = new Piece(x, y, true, 'b', "images/bb.png");
barrindex++;
x += SIDELENGTH;
}
if (cb[i] == 'q')
{
bp[barrindex] = new Piece(x, y, true, 'b', "images/bq.png");
barrindex++;
x += SIDELENGTH;
}
if (cb[i] == 'k')
{
bp[barrindex] = new Piece(x, y, true, 'b', "images/bk.png");
barrindex++;
x += SIDELENGTH;
}
if (cb[i] == 'p')
{
bp[barrindex] = new Piece(x, y, true, 'b', "images/bp.png");
barrindex++;
x += SIDELENGTH;
}
if (cb[i] == 'R')
{
wp[warrindex] = new Piece(x, y, true, 'w', "images/wr.png");
warrindex++;
x += SIDELENGTH;
}
if (cb[i] == 'N')
{
wp[warrindex] = new Piece(x, y, true, 'w', "images/wn.png");
warrindex++;
x += SIDELENGTH;
}
if (cb[i] == 'B')
{
wp[warrindex] = new Piece(x, y, true, 'w', "images/wb.png");
warrindex++;
x += SIDELENGTH;
}
if (cb[i] == 'Q')
{
wp[warrindex] = new Piece(x, y, true, 'w', "images/wq.png");
warrindex++;
x += SIDELENGTH;
}
if (cb[i] == 'K')
{
wp[warrindex] = new Piece(x, y, true, 'w', "images/wk.png");
warrindex++;
x += SIDELENGTH;
}
if (cb[i] == 'P')
{
wp[warrindex] = new Piece(x, y, true, 'w', "images/wp.png");
warrindex++;
x += SIDELENGTH;
}
if (cb[i] == '-')
{
x += SIDELENGTH;
}
if (cb[i] == '\n')
{
y += SIDELENGTH;
x = 20;
}
}
}
Перед добавлением функции setupBoard() и два объекта элемента (BLACKPIECES и WHITEPIECES), моя программа будет запускать, и он будет отображать хорошую «шахматную доску», которая в основном 64 нарисованных квадратики, используя аллегро примитив библиотеки, поэтому я думаю, что я установил библиотеки и драйверов правильно. Тем не менее, ошибки я получаю вне моей досягаемости:
Во-первых, setupBoard пустота, просто имел в виду, чтобы изменить другие переменные, чтобы организовать код. Тем не менее, Intellisense дает мне ошибку:
this declaration has no storage class or type specifier
Я не получаю сообщение об ошибке с
#include "Piece.h"
, но при объявлении массивов BLACKPIECES и WHITEPIECES, я получаюidentifier "Piece" is undefined
Внутри функции setupBoard в нижней части Chess.cpp, я читаю массив char cb, который исходит из шахматной доски, у которой есть определенные символы, чтобы поместить фигуры в доску. И в зависимости от того, какой символ, объект Кусок динамически распределяется соответствующей массива Кусок, например:.
bp[barrindex] = new Piece(x, y, true, 'b', "images/br.png");
Тогда целые числа, которые управляют х и у платы увеличиваются соответственно, чтобы привлечь их в разных местах. Однако, в то время, как представляется, не будет никакой ошибки для new Piece(
, что я думаю из-за ошибки 2, за исключением, я получаю эту ошибку:
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'Piece *' (or there is no acceptable conversion)
Я уверен, что я должен быть выделение неправильно, но я не знаю, как, у меня никогда не было таких ошибок. Теперь я всегда мог попробовать играть в шахматы на Java или C#, но я хотел сделать какую-то игру на C++ (я полагаю, что логика создания AI не будет иметь никакого отношения к знанию языка). Пожалуйста, если кто-нибудь знает, как решить эти ошибки, я был бы очень благодарен !!
Спасибо! Это работает.Я изменил переменные массивы Pieces, это нравится: 'Piece * blackPieces [MAXPIECES]; шт * WHITEPIECES [MAXPIECES]; ' и для того, чтобы работать, я изменил вызов функции,' setupBoard (* BLACKPIECES, * WHITEPIECES, шахматная доска), ' , что привело к изменению параметров:' недействительными setupBoard (шт * bp [MAXPIECES], Piece * wp [MAXPIECES], char cb []) ' и распределение объектов различно:' * bp [barrindex] = Piece (x, y, true, 'b', "images/br .png ");' – gfcf14
Но поскольку у меня возникли проблемы с написанием getter для возврата ALLEGRO_BITMAP (intellisense сказал, что функция возвращает неполный тип), я сделал еще два массива в файле Chess.cpp: 'ALLEGRO_BITMAP * whiteImages [MAXPIECES]; ALLEGRO_BITMAP * blackImages [MAXPIECES]; ' который будет загружен после того, как setupBoard(), как это: ' для (INT I = 0; г getImageAddress() c_str()). \t whiteImages [i] = al_load_bitmap (whitePieces [i] -> getImageAddress(). C_str()); } ' –
gfcf14
У меня не было ошибок с кодом, но когда я запустил его, я получаю следующее: ' Chess.obj: ошибка LNK2019: неразрешенный внешний символ "void __cdecl setupBoard (класс Piece * const, класс Piece * const, char * const) "(? setupBoard @@ YAXQAVPiece @@ 0QAD @ Z), на который ссылается функция _main' Как вы думаете, может быть ошибка? – gfcf14