gpt4 book ai didi

c++ FLTK(具有相同回调函数的更多按钮)

转载 作者:行者123 更新时间:2023-11-28 06:18:22 27 4
gpt4 key购买 nike

我刚刚加入了这个令人惊叹的社区,以获得一个非常烦人的问题的答案。我正在尝试使用 FLTK 创建一个五连胜游戏。目前我刚刚完成它的笨版本井字游戏。所以我的问题是:我用许多按钮创建了一个板。对于井字游戏,棋盘只有 9 个按钮。但是连续五个按钮是 15*15,所以它是 225 个按钮。当我必须定义所有回调函数时,真正的问题就开始了。那么有没有办法让所有这些都只有一个回调函数呢?我可以为按钮分配一个值,以便回调函数在调用回调时知道按下了哪个按钮吗?非常感谢所有阅读它的人:)

编辑

所以我尝试更进一步,将所有指向按钮的指针保存在一个 vector 中。

vector <Fl_Button *> pointerVec;


/////////the button grid for the board ///////
int counter = 0;
int width = 50, height = 50;
int rowmax = 15, colmax = 15;

for (int rr = 0; rr < 3; ++rr) {
for (int cc = 0; cc < 3; ++cc) {


Fl_Button* bgrid = new Fl_Button(cc * width+80, rr * height+80, width - 5, width - 5);
int rowcol = counter;

pointerVec.push_back(bgrid); //save pointers to the buttons


bgrid->callback(_playerMove_cb, (void*) rowcol);

counter++;
}
}

////////

//then I tried to pass the vector to a callback function by reference

getAi->callback(getAI_cb, (void*)&pointerVec);


///////
static void getAI_cb(Fl_Widget *w, void *client) {

vector<Fl_Button*> &v = *reinterpret_cast<vector<Fl_Button*> *>(client);

// i wanted to do this //

v[1]->color(FL_RED);


}

所以,当我这样做时,程序崩溃了。我打印出 2 个 vector 的内存地址,它们在不同的地址上。我做错了什么吗?我想这样做的原因是我想给计算机玩家移动的按钮上色。

最佳答案

是这样的。您可以将任何内容作为参数传递。只要确保它不是 transient 的,否则当回调来获取它时,它最终可能会遍历整个堆栈或堆。

#include <stdlib.h>
#include <stdio.h>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <sstream>
#include <iostream>
#include <string>
#include <list>

void ButtonCB(Fl_Widget* w, void* client)
{
int rowcol = (int)client;
int row = rowcol >> 8;
int col = rowcol & 255;
std::cout << "row " << row << " col " << col << std::endl;
}
void CloseCB(Fl_Widget* w, void* client)
{
std::cout << "The end" << std::endl;
exit (0);

}

int main(int argc, char ** argv)
{
int width = 60, height = 25;
int rowmax = 5, colmax = 5;
std::list<std::string> tags;

Fl_Window *window = new Fl_Window(colmax * width + 20, rowmax * height + 20);

for (int rr = 0; rr < rowmax; ++rr)
{
for (int cc = 0; cc < colmax; ++cc)
{
std::ostringstream lab;
lab << "R" << rr << "C" << cc;
// Need to keep the strings otherwise we get blank labels
tags.push_back(lab.str());
Fl_Button* b = new Fl_Button(cc * width + 10, rr * height + 10, width - 5, height - 5, tags.back().c_str());
int rowcol = rr << 8 | cc;
b->callback(ButtonCB, (void*) rowcol);
}
}
window->end();
window->callback(CloseCB, 0);
window->show(argc,argv);
return Fl::run();
}

关于c++ FLTK(具有相同回调函数的更多按钮),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29799337/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com