Game

本文介绍了一个简单的程序,用于判断5x5井字棋盘上的胜负情况。通过扫描棋盘,检查水平、垂直及对角线上是否有连续三个相同字符(代表玩家A或B的棋子),来确定游戏的获胜者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

G. Game

3000ms
3000ms
131072KB
64-bit integer IO format: %lld      Java class name: Main
Font Size:

[PDF Link]

Tic-tac-toe is the third most popular activity to kill a lazy afternoon in Ardenia (right after solving puzzles and insulting your neighbors). Arthum and Breece are not fans of this game, but their mother told them to play, so they sit at a5 x 5 board. Both have a large pile of marbles: marbles of Arthum have anA written on them and that of Breece have a B. However, as they are both two years old, they have no concept of rounds. Instead, they just toss their marbles as quick as possible, so after a while each board field has either marbleA or marble B.

At that point, they would like to determine the winner, but counting is not their strong point, either. (They are two years old, remember?) Recall that the goal of tic-tac-toe is to have three own marbles in a row, i.e., lying at three consecutive fields horizontally, vertically or diagonally. If both Arthum and Breece have their three marbles in a row, or neither of them has it, we call it a draw.

Input

The input contains several test cases. The first line of the input contains a positive integer Z$ \le$105, denoting the number of test cases. Then Z test cases follow, each conforming to the format described below.

The input instance describes marbles placed on the board in a single game. The instance consists of 5 rows and each of them consists of 5 letters:A or B.

Output

For each test case, your program has to write an output conforming to the format described below.

You should output one line describing the outcome of the game, i.e., one of the three possible strings:A wins, B wins, or draw.

Sample Input

2 
AABBA 
BAAAB 
AAABA 
ABAAB 
BAAAB 
AAAAA 
AAAAA 
BAAAA 
ABAAA 
AABAA

Sample Output

A wins 
draw

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char a[10][10];
int  f1,f2;
void check(char a[10][10])
{
  int i,j;
  for(i=1;i<=5;i++)
    for(j=1;j<=5;j++){
      if(a[i][j]==a[i][j+1]&&a[i][j+1]==a[i][j+2]){         // 每行
         if(a[i][j]=='A')    f1=1;
         else  if(a[i][j]=='B')                f2=1;                                      
      }                 
      if(a[i][j]==a[i+1][j]&&a[i+1][j]==a[i+2][j]){         // 每列  
         if(a[i][j]=='A')    f1=1;
         else  if(a[i][j]=='B')                f2=1;                                      
      }
      if(a[i][j]==a[i+1][j+1]&&a[i+1][j+1]==a[i+2][j+2]){    // 左上右下对角线
         if(a[i][j]=='A')    f1=1;
         else if(a[i][j]=='B')                 f2=1;                                      
      }       
   if(a[i][j]==a[i-1][j+1]&&a[i-1][j+1]==a[i-2][j+2]){    // 左下右上对角线
         if(a[i][j]=='A')    f1=1;  
         else   if(a[i][j]=='B')           f2=1;                                                   
      }                                         
    }   
}
int main(){
    int t,i,j,f=0;
    scanf("%d",&t);
    getchar();
    while(t--){
      memset(a,0,sizeof(a));
      for(i=1;i<=5;i++){
       for(j=1;j<=5;j++)
           scanf("%c",&a[i][j]);
       getchar();
      }
      f1=0;  f2=0;
      check(a);
      if(f1==1&&f2==0)  printf("A wins\n");
      else if(f2==1&f1==0)  printf("B wins\n");
      else         printf("draw\n");              
   }
   system("pause");
   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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值