- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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() 函数和两个 Piece 对象(blackPieces 和 whitePieces)之前,我的程序会运行,并且会显示一个漂亮的“棋盘”,它基本上是使用 allegro 的原始库绘制的 64 个正方形,所以我认为我已经正确安装了库和驱动程序。然而,我得到的错误超出了我的范围:
首先,setupBoard是一个void,只是为了修改其他变量来组织代码。然而 Intellisense 给我一个错误:this declaration has no storage class or type specifier
#include "Piece.h"
没有出现错误,但是在数组 blackPieces 和 whitePieces 的声明中,我得到了 identifier "Piece"is未定义
在 Chess.cpp 底部的 setupBoard 函数中,我通读了来自棋盘的字符数组 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 的逻辑与语言知识没有任何关系)。拜托,如果有人知道如何解决这些错误,我将非常感激!!
最佳答案
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
调用。
关于c++ - Visual C++ 和 Allegro5 : cannot recognize objects from abstract class from header file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156491/
我在 Python(3.5 版)中尝试使用语音识别模块,但遇到了以下错误: 'AttributeError: 'Recognizer' object has no attribute 'recogni
我正在尝试编译 C++ 程序,但遇到一些问题。特别是,当我使用 x86_64-w64-mingw32-gcc 作为编译器时,它在编译过程中提示“tmp/src/libfastms/solver/sol
我正在尝试安装 R 的 plyr 包。这是错误消息: * installing *source* package ‘plyr’ ... ** package ‘plyr’ successfully u
我第一次尝试使用多个文件构建程序。只用 main.cpp 编译程序我从来没有遇到过任何问题。使用以下命令,结果如下: $ g++ -c src/CNumber.cpp src/CNumber.h -o
我正在努力通过 The Little Book About OS Development ,特别是关于帧缓冲区的部分(链接)。我能够成功地汇编、链接、转换成 ISO 文件并启动纯程序集,但是一旦我尝试
我有一个关于 Swift 中 UIPanGestureRecognizer 的奇怪案例。我有一个处理平移手势的函数,并在 UIGestureRecognizerDelegate 中指定“false”,
抱歉,标题太长了。 我正在尝试将我们的功能测试代码与我们的集成测试代码隔离开来,并使用 gradle 任务让它工作。它也有 95% 在 intellij 中工作,除了每次我做一个“gradle ide
我想编写一个软件,当 USB 拇指驱动器连接到 USB 端口时,它会自动将一些文件复制到 USB 拇指驱动器上。为此我想知道: 我如何编写一个 c++ 应用程序,在 USB 拇指驱动器连接时收到通知?
我现在正在使用 BACKTRACK 5,它几乎像 ubuntu,一个 debian 和它的 32 位,我安装了 nasm,我去看了 dr. paulcarter 的汇编语言教程并下载了他的示例程序 (
我正在尝试编译一个包含以下行的 makefile: gcc -I. -I/home/usr/Documents/MTV/include -ggdb3 -Wall -O2 -o ascii2bin.c
我去了Chocolatey website并复制安装文本并粘贴到管理员 cmd.exe(使用 Windows 7)。当我运行命令时,我得到: 'powershell' is not recognize
我目前正在使用 Eventstore,但收到以下错误:Could not recognize BadRequest; 来自: game process tick failed UnknownError
我正在使用 jquery-1.11.1,并尝试使用 :data 选择器,如上所述 https://api.jqueryui.com/data-selector/ 尝试查找具有特定键的所有元素,如下所示
我有一个滚动功能,我需要执行它来滚动到其容器中的最后一条消息,该容器是带有 chunk_id 的容器。问题是它按原样进入容器,但如果我将最后一个子添加到混合中,该功能将不起作用。有什么想法我做错了吗?
我正在使用 sphinx4 暂停线程,直到说出特定的关键字。第一次效果很好,但第二次我需要暂停线程, recognizer.recognize() 似乎没有运行,应用程序只是开始发送垃圾邮件“开始说话
我正在尝试检查我的应用程序是否被授予访问用户提醒的权限,方法是: EKEventStore *store = [[EKEventStore alloc] init]; EKAuthorizationS
我有一个 foo 对象,如下所示: var foo = { "timer" : { "hours" : 0, "minutes" : 0,
我正在尝试运行位于此处的代码: http://r3dux.org/2010/11/single-call-opengl-texture-loader-in-devil/ 而且它需要我使用 DevIL,
我交叉编译了arm的内核源代码,带有调试信息和KGDB。 当我在主机中运行 gdb 时: $ arm-linux-gnueabihf-gdb vmlinux ... Reading symbols f
我使用 pip 将 virtualenv 安装到我的项目目录中。但是,当我在 Windows 终端中运行命令 virtualenv venv 时,它只是告诉我它无法识别。 我必须在 Python 中做
我是一名优秀的程序员,十分优秀!