0

Я новичок в аллегро и не очень хорошо приправлен 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 нарисованных квадратики, используя аллегро примитив библиотеки, поэтому я думаю, что я установил библиотеки и драйверов правильно. Тем не менее, ошибки я получаю вне моей досягаемости:

  1. Во-первых, setupBoard пустота, просто имел в виду, чтобы изменить другие переменные, чтобы организовать код. Тем не менее, Intellisense дает мне ошибку: this declaration has no storage class or type specifier

  2. Я не получаю сообщение об ошибке с #include "Piece.h", но при объявлении массивов BLACKPIECES и WHITEPIECES, я получаю identifier "Piece" is undefined

  3. Внутри функции 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 не будет иметь никакого отношения к знанию языка). Пожалуйста, если кто-нибудь знает, как решить эти ошибки, я был бы очень благодарен !!

ответ

1
setupBoard(Piece [MAXPIECES], Piece [MAXPIECES], char [MAXSPACES]); 

Перед этим стоит void.

Это разные вещи:

Piece bp[MAXPIECES] 
Piece* bp[MAXPIECES] 

, как вы есть, что вам нужно сделать это:

wp[warrindex] = Piece(x, y, true, 'w', "images/wn.png"); 

Чтобы понять разницу между ними, читать на стек против кучи выделение памяти. Вероятно, вы захотите использовать кучу через Piece* bp[MAXPIECES] и сохранить свои звонки new.

+0

Спасибо! Это работает.Я изменил переменные массивы 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

+0

Но поскольку у меня возникли проблемы с написанием 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

+0

У меня не было ошибок с кодом, но когда я запустил его, я получаю следующее: ' Chess.obj: ошибка LNK2019: неразрешенный внешний символ "void __cdecl setupBoard (класс Piece * const, класс Piece * const, char * const) "(? setupBoard @@ YAXQAVPiece @@ 0QAD @ Z), на который ссылается функция _main' Как вы думаете, может быть ошибка? – gfcf14

 Смежные вопросы

  • Нет связанных вопросов^_^