0

私は allegro の初心者で、C++ の経験はあまりありませんが、言語の知識があるので、チェス ゲームをコーディングしたいと考えていました。しかし、このゲームで画像を使用したかったので、Allegro 5 を調べてプログラムしました。ゲーム内のすべてのチェスの駒を初期化するための (もちろん完全ではありませんが) ヘッダー ファイルを作成しました。

ピース.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)
        {

        }

};

その他はすべてメイン クラス Chess.cpp で処理されます。

#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() 関数と 2 つの Piece オブジェクト (blackPieces と whitePieces) を追加する前に、私のプログラムを実行すると、基本的に allegro のプリミティブ ライブラリを使用して描かれた 64 個の正方形である素敵な「チェス盤」が表示されます。ライブラリとドライバーを正しくインストールしました。それでも、私が得るエラーは私の手の届かないところにあります:

  1. まず、setupBoard は無効であり、他の変数を変更してコードを整理することを意図しています。それでもIntellisenseは私にエラーを与えます:this declaration has no storage class or type specifier

  2. でエラーは発生しませんが#include "Piece.h"、配列 blackPieces と whitePieces の宣言では、identifier "Piece" is undefined

  3. Chess.cpp の下部にある setupBoard 関数内で、チェスボードから取得した char 配列 cb を読み取ります。この配列には、ボードに駒を配置するための特定の文字が含まれています。そして、どのキャラクターに応じて、次のように、Piece オブジェクトがそれぞれの Piece 配列に動的に割り当てられます。

bp[barrindex] = new Piece(x, y, true, 'b', "images/br.png");

次に、ボードの x と y を制御する整数がそれに応じてインクリメントされ、異なる場所に描画されます。ただし、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 を作成するロジックは、言語の知識とは何の関係もないと考えています)。誰かがこれらのエラーを解決する方法を知っていれば、私はとても感謝しています!!

4

1 に答える 1

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");

2 つの違いを理解するには、スタックとヒープのメモリ割り当てについて調べてください。Piece* bp[MAXPIECES]おそらく、new呼び出しを介してヒープを使用したいと思うでしょう。

于 2013-04-23T13:09:54.993 に答える