diff --git a/lesson_gui_2.cpp b/lesson_gui_2.cpp index b8385ce..d0fe01c 100644 --- a/lesson_gui_2.cpp +++ b/lesson_gui_2.cpp @@ -13,20 +13,33 @@ Fl_Input* input_coins_box; std::string input_coins_box_value; std::string collection = "收藏:"; Fl_Button* btn_menu; +Fl_Button* sell_question; Fl_Button* add_coins; Fl_Button* btn; +Fl_Button* sell; Fl_Button* couka; Fl_Button* couone; Fl_Button* couten; Fl_Button* rarity; +Fl_Button* collection_box; int coins = 0; int a = std::rand() % 111; +void collection_callback(Fl_Widget * widget, void *data) { + result_box->label(collection.c_str()); + result_box->labelcolor(FL_BLACK); +} +void sell_callback(Fl_Widget * widget, void *data) { +} +void sell_question_callback(Fl_Widget * widget, void *data) { + result_box->label("售卖:请选择要售卖的卡牌,售卖后会获得金币。"); + result_box->labelcolor(FL_BLACK); +} void draw_callback(Fl_Widget * widget, void *data) { result_box->label("说明:这是一个抽卡游戏,你可以通过抽卡来获得各种等级的卡牌。\nR SR SSR UR TR USR,\n每抽一次花费10金币。若金币不够,可以去菜单增加金币,\n或者减少抽卡遍数。并且抽卡遍数最高10。请点击回菜单。"); result_box->labelcolor(FL_BLACK); } void rarity_callback(Fl_Widget * widget, void *data) { - result_box->label("稀有度分配:R 45.05% SR 27.03% SSR 18.02%\n UR 4.50% TR 3.60% USR 1.80%\n请按回菜单。"); + result_box->label("稀有度分配:R 45.05% SR 27.03% SSR 18.02%\n UR 9.01% TR 0.81% USR 0.09%\n请按回菜单。"); result_box->labelcolor(FL_BLACK); } void menu_callback(Fl_Widget * widget, void *data) { @@ -34,7 +47,7 @@ void menu_callback(Fl_Widget * widget, void *data) { result_box->label(""); int add = std::atoi(input_coins_box->value()); if(add > 9999) { - result_box->label("增加金币数量不能超过9999"); + result_box->label("增加金币数量不能超过9999,点击回菜单生效。"); add = 0; input_coins_box->value(""); input_coins_box->hide(); @@ -57,35 +70,36 @@ void couka_callback3(Fl_Widget * widget, void *data) { add_coins->show(); btn_menu->show(); btn->show(); + sell->show(); + collection_box->show(); + rarity->show(); return; } chou10_result = ""; for(int i = 0; i < 10; i++) { - int a = std::rand() % 111; - if(a < 50){ + int a = std::rand() %1110; + if(a < 500){ chou10_result += "R "; - std::string name = "R"; - int num = 1; - collection += name + " "; + collection += "R "; } - else if(a < 80) + else if(a < 800) { chou10_result += "SR "; collection += "SR "; } - else if(a < 100) + else if(a < 1000) { chou10_result += "SSR "; collection += "SSR "; } - else if(a < 105) + else if(a < 1100) { chou10_result += "UR "; collection += "UR "; } - else if(a < 109) + else if(a < 1109) { chou10_result += "TR "; collection += "TR "; @@ -107,7 +121,10 @@ void couka_callback3(Fl_Widget * widget, void *data) { add_coins->show(); btn_menu->show(); btn->show(); -} + sell->show(); + collection_box->show(); + rarity->show(); +} void couka_callback2(Fl_Widget * widget, void *data) { if(coins < 10) { @@ -118,16 +135,30 @@ void couka_callback2(Fl_Widget * widget, void *data) { add_coins->show(); btn_menu->show(); btn->show(); + collection_box->show(); + rarity->show(); + sell->show(); return; } int a = std::rand() % 111; if (a < 50) {result_box->label("你抽到了R卡牌金币减10"); + collection += "R "; } - else if (a < 80) result_box->label("你抽到了SR卡牌金币减10"); - else if (a < 100) result_box->label("你抽到了SSR卡牌金币减10"); - else if (a < 105) result_box->label("你抽到了UR卡牌金币减10"); - else if (a < 109) result_box->label("你抽到了TR卡牌金币减10"); - else result_box->label("你抽到了USR卡牌金币减10"); + else if (a < 80) {result_box->label("你抽到了SR卡牌金币减10"); + collection += "SR "; + } + else if (a < 100) {result_box->label("你抽到了SSR卡牌金币减10"); + collection += "SSR "; + } + else if (a < 105) {result_box->label("你抽到了UR卡牌金币减10"); + collection += "UR "; + } + else if (a < 109) {result_box->label("你抽到了TR卡牌金币减10"); + collection += "TR "; + } + else {result_box->label("你抽到了USR卡牌金币减10"); + collection += "USR "; + } result_box->labelcolor(FL_BLACK); coins -= 10; input_coins_box_value = ("金币:" + std::to_string(coins)); @@ -138,6 +169,9 @@ void couka_callback2(Fl_Widget * widget, void *data) { add_coins->show(); btn_menu->show(); btn->show(); + sell->show(); + collection_box->show(); + rarity->show(); } void couka_callback1(Fl_Widget * widget, void *data) { input_coins_box->hide(); @@ -148,6 +182,9 @@ void couka_callback1(Fl_Widget * widget, void *data) { couka->hide(); couone->show(); couten->show(); + sell->hide(); + collection_box->hide(); + rarity->hide(); } void add_coins_callback(Fl_Widget * widget, void *data) { result_box->label("请输入增加金币数量(最多9999)"); @@ -168,6 +205,20 @@ int main() { rarity->labelsize(18); rarity->callback(rarity_callback); + + collection_box = new Fl_Button(300, 700, 140, 50, "仓库"); + collection_box->labelsize(18); + collection_box->callback(collection_callback); + + sell = new Fl_Button(500,700,140,50,"售卖"); + collection_box->labelsize(18); + collection_box->callback(sell_callback); + + sell_question = new Fl_Button(150,0,35,35,"?"); + sell_question->labelsize(10); + sell_question->callback(sell_question_callback); + sell_question->hide(); + btn = new Fl_Button(300, 40, 140, 50, "说明"); btn->labelsize(18); btn->callback(draw_callback); diff --git a/lesson_gui_3.cpp b/lesson_gui_3.cpp index 6bd2bd2..8c61bb4 100644 --- a/lesson_gui_3.cpp +++ b/lesson_gui_3.cpp @@ -1,54 +1,357 @@ -// ===================================================================== -// 第 3 课:随机抽卡 —— 起步骨架 -// 教程文件:第03课-随机抽卡.md -// 完整答案:solutions/lesson_gui_3.cpp -// 起步状态:复用第 2 课的"点按钮显示固定文字",逐步加随机和稀有度判断 -// ===================================================================== - #include #include -#include #include -// TODO(步骤 1):加上随机数和时间需要的头文件 -// 提示:#include -// TODO(步骤 3):加 #include 才能用 sprintf - +#include +#include +#include +#include +#include +Fl_Input* input_name; +Fl_Input* input_phone; +Fl_Input* input_accountpassword; +Fl_Input* input_cin_accountpassword; Fl_Box *result_box; -// TODO(步骤 3):再声明一个全局 Fl_Box 指针 info_box,用来显示本次点数 +Fl_Button *a; +Fl_Button *b; +Fl_Button *c; +Fl_Button *d; +Fl_Button *e; +Fl_Button *f; +Fl_Button *g; +Fl_Button *h; +Fl_Button *i; +Fl_Button *j; +Fl_Button *k; +Fl_Button *l; +Fl_Button *m; +Fl_Button *n; +Fl_Button *o; +Fl_Button *p; +Fl_Button *q; +Fl_Button *r; +std::string prize ; +std::string name; +std::string phone; +Fl_Button *back_menu; +Fl_Button *show_prize; +Fl_Button *repeat_cin_password; +std::string accountpassword; +std::string cin_password; +void show_all_buttons(); +void hide_all_buttons(); +void repeat_cin_password_callback(Fl_Widget *widget, void *data); +void show_prize_callback(Fl_Widget *widget, void *data); +int state; +int chance; +int aa; +int AA; +void back_menu_callback(Fl_Widget *widget, void *data) { + result_box->label(""); + back_menu->hide(); + input_name->hide(); + input_phone->hide(); + input_accountpassword->hide(); + show_prize->show(); + show_all_buttons(); +} +void hide_all_buttons() { + a->hide(); + b->hide(); + c->hide(); + d->hide(); + e->hide(); + f->hide(); + g->hide(); + h->hide(); + i->hide(); + j->hide(); + k->hide(); + l->hide(); + m->hide(); + n->hide(); + o->hide(); + p->hide(); + q->hide(); + r->hide(); +} +void show_all_buttons() { + a->show(); + b->show(); + c->show(); + d->show(); + e->show(); + f->show(); + g->show(); + h->show(); + i->show(); + j->show(); + k->show(); + l->show(); + m->show(); + n->show(); + o->show(); + p->show(); + q->show(); + r->show(); +} +void repeat_cin_password_callback(Fl_Widget *widget, void *data) { + show_prize_callback(widget, data); +} +const char* no_prize_click_back_menu = "您还没有中奖,请先抽奖。请点击回菜单。"; +const char* correct_password_click_back_menu = "密码正确,请点击返回菜单领取奖品"; +std::string prize_string; +std::string prize_wrong_password_string; +void show_prize_callback(Fl_Widget *widget, void *data) { + hide_all_buttons(); + if(state == 0){ + result_box->label(no_prize_click_back_menu); + back_menu->show(); + } + else + { + prize_string = "您中的奖有:" + prize + "\n输入密码后可领取奖品"; + result_box->label(prize_string.c_str()); + input_cin_accountpassword->show(); + if(cin_password == accountpassword) + { + result_box->label("密码正确,请点击回菜单领取奖品"); + back_menu->show(); + state = 0; + prize = ""; + back_menu->show(); + } + else + { + chance-=1; + prize_wrong_password_string = "密码错误,请重新输入, 或者返回菜单,您还有" + std::to_string(chance) +"次机会"; + back_menu->show(); + repeat_cin_password->show(); + } + } +} +void a_callback(Fl_Widget *widget, void *data) { + AA = rand() % 20; + aa = rand() % 18; + hide_all_buttons(); + show_prize->hide(); + if(aa == 1) { + if(AA < 10) { + prize = "五等奖, VIP一天体验卡。为了让您更方便的领奖,请填写您的个人信息。\n填写完信息后请点击回菜单"; + result_box->label(prize.c_str()); + input_name->show(); + input_phone->show(); + input_accountpassword->show(); + input_name->value(name.c_str()); + input_phone->value(phone.c_str()); + input_accountpassword->value(accountpassword.c_str()); + back_menu->show(); + state = 5; + } + else if(AA < 15) { + prize = "四等奖, VIP一周体验卡。为了让您更方便的领奖,请填写您的个人信息。\n填写完信息后请点击回菜单"; + result_box->label(prize.c_str()); + input_name->show(); + input_phone->show(); + input_accountpassword->show(); + input_name->value(name.c_str()); + input_phone->value(phone.c_str()); + input_accountpassword->value(accountpassword.c_str()); + back_menu->show(); + state = 4; + } + else if(AA < 17) { + prize = "三等奖, VIP一个月体验卡。为了让您更方便的领奖,请填写您的个人信息。\n填写完信息后请点击回菜单"; + result_box->label(prize.c_str()); + input_name->show(); + input_phone->show(); + input_accountpassword->show(); -void draw_callback(Fl_Widget *w, void *data) { - // TODO(步骤 2):在这里生成一个 0~99 的随机数 r - // 提示:int r = std::rand() % 100; - - // TODO(步骤 3):用 sprintf 把点数塞进字符串,显示在 info_box 上 - // char info[50]; - // std::sprintf(info, "本次点数:%d", r); - // info_box->label(info); - - // TODO(步骤 4):根据 r 的范围设置稀有度文字和颜色 - // < 70 普通卡,灰色 fl_rgb_color(128, 128, 128) - // < 95 稀有卡,FL_BLUE - // 其他 超稀有卡,FL_RED - result_box->label("(写好步骤 4 后这里会变)"); + input_name->value(name.c_str()); + input_phone->value(phone.c_str()); + input_accountpassword->value(accountpassword.c_str()); + back_menu->show(); + state = 3; + } + else if(AA < 19) { + prize = "二等奖, VIP三个月体验卡。为了让您更方便的领奖,请填写您的个人信息。\n填写完信息后请点击回菜单"; + result_box->label(prize.c_str()); + input_name->show(); + input_phone->show(); + input_accountpassword->show(); + input_name->value(name.c_str()); + input_phone->value(phone.c_str()); + input_accountpassword->value(accountpassword.c_str()); + back_menu->show(); + state = 2; + } + else { + prize = "一等奖, VIP一年体验卡。为了让您更方便的领奖,请填写您的个人信息。\n填写完信息后请点击回菜单"; + result_box->label(prize.c_str()); + input_name->show(); + input_phone->show(); + input_accountpassword->show(); + input_name->value(name.c_str()); + input_phone->value(phone.c_str()); + const char* jj = accountpassword.c_str(); + input_accountpassword->value(jj); + back_menu->show(); + state = 1; + } +} +else { + prize = "谢谢惠顾"; + result_box->label(prize.c_str()); + back_menu->show(); + show_prize->show(); +} +} +void b_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void c_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void d_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void e_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void f_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void g_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void h_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void i_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void j_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void k_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void l_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void m_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void n_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void o_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void p_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void q_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); +} +void r_callback(Fl_Widget *widget, void *data) { + a_callback(widget, data); } int main() { - // TODO(步骤 1):在这里设一次随机种子 - // 提示:std::srand(std::time(nullptr)); + state =0; + cin_password = 1; + chance = 3; + std::srand(std::time(nullptr)); + Fl_Window *window = new Fl_Window(1024, 768, "抽奖"); + a = new Fl_Button(150, 30, 140, 50, "抽奖"); + a->labelsize(18); + a->callback(a_callback); + b = new Fl_Button(350, 30, 140, 50, "抽奖"); + b->labelsize(18); + b->callback(b_callback); + c = new Fl_Button(550, 30, 140, 50, "抽奖"); + c->labelsize(18); + c->callback(c_callback); + d = new Fl_Button(150, 100, 140, 50, "抽奖"); + d->labelsize(18); + d->callback(d_callback); + e = new Fl_Button(350, 100, 140, 50, "抽奖"); + e->labelsize(18); + e->callback(e_callback); + f = new Fl_Button(550, 100, 140, 50, "抽奖"); + f->labelsize(18); + f->callback(f_callback); + g = new Fl_Button(150, 170, 140, 50, "抽奖"); + g->labelsize(18); + g->callback(g_callback); + h = new Fl_Button(350, 170, 140, 50, "抽奖"); + h->labelsize(18); + h->callback(h_callback); + i = new Fl_Button(550, 170, 140, 50, "抽奖"); + i->labelsize(18); + i->callback(i_callback); + j = new Fl_Button(150, 240, 140, 50, "抽奖"); + j->labelsize(18); + j->callback(j_callback); + k = new Fl_Button(350, 240, 140, 50, "抽奖"); + k->labelsize(18); + k->callback(k_callback); + l = new Fl_Button(550, 240, 140, 50, "抽奖"); + l->labelsize(18); + l->callback(g_callback); + m = new Fl_Button(150, 310, 140, 50, "抽奖"); + m->labelsize(18); + m->callback(m_callback); + n = new Fl_Button(350, 310, 140, 50, "抽奖"); + n->labelsize(18); + n->callback(n_callback); + o = new Fl_Button(550, 310, 140, 50, "抽奖"); + o->labelsize(18); + o->callback(o_callback); + p = new Fl_Button(150, 380, 140, 50, "抽奖"); + p->labelsize(18); + p->callback(p_callback); + q = new Fl_Button(350, 380, 140, 50, "抽奖"); + q->labelsize(18); + q->callback(q_callback); + r = new Fl_Button(550, 380, 140, 50, "抽奖"); + r->labelsize(18); + r->callback(r_callback); - Fl_Window *window = new Fl_Window(400, 350, "抽卡世界 - 第3课"); + repeat_cin_password = new Fl_Button(200, 420, 140, 50, "重新输入密码"); + repeat_cin_password->labelsize(18); + repeat_cin_password->callback(repeat_cin_password_callback); + repeat_cin_password->hide(); - Fl_Button *btn = new Fl_Button(130, 30, 140, 50, "抽一张!"); - btn->labelsize(18); - btn->callback(draw_callback); + back_menu = new Fl_Button(200, 520, 140, 50, "返回菜单"); + back_menu->labelsize(18); + back_menu->callback(back_menu_callback); + back_menu->hide(); - result_box = new Fl_Box(50, 110, 300, 80, "点击按钮抽卡吧!"); - result_box->labelsize(28); - result_box->labelfont(FL_BOLD); + show_prize = new Fl_Button(400, 520, 140, 50, "显示奖品"); + show_prize->labelsize(18); + show_prize->callback(show_prize_callback); - // TODO(步骤 3):在这里创建 info_box(位置 (50,200)、宽 300、高 50、字号 14) + input_name = new Fl_Input(200, 130, 200, 30, "姓名"); + input_name->labelsize(18); + input_name->hide(); + input_phone = new Fl_Input(200, 170, 200, 30, "电话"); + input_phone->labelsize(18); + input_phone->hide(); + + input_accountpassword = new Fl_Input(200, 210, 200, 30, "密码"); + input_accountpassword->labelsize(18); + input_accountpassword->hide(); + + input_cin_accountpassword = new Fl_Input(200, 210, 200, 30, "验证密码。"); + input_cin_accountpassword->labelsize(18); + input_cin_accountpassword->hide(); + + result_box = new Fl_Box(50, 130, 900, 450, ""); + result_box->labelsize(20); + result_box->labelcolor(FL_BLACK); window->end(); window->show(); - return Fl::run(); -} + return Fl::run(); +} \ No newline at end of file