Game

                                                                                Game

       Time limit  1000 ms              Memory limit262144 kB

Alice and Bob is playing a game.

Each of them has a number. Alice’s number is A, and Bob’s number is B.

Each turn, one player can do one of the following actions on his own number:

1. Flip: Flip the number. Suppose X = 123456 and after flip, X = 654321

2. Divide. X = X/10. Attention all the numbers are integer. For example X=123456 , after this action X become 12345(but not 12345.6). 0/0=0.

Alice and Bob moves in turn, Alice moves first. Alice can only modify A, Bob can only modify B. If A=B after any player’s action, then Alice win. Otherwise the game keep going on!

Alice wants to win the game, but Bob will try his best to stop Alice.

Suppose Alice and Bob are clever enough, now Alice wants to know whether she can win the game in limited step or the game will never end.


Input

First line contains an integer T (1 ≤ T ≤ 10), represents there are T test cases.

For each test case: Two number A and B. 0<=A,B<=10^100000.

Output

For each test case, if Alice can win the game, output “Alice”. Otherwise output “Bob”.

Sample Input
4
11111 1
1 11111
12345 54321
123 123
Sample Output
Alice
Bob
Alice
Alice
Hint

For the third sample, Alice flip his number and win the game.

For the last sample, A=B, so Alice win the game immediately even nobody take a move.


是一个KMP水题,但当时有组特殊样例没有考虑到,一直在wrong、。

  那组样例就是:当后者的数为零的时候,前者一定赢。

当时没想到的原因是,我只考虑到了样例的一半,也就是我只是在想母串中会出现字串中不含有的字符,却没有考虑到字串如果含有母串中不含有的字符会怎样,一定是不成立吗?

把一件事情倒过来想,也许会发现不一样的东西,应当具备反过来思考样例的思维。

AC代码:

#include <iostream>
#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<deque>
#include<stack>
using namespace std;
char small[1000090],big[1000009],kkk[1000009];
int check[1000009];
int a,b;
void preview()
{
    int k=-1,j=0;
    check[0]=-1;
    while(j<a)
    {
        if(k==-1||small[k]==small[j])
            check[++j]=++k;
        else
            k=check[k];       //对自己本身使用KMP思想,来优化代码,也可以用暴力的方法。
    }
}
void preview1()
{
    int k=-1,j=0;
    check[0]=-1;
    while(j<a)
    {
        if(k==-1||small[k]==small[j])
            check[++j]=++k;
        else
            k=check[k];       //对自己本身使用KMP思想,来优化代码,也可以用暴力的方法。
    }
}
int KMP_times()
{
    int ans=0,k,i,j;
    j=0;
    for(i=0; i<b; i++)
    {
        while(j>0&&small[j]!=big[i])
            j=check[j];
        if(small[j]==big[i])
            j++;
        if(j==a)
        {
            ans++;
            j=check[j];
        }
    }
    return ans;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int t,i,p,j=0,n;
        int x,y;
        x=0;
        scanf(" %s %s",big,small);
        /* if(strlen(small)>strlen(big))
         {
              strcpy(kkk,big);
              strcpy(big,small);
              strcmp(small,kkk);
         }*/
        a=strlen(small);
        b=strlen(big);
        if(a>b)
            printf("Bob\n");

        else
        {
            if(small[0]=='0')
            {
                printf("Alice\n");
                continue;
            }
            else
            {
                preview();

                if(KMP_times()>0)
                    x++;
                for(i=a-1; i>=0; i--)
                    kkk[j++]=small[i];
                kkk[j]=0;
                strcpy(small,kkk);
                preview1();
                if(KMP_times()>0)
                    x++;
                if(x>0)
                    printf("Alice\n");
                else
                    printf("Bob\n");

            }


        }


    }

    return 0;
}


编译无问题,但存在段错误,检测并修改错误函数,将修改后的完整函数写出来: #include "lvgl/lvgl.h" #include "lvgl/demos/lv_demos.h" #include <unistd.h> #include <pthread.h> #include <time.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "game.h" // 定义颜色常量 #define PRIMARY_COLOR lv_color_hex(0x1a1a2e) #define SECONDARY_COLOR lv_color_hex(0x16213e) #define ACCENT_COLOR lv_color_hex(0x0f3460) #define HIGHLIGHT_COLOR lv_color_hex(0xe94560) #define TEXT_COLOR lv_color_hex(0xffffff) // 用户结构体 typedef struct { char username[20]; char password[20]; int high_score; } User; // 游戏结构体 typedef struct { int x[100]; int y[100]; int length; int direction; int food_x; int food_y; int score; int speed; int game_over; } SnakeGame; // 全局变量 static lv_obj_t *login_scr; static lv_obj_t *register_scr; static lv_obj_t *main_menu_scr; static lv_obj_t *game_scr; static lv_obj_t *scoreboard_scr; static SnakeGame game; static User current_user; static User users[10]; static int user_count = 0; static lv_timer_t *game_timer; static void game_timer_cb(lv_timer_t *timer); static lv_obj_t *game_container = NULL; static lv_obj_t *overlay = NULL; static lv_obj_t *score_label_game = NULL; // 函数原型声明 void save_users(); void load_users(); int find_user(const char *username); void register_user(const char *username, const char *password); int login_user(const char *username, const char *password); void update_user_score(int score); void init_game(); void generate_food(); void move_snake(); void check_collision(); void create_login_screen(); void create_register_screen(); void create_main_menu(); void create_game_screen(); void create_scoreboard_screen(); void switch_screen(lv_obj_t *new_screen); // 用户管理函数 void save_users() { FILE *file = fopen("users.dat", "wb"); if (file) { fwrite(&user_count, sizeof(int), 1, file); fwrite(users, sizeof(User), user_count, file); fclose(file); } } void load_users() { FILE *file = fopen("users.dat", "rb"); if (file) { size_t read_count = fread(&user_count, sizeof(int), 1, file); if (read_count == 1 && user_count > 0 && user_count <= 10) { fread(users, sizeof(User), user_count, file); } else { user_count = 0; } fclose(file); } else { user_count = 0; // 初始化用户数量 } } int find_user(const char *username) { for (int i = 0; i < user_count; i++) { if (strcmp(users[i].username, username) == 0) { return i; } } return -1; } void register_user(const char *username, const char *password) { if (user_count >= 10) return; if (find_user(username) != -1) return; strcpy(users[user_count].username, username); strcpy(users[user_count].password, password); users[user_count].high_score = 0; user_count++; save_users(); } int login_user(const char *username, const char *password) { int idx = find_user(username); if (idx == -1) return 0; if (strcmp(users[idx].password, password) != 0) return 0; current_user = users[idx]; return 1; } void update_user_score(int score) { if (score > current_user.high_score) { current_user.high_score = score; } int idx = find_user(current_user.username); if (idx != -1) { users[idx] = current_user; save_users(); } } // 游戏初始化 void init_game() { srand(time(NULL)); game.length = 3; game.direction = 2; // 初始向右移动 game.score = 0; game.speed = 150; game.game_over = 0; // 初始化蛇身位置 - 修改这里 for (int i = 0; i < game.length; i++) { // 蛇头在中间,蛇身向右延伸 game.x[i] = 10 + i; // 初始位置 (10,10), (11,10), (12,10) game.y[i] = 10; } // 生成食物 generate_food(); } void generate_food() { int valid = 0; // 修复:声明valid变量 int attempts = 0; while (!valid && attempts < 100) { game.food_x = rand() % 20; game.food_y = rand() % 20; valid = 1; for (int i = 0; i < game.length; i++) { if (game.x[i] == game.food_x && game.y[i] == game.food_y) { valid = 0; break; } } attempts++; } if (!valid) { // 设置安全位置作为后备 game.food_x = 10; // 中间位置 game.food_y = 10; // 确保这个位置没有蛇身 for (int i = 0; i < game.length; i++) { if (game.x[i] == 10 && game.y[i] == 10) { game.food_x = 11; // 如果中间有蛇,使用旁边位置 game.food_y = 10; break; } } } } void move_snake() { if (game.game_over) return; // 保存蛇尾位置(用于绘制) int prev_x = game.x[game.length-1]; int prev_y = game.y[game.length-1]; // 移动蛇身 for (int i = game.length-1; i > 0; i--) { game.x[i] = game.x[i-1]; game.y[i] = game.y[i-1]; } // 移动蛇头 switch (game.direction) { case 0: game.y[0]--; break; // 上 case 1: game.y[0]++; break; // 下 case 2: game.x[0]++; break; // 右 case 3: game.x[0]--; break; // 左 } // 检查是否吃到食物 if (game.x[0] == game.food_x && game.y[0] == game.food_y) { // 只在吃到食物时才增加长度 if (game.length < 100) { // 检查长度限制 game.length++; // 增加蛇身 game.x[game.length-1] = prev_x; game.y[game.length-1] = prev_y; } else { // 处理达到最大长度的情况 game.game_over = 1; } // 生成新食物 generate_food(); // 增加速度 if (game.speed > 50) { game.speed -= 5; lv_timer_set_period(game_timer, game.speed); } } // 检查碰撞 check_collision(); } void check_collision() { // 检查墙壁碰撞 if (game.x[0] < 0 || game.x[0] >= 20 || game.y[0] < 0 || game.y[0] >= 20) { game.game_over = 1; return; } // 检查自身碰撞 for (int i = 1; i < game.length; i++) { if (game.x[0] == game.x[i] && game.y[0] == game.y[i]) { game.game_over = 1; return; } } } // 修改后的 switch_screen 函数 void switch_screen(lv_obj_t *new_screen) { lv_disp_t *disp = lv_disp_get_default(); lv_disp_load_scr(new_screen); } // 定时器回调辅助函数 static void timer_callback(lv_timer_t *t) { lv_obj_del(t->user_data); lv_timer_del(t); } // 登录回调函数 static void login_btn_cb(lv_event_t *e) { lv_obj_t *username_ta = lv_obj_get_child(login_scr, 1); lv_obj_t *password_ta = lv_obj_get_child(login_scr, 3); const char *username = lv_textarea_get_text(username_ta); const char *password = lv_textarea_get_text(password_ta); if (login_user(username, password)) { switch_screen(main_menu_scr); } else { lv_obj_t *error_label = lv_label_create(login_scr); lv_label_set_text(error_label, "用户名或密码错误"); lv_obj_set_style_text_color(error_label, lv_color_hex(0xff0000), 0); lv_obj_align(error_label, LV_ALIGN_BOTTOM_MID, 0, -20); lv_timer_t *timer = lv_timer_create(timer_callback, 2000, error_label); } } // 注册回调函数 static void register_btn_cb(lv_event_t *e) { lv_obj_t *username_ta = lv_obj_get_child(register_scr, 1); lv_obj_t *password_ta = lv_obj_get_child(register_scr, 3); lv_obj_t *confirm_ta = lv_obj_get_child(register_scr, 5); const char *username = lv_textarea_get_text(username_ta); const char *password = lv_textarea_get_text(password_ta); const char *confirm = lv_textarea_get_text(confirm_ta); if (strlen(username) < 3) { lv_obj_t *error_label = lv_label_create(register_scr); lv_label_set_text(error_label, "用户名至少3个字符"); lv_obj_set_style_text_color(error_label, lv_color_hex(0xff0000), 0); lv_obj_align(error_label, LV_ALIGN_BOTTOM_MID, 0, -20); lv_timer_t *timer = lv_timer_create(timer_callback, 2000, error_label); return; } if (strcmp(password, confirm) != 0) { lv_obj_t *error_label = lv_label_create(register_scr); lv_label_set_text(error_label, "两次输入的密码不一致"); lv_obj_set_style_text_color(error_label, lv_color_hex(0xff0000), 0); lv_obj_align(error_label, LV_ALIGN_BOTTOM_MID, 0, -20); lv_timer_t *timer = lv_timer_create(timer_callback, 2000, error_label); return; } register_user(username, password); switch_screen(login_scr); } // 菜单按钮回调 static void menu_btn_cb(lv_event_t *e) { if (e->code == LV_EVENT_CLICKED) { switch_screen(main_menu_scr); } } // 注册按钮回调 static void register_btn_handler(lv_event_t *e) { if (e->code == LV_EVENT_CLICKED) { switch_screen(register_scr); } } // 返回登录回调 static void back_to_login_cb(lv_event_t *e) { if (e->code == LV_EVENT_CLICKED) { switch_screen(login_scr); } } // 开始游戏回调 static void play_game_cb(lv_event_t *e) { // 清除之前的定时器 if (game_timer) { lv_timer_del(game_timer); game_timer = NULL; } // 清除之前的覆盖层 if (overlay) { lv_obj_del(overlay); overlay = NULL; } init_game(); switch_screen(game_scr); if (score_label_game) { lv_label_set_text(score_label_game, "分数: 0"); } game_timer = lv_timer_create(game_timer_cb, game.speed, NULL); } // 排行榜回调 static void show_scoreboard_cb(lv_event_t *e) { if (e->code == LV_EVENT_CLICKED) { switch_screen(scoreboard_scr); } } // 退出登录回调 static void logout_cb(lv_event_t *e) { if (e->code == LV_EVENT_CLICKED) { switch_screen(login_scr); } } // 返回主菜单回调 static void back_to_menu_cb(lv_event_t *e) { if (e->code == LV_EVENT_CLICKED) { switch_screen(main_menu_scr); } } // 游戏控制回调 static void game_timer_cb(lv_timer_t *timer) { // 检查容器是否有效 - 使用全局变量 if (!game_container) { return; } move_snake(); // 更新UI - 使用全局分数标签 if (score_label_game) { lv_label_set_text_fmt(score_label_game, "分数: %d", game.score); } // 清除之前的绘制 lv_obj_clean(game_container); // 绘制食物 (添加有效性检查) if (game.food_x >= 0 && game.food_y >= 0) { // 修复:移除重复的变量声明 lv_obj_t *food = lv_obj_create(game_container); lv_obj_set_size(food, 15, 15); // 每个格子15x15像素 lv_obj_set_pos(food, game.food_x * 15, game.food_y * 15); lv_obj_set_style_bg_color(food, HIGHLIGHT_COLOR, 0); lv_obj_set_style_radius(food, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_border_width(food, 0, 0); } // 绘制蛇身 for (int i = 0; i < game.length; i++) { lv_obj_t *snake_part = lv_obj_create(game_container); lv_obj_set_size(snake_part, 15, 15); lv_obj_set_pos(snake_part, game.x[i] * 15, game.y[i] * 15); if (i == 0) { // 蛇头 lv_obj_set_style_bg_color(snake_part, HIGHLIGHT_COLOR, 0); } else { // 蛇身 lv_obj_set_style_bg_color(snake_part, lv_color_hex(0x00ff00), 0); } lv_obj_set_style_border_width(snake_part, 0, 0); } lv_obj_invalidate(game_scr); if (game.game_over) { lv_timer_del(game_timer); // 显示游戏结束画面 overlay = lv_obj_create(game_scr); lv_obj_set_size(overlay, lv_pct(100), lv_pct(100)); lv_obj_set_style_bg_color(overlay, lv_color_hex(0x000000), 0); lv_obj_set_style_bg_opa(overlay, LV_OPA_50, 0); lv_obj_set_style_radius(overlay, 0, 0); lv_obj_t *game_over_label = lv_label_create(overlay); lv_label_set_text(game_over_label, "游戏结束!"); lv_obj_set_style_text_font(game_over_label, &lv_font_montserrat_28, 0); lv_obj_set_style_text_color(game_over_label, HIGHLIGHT_COLOR, 0); lv_obj_align(game_over_label, LV_ALIGN_CENTER, 0, -40); // 修复:使用正确的变量名 final_score_label lv_obj_t *final_score_label = lv_label_create(overlay); lv_label_set_text_fmt(final_score_label, "最终分数: %d", game.score); lv_obj_set_style_text_font(final_score_label, &lv_font_montserrat_24, 0); lv_obj_set_style_text_color(final_score_label, TEXT_COLOR, 0); lv_obj_align(final_score_label, LV_ALIGN_CENTER, 0, 0); update_user_score(game.score); lv_obj_t *menu_btn = lv_btn_create(overlay); lv_obj_set_size(menu_btn, 150, 50); lv_obj_align(menu_btn, LV_ALIGN_CENTER, 0, 60); lv_obj_set_style_bg_color(menu_btn, HIGHLIGHT_COLOR, 0); lv_obj_t *btn_label = lv_label_create(menu_btn); lv_label_set_text(btn_label, "返回主菜单"); lv_obj_center(btn_label); lv_obj_add_event_cb(menu_btn, menu_btn_cb, LV_EVENT_CLICKED, NULL); } } // 键盘输入回调 static void game_input_cb(lv_event_t *e) { lv_event_code_t code = lv_event_get_code(e); if (code == LV_EVENT_KEY) { uint32_t key = lv_event_get_key(e); // 防止180度转向 if (key == LV_KEY_UP && game.direction != 1) game.direction = 0; else if (key == LV_KEY_DOWN && game.direction != 0) game.direction = 1; else if (key == LV_KEY_RIGHT && game.direction != 3) game.direction = 2; else if (key == LV_KEY_LEFT && game.direction != 2) game.direction = 3; } } // 创建登录界面 void create_login_screen() { login_scr = lv_obj_create(NULL); lv_obj_set_style_bg_color(login_scr, PRIMARY_COLOR, 0); lv_obj_set_style_pad_all(login_scr, 20, 0); // 标题 lv_obj_t *title = lv_label_create(login_scr); lv_label_set_text(title, "贪吃蛇游戏"); lv_obj_set_style_text_font(title, &lv_font_montserrat_36, 0); lv_obj_set_style_text_color(title, HIGHLIGHT_COLOR, 0); lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 30); // 用户名标签 lv_obj_t *user_label = lv_label_create(login_scr); lv_label_set_text(user_label, "用户名:"); lv_obj_set_style_text_color(user_label, TEXT_COLOR, 0); lv_obj_align(user_label, LV_ALIGN_TOP_MID, -80, 100); // 用户名输入框 lv_obj_t *user_ta = lv_textarea_create(login_scr); lv_obj_set_size(user_ta, 200, 40); lv_obj_align(user_ta, LV_ALIGN_TOP_MID, 40, 100); lv_textarea_set_placeholder_text(user_ta, "输入用户名"); lv_obj_set_style_bg_color(user_ta, SECONDARY_COLOR, 0); // 密码标签 lv_obj_t *pass_label = lv_label_create(login_scr); lv_label_set_text(pass_label, "密码:"); lv_obj_set_style_text_color(pass_label, TEXT_COLOR, 0); lv_obj_align(pass_label, LV_ALIGN_TOP_MID, -80, 160); // 密码输入框 lv_obj_t *pass_ta = lv_textarea_create(login_scr); lv_obj_set_size(pass_ta, 200, 40); lv_obj_align(pass_ta, LV_ALIGN_TOP_MID, 40, 160); lv_textarea_set_placeholder_text(pass_ta, "输入密码"); lv_textarea_set_password_mode(pass_ta, true); lv_obj_set_style_bg_color(pass_ta, SECONDARY_COLOR, 0); // 登录按钮 lv_obj_t *login_btn = lv_btn_create(login_scr); lv_obj_set_size(login_btn, 180, 50); lv_obj_align(login_btn, LV_ALIGN_TOP_MID, 0, 230); lv_obj_set_style_bg_color(login_btn, HIGHLIGHT_COLOR, 0); lv_obj_t *login_label = lv_label_create(login_btn); lv_label_set_text(login_label, "登录"); lv_obj_center(login_label); lv_obj_add_event_cb(login_btn, login_btn_cb, LV_EVENT_CLICKED, NULL); // 注册按钮 lv_obj_t *register_btn = lv_btn_create(login_scr); lv_obj_set_size(register_btn, 180, 40); lv_obj_align(register_btn, LV_ALIGN_TOP_MID, 0, 290); lv_obj_set_style_bg_color(register_btn, ACCENT_COLOR, 0); lv_obj_t *register_label = lv_label_create(register_btn); lv_label_set_text(register_label, "没有账号? 注册"); lv_obj_center(register_label); lv_obj_add_event_cb(register_btn, register_btn_handler, LV_EVENT_CLICKED, NULL); } // 创建注册界面 void create_register_screen() { register_scr = lv_obj_create(NULL); lv_obj_set_style_bg_color(register_scr, PRIMARY_COLOR, 0); lv_obj_set_style_pad_all(register_scr, 20, 0); // 标题 lv_obj_t *title = lv_label_create(register_scr); lv_label_set_text(title, "注册新账号"); lv_obj_set_style_text_font(title, &lv_font_montserrat_28, 0); lv_obj_set_style_text_color(title, HIGHLIGHT_COLOR, 0); lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 30); // 用户名标签 lv_obj_t *user_label = lv_label_create(register_scr); lv_label_set_text(user_label, "用户名:"); lv_obj_set_style_text_color(user_label, TEXT_COLOR, 0); lv_obj_align(user_label, LV_ALIGN_TOP_MID, -80, 100); // 用户名输入框 lv_obj_t *user_ta = lv_textarea_create(register_scr); lv_obj_set_size(user_ta, 200, 40); lv_obj_align(user_ta, LV_ALIGN_TOP_MID, 40, 100); lv_textarea_set_placeholder_text(user_ta, "输入用户名"); lv_obj_set_style_bg_color(user_ta, SECONDARY_COLOR, 0); // 密码标签 lv_obj_t *pass_label = lv_label_create(register_scr); lv_label_set_text(pass_label, "密码:"); lv_obj_set_style_text_color(pass_label, TEXT_COLOR, 0); lv_obj_align(pass_label, LV_ALIGN_TOP_MID, -80, 160); // 密码输入框 lv_obj_t *pass_ta = lv_textarea_create(register_scr); lv_obj_set_size(pass_ta, 200, 40); lv_obj_align(pass_ta, LV_ALIGN_TOP_MID, 40, 160); lv_textarea_set_placeholder_text(pass_ta, "输入密码"); lv_textarea_set_password_mode(pass_ta, true); lv_obj_set_style_bg_color(pass_ta, SECONDARY_COLOR, 0); // 确认密码标签 lv_obj_t *confirm_label = lv_label_create(register_scr); lv_label_set_text(confirm_label, "确认密码:"); lv_obj_set_style_text_color(confirm_label, TEXT_COLOR, 0); lv_obj_align(confirm_label, LV_ALIGN_TOP_MID, -80, 220); // 确认密码输入框 lv_obj_t *confirm_ta = lv_textarea_create(register_scr); lv_obj_set_size(confirm_ta, 200, 40); lv_obj_align(confirm_ta, LV_ALIGN_TOP_MID, 40, 220); lv_textarea_set_placeholder_text(confirm_ta, "再次输入密码"); lv_textarea_set_password_mode(confirm_ta, true); lv_obj_set_style_bg_color(confirm_ta, SECONDARY_COLOR, 0); // 注册按钮 lv_obj_t *register_btn = lv_btn_create(register_scr); lv_obj_set_size(register_btn, 180, 50); lv_obj_align(register_btn, LV_ALIGN_TOP_MID, 0, 290); lv_obj_set_style_bg_color(register_btn, HIGHLIGHT_COLOR, 0); lv_obj_t *register_label = lv_label_create(register_btn); lv_label_set_text(register_label, "注册"); lv_obj_center(register_label); lv_obj_add_event_cb(register_btn, register_btn_cb, LV_EVENT_CLICKED, NULL); // 返回登录按钮 lv_obj_t *back_btn = lv_btn_create(register_scr); lv_obj_set_size(back_btn, 180, 40); lv_obj_align(back_btn, LV_ALIGN_TOP_MID, 0, 350); lv_obj_set_style_bg_color(back_btn, ACCENT_COLOR, 0); lv_obj_t *back_label = lv_label_create(back_btn); lv_label_set_text(back_label, "返回登录"); lv_obj_center(back_label); lv_obj_add_event_cb(back_btn, back_to_login_cb, LV_EVENT_CLICKED, NULL); } // 创建主菜单 void create_main_menu() { main_menu_scr = lv_obj_create(NULL); lv_obj_set_style_bg_color(main_menu_scr, PRIMARY_COLOR, 0); // 欢迎标题 lv_obj_t *welcome_label = lv_label_create(main_menu_scr); lv_label_set_text_fmt(welcome_label, "欢迎, %s!", current_user.username); lv_obj_set_style_text_font(welcome_label, &lv_font_montserrat_24, 0); lv_obj_set_style_text_color(welcome_label, TEXT_COLOR, 0); lv_obj_align(welcome_label, LV_ALIGN_TOP_MID, 0, 30); // 最高分 lv_obj_t *score_label = lv_label_create(main_menu_scr); lv_label_set_text_fmt(score_label, "最高分: %d", current_user.high_score); lv_obj_set_style_text_color(score_label, HIGHLIGHT_COLOR, 0); lv_obj_align(score_label, LV_ALIGN_TOP_MID, 0, 70); // 开始游戏按钮 lv_obj_t *play_btn = lv_btn_create(main_menu_scr); lv_obj_set_size(play_btn, 220, 60); lv_obj_align(play_btn, LV_ALIGN_CENTER, 0, -50); lv_obj_set_style_bg_color(play_btn, HIGHLIGHT_COLOR, 0); lv_obj_t *play_label = lv_label_create(play_btn); lv_label_set_text(play_label, "开始游戏"); lv_obj_center(play_label); lv_obj_set_style_text_font(play_label, &lv_font_montserrat_24, 0); lv_obj_add_event_cb(play_btn, play_game_cb, LV_EVENT_CLICKED, NULL); // 排行榜按钮 lv_obj_t *scoreboard_btn = lv_btn_create(main_menu_scr); lv_obj_set_size(scoreboard_btn, 220, 50); lv_obj_align(scoreboard_btn, LV_ALIGN_CENTER, 0, 30); lv_obj_set_style_bg_color(scoreboard_btn, ACCENT_COLOR, 0); lv_obj_t *scoreboard_label = lv_label_create(scoreboard_btn); lv_label_set_text(scoreboard_label, "排行榜"); lv_obj_center(scoreboard_label); lv_obj_add_event_cb(scoreboard_btn, show_scoreboard_cb, LV_EVENT_CLICKED, NULL); // 退出按钮 lv_obj_t *exit_btn = lv_btn_create(main_menu_scr); lv_obj_set_size(exit_btn, 220, 50); lv_obj_align(exit_btn, LV_ALIGN_CENTER, 0, 100); lv_obj_set_style_bg_color(exit_btn, ACCENT_COLOR, 0); lv_obj_t *exit_label = lv_label_create(exit_btn); lv_label_set_text(exit_label, "退出登录"); lv_obj_center(exit_label); lv_obj_add_event_cb(exit_btn, logout_cb, LV_EVENT_CLICKED, NULL); } // 创建游戏界面 void create_game_screen() { game_scr = lv_obj_create(NULL); lv_obj_set_style_bg_color(game_scr, PRIMARY_COLOR, 0); // 分数显示 score_label_game = lv_label_create(game_scr); // 使用全局变量 lv_label_set_text(score_label_game, "分数: 0"); // 修复:全部使用 score_label_game lv_obj_set_style_text_font(score_label_game, &lv_font_montserrat_20, 0); lv_obj_set_style_text_color(score_label_game, TEXT_COLOR, 0); lv_obj_align(score_label_game, LV_ALIGN_TOP_LEFT, 10, 10); // 游戏区域容器 game_container = lv_obj_create(game_scr); // 赋值给全局变量 lv_obj_set_size(game_container, 300, 300); lv_obj_align(game_container, LV_ALIGN_CENTER, 0, 0); lv_obj_set_style_bg_color(game_container, PRIMARY_COLOR, 0); lv_obj_set_style_border_width(game_container, 0, 0); // 键盘输入支持 lv_obj_add_flag(game_container, LV_OBJ_FLAG_CLICKABLE); lv_obj_add_flag(game_container, LV_OBJ_FLAG_SCROLLABLE); lv_obj_add_event_cb(game_container, game_input_cb, LV_EVENT_KEY, NULL); lv_group_t *group = lv_group_create(); lv_group_add_obj(group, game_container); lv_group_focus_obj(game_container); } // 创建排行榜界面 void create_scoreboard_screen() { scoreboard_scr = lv_obj_create(NULL); lv_obj_set_style_bg_color(scoreboard_scr, PRIMARY_COLOR, 0); // 标题 lv_obj_t *title = lv_label_create(scoreboard_scr); lv_label_set_text(title, "玩家排行榜"); lv_obj_set_style_text_font(title, &lv_font_montserrat_28, 0); lv_obj_set_style_text_color(title, HIGHLIGHT_COLOR, 0); lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 20); // 排行榜容器 lv_obj_t *container = lv_obj_create(scoreboard_scr); lv_obj_set_size(container, 300, 350); lv_obj_align(container, LV_ALIGN_CENTER, 0, 20); lv_obj_set_style_bg_color(container, SECONDARY_COLOR, 0); lv_obj_set_style_border_width(container, 0, 0); lv_obj_set_flex_flow(container, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align(container, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); // 表头 lv_obj_t *header = lv_obj_create(container); lv_obj_set_size(header, lv_pct(100), 40); lv_obj_set_style_bg_color(header, ACCENT_COLOR, 0); lv_obj_set_style_border_width(header, 0, 0); lv_obj_set_flex_flow(header, LV_FLEX_FLOW_ROW); lv_obj_t *rank_label = lv_label_create(header); lv_label_set_text(rank_label, "排名"); lv_obj_set_style_text_font(rank_label, &lv_font_montserrat_18, 0); lv_obj_set_width(rank_label, 60); lv_obj_set_style_pad_left(rank_label, 10, 0); lv_obj_t *name_label = lv_label_create(header); lv_label_set_text(name_label, "玩家"); lv_obj_set_style_text_font(name_label, &lv_font_montserrat_18, 0); lv_obj_set_width(name_label, 150); lv_obj_t *score_label = lv_label_create(header); lv_label_set_text(score_label, "最高分"); lv_obj_set_style_text_font(score_label, &lv_font_montserrat_18, 0); lv_obj_set_width(score_label, 80); // 添加玩家分数 for (int i = 0; i < user_count && i < 5; i++) { lv_obj_t *row = lv_obj_create(container); lv_obj_set_size(row, lv_pct(100), 50); lv_obj_set_style_border_width(row, 0, 0); lv_obj_set_flex_flow(row, LV_FLEX_FLOW_ROW); lv_obj_t *rank = lv_label_create(row); lv_label_set_text_fmt(rank, "%d", i+1); lv_obj_set_style_text_font(rank, &lv_font_montserrat_18, 0); lv_obj_set_width(rank, 60); lv_obj_set_style_pad_left(rank, 10, 0); lv_obj_t *name = lv_label_create(row); lv_label_set_text(name, users[i].username); lv_obj_set_style_text_font(name, &lv_font_montserrat_18, 0); lv_obj_set_width(name, 150); lv_obj_t *score = lv_label_create(row); lv_label_set_text_fmt(score, "%d", users[i].high_score); lv_obj_set_style_text_font(score, &lv_font_montserrat_18, 0); lv_obj_set_width(score, 80); // 高亮当前用户 if (strcmp(users[i].username, current_user.username) == 0) { lv_obj_set_style_bg_color(row, lv_color_hex(0x4a5568), 0); } } // 返回按钮 lv_obj_t *back_btn = lv_btn_create(scoreboard_scr); lv_obj_set_size(back_btn, 150, 50); lv_obj_align(back_btn, LV_ALIGN_BOTTOM_MID, 0, -20); lv_obj_set_style_bg_color(back_btn, HIGHLIGHT_COLOR, 0); lv_obj_t *back_label = lv_label_create(back_btn); lv_label_set_text(back_label, "返回"); lv_obj_center(back_label); lv_obj_add_event_cb(back_btn, back_to_menu_cb, LV_EVENT_CLICKED, NULL); } // 主函数 int main(void) { // 初始化LVGL lv_init(); // 初始化显示驱动和输入设备 // (根据GEC6818开发板具体实现) // 加载用户数据 load_users(); // 创建各个界面 create_login_screen(); create_register_screen(); create_main_menu(); create_game_screen(); create_scoreboard_screen(); // 设置初始屏幕 lv_disp_load_scr(login_scr); // 主循环 while (1) { lv_timer_handler(); usleep(5000); } return 0; }
最新发布
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值