⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sokoban.c

📁 编译后直接运行的MP3播放器全部C语言源代码 一个包含FAT文件系统、系统引导 Boot、FLASH Driver等内容的
💻 C
📖 第 1 页 / 共 2 页
字号:
{    load_level();    rb->lcd_clear_display();    update_screen();}static bool sokoban_loop(void){    char new_spot;    bool moved = true;    int i = 0, button = 0;    short r = 0, c = 0;    current_info.level.level = 1;    load_level();    update_screen();     while (1) {        moved = true;        r = current_info.player.row;        c = current_info.player.col;        button = rb->button_get(true);        add_undo(button);        switch(button)         {            case BUTTON_OFF:                /* get out of here */                return PLUGIN_OK;             case BUTTON_ON:            case BUTTON_ON | BUTTON_REPEAT:                /* this is UNDO */                undo();                rb->lcd_clear_display();                update_screen();                 moved = false;                break;            case BUTTON_F3:            case BUTTON_F3 | BUTTON_REPEAT:                /* increase level */                init_undo();                current_info.level.boxes_to_go=0;                moved = true;                break;            case BUTTON_F1:            case BUTTON_F1 | BUTTON_REPEAT:                /* previous level */                init_undo();                if (current_info.level.level > 1)                    current_info.level.level--;                draw_level();                moved = false;                break;            case BUTTON_F2:            case BUTTON_F2 | BUTTON_REPEAT:                /* same level */                init_undo();                draw_level();                moved = false;                break;            case BUTTON_LEFT:                switch(current_info.board[r][c-1])                 {                    case ' ': /* if it is a blank spot */                    case '.': /* if it is a home spot */                        new_spot = current_info.board[r][c-1];                        current_info.board[r][c-1] = '@';                        current_info.board[r][c] = current_info.player.spot;                        current_info.player.spot = new_spot;                        break;                    case '$':                        switch(current_info.board[r][c-2])                        {                            case ' ': /* going from blank to blank */                                current_info.board[r][c-2] = current_info.board[r][c-1];                                current_info.board[r][c-1] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                current_info.player.spot = ' ';                                break;                            case '.': /* going from a blank to home */                                current_info.board[r][c-2] = '%';                                current_info.board[r][c-1] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                 current_info.player.spot = ' ';                                current_info.level.boxes_to_go--;                                break;                            default:                                moved = false;                                break;                        }                        break;                    case '%':                        switch(current_info.board[r][c-2]) {                            case ' ': /* we are going from a home to a blank */                                current_info.board[r][c-2] = '$';                                current_info.board[r][c-1] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                current_info.player.spot = '.';                                current_info.level.boxes_to_go++;                                break;                            case '.': /* if we are going from a home to home */                                current_info.board[r][c-2] = '%';                                current_info.board[r][c-1] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                 current_info.player.spot = '.';                                break;                            default:                                moved = false;                                break;                        }                        break;                    default:                        moved = false;                        break;                }                if (moved)                    current_info.player.col--;                break;            case BUTTON_RIGHT: /* if it is a blank spot */                switch(current_info.board[r][c+1]) {                    case ' ':                    case '.': /* if it is a home spot */                        new_spot = current_info.board[r][c+1];                        current_info.board[r][c+1] = '@';                        current_info.board[r][c] = current_info.player.spot;                        current_info.player.spot = new_spot;                        break;                    case '$':                         switch(current_info.board[r][c+2]) {                            case ' ': /* going from blank to blank */                                current_info.board[r][c+2] = current_info.board[r][c+1];                                current_info.board[r][c+1] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                current_info.player.spot = ' ';                                break;                            case '.': /* going from a blank to home */                                current_info.board[r][c+2] = '%';                                current_info.board[r][c+1] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                 current_info.player.spot = ' ';                                current_info.level.boxes_to_go--;                                break;                            default:                                moved = false;                                break;                        }                        break;                    case '%':                        switch(current_info.board[r][c+2]) {                            case ' ': /* going from a home to a blank */                                current_info.board[r][c+2] = '$';                                current_info.board[r][c+1] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                current_info.player.spot = '.';                                current_info.level.boxes_to_go++;                                break;                            case '.':                                current_info.board[r][c+2] = '%';                                current_info.board[r][c+1] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                 current_info.player.spot = '.';                                break;                            default:                                moved = false;                                break;                        }                        break;                    default:                        moved = false;                        break;                }                if (moved)                    current_info.player.col++;                break;            case BUTTON_UP:                switch(current_info.board[r-1][c]) {                    case ' ': /* if it is a blank spot */                    case '.': /* if it is a home spot */                        new_spot = current_info.board[r-1][c];                        current_info.board[r-1][c] = '@';                        current_info.board[r][c] = current_info.player.spot;                        current_info.player.spot = new_spot;                        break;                    case '$':                        switch(current_info.board[r-2][c]) {                            case ' ': /* going from blank to blank */                                current_info.board[r-2][c] = current_info.board[r-1][c];                                current_info.board[r-1][c] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                current_info.player.spot = ' ';                                break;                            case '.': /* going from a blank to home */                                current_info.board[r-2][c] = '%';                                current_info.board[r-1][c] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                 current_info.player.spot = ' ';                                current_info.level.boxes_to_go--;                                break;                            default:                                moved = false;                                break;                        }                        break;                    case '%':                        switch(current_info.board[r-2][c]) {                            case ' ': /* we are going from a home to a blank */                                current_info.board[r-2][c] = '$';                                current_info.board[r-1][c] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                current_info.player.spot = '.';                                current_info.level.boxes_to_go++;                                break;                            case '.': /* if we are going from a home to home */                                current_info.board[r-2][c] = '%';                                current_info.board[r-1][c] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                 current_info.player.spot = '.';                                break;                            default:                                moved = false;                                break;                        }                        break;                    default:                        moved = false;                        break;                }                if (moved)                    current_info.player.row--;                break;            case BUTTON_DOWN:                switch(current_info.board[r+1][c]) {                    case ' ': /* if it is a blank spot */                    case '.': /* if it is a home spot */                        new_spot = current_info.board[r+1][c];                        current_info.board[r+1][c] = '@';                        current_info.board[r][c] = current_info.player.spot;                        current_info.player.spot = new_spot;                        break;                    case '$':                        switch(current_info.board[r+2][c]) {                            case ' ': /* going from blank to blank */                                current_info.board[r+2][c] = current_info.board[r+1][c];                                current_info.board[r+1][c] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                current_info.player.spot = ' ';                                break;                            case '.': /* going from a blank to home */                                current_info.board[r+2][c] = '%';                                current_info.board[r+1][c] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                 current_info.player.spot = ' ';                                current_info.level.boxes_to_go--;                                break;                            default:                                moved = false;                                break;                        }                        break;                    case '%':                        switch(current_info.board[r+2][c]) {                            case ' ': /* going from a home to a blank */                                current_info.board[r+2][c] = '$';                                current_info.board[r+1][c] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                current_info.player.spot = '.';                                current_info.level.boxes_to_go++;                                break;                            case '.': /* going from a home to home */                                current_info.board[r+2][c] = '%';                                current_info.board[r+1][c] = current_info.board[r][c];                                current_info.board[r][c] = current_info.player.spot;                                 current_info.player.spot = '.';                                break;                            default:                                moved = false;                                break;                        }                        break;                    default:                        moved = false;                        break;                }                if (moved)                    current_info.player.row++;                break;            case SYS_USB_CONNECTED:                rb->usb_screen();                return PLUGIN_USB_CONNECTED;            default:                moved = false;                break;        }                if (moved) {            current_info.level.moves++;            rb->lcd_clear_display();            update_screen();         }        /* We have completed this level */        if (current_info.level.boxes_to_go == 0) {            current_info.level.level++;            /* clear undo stats */            init_undo();            rb->lcd_clear_display();			            if (current_info.level.level > current_info.max_level) {                rb->lcd_putsxy(10, 20, "You WIN!!");                for (i = 0; i < 30000 ; i++) {                    rb->lcd_invertrect(0, 0, 111, 63);                    rb->lcd_update();                    button = rb->button_get(false);                    if (button && ((button & BUTTON_REL) != BUTTON_REL))                        break;                }                return PLUGIN_OK;            }            load_level();            update_screen();        }    } /* end while */    return PLUGIN_OK;}enum plugin_status plugin_start(struct plugin_api* api, void* parameter){    int w, h;    int len;    TEST_PLUGIN_API(api);    (void)(parameter);    rb = api;        rb->lcd_setfont(FONT_SYSFIXED);    rb->lcd_getstringsize(SOKOBAN_TITLE, &w, &h);    /* Get horizontel centering for text */    len = w;    if (len%2 != 0)        len =((len+1)/2)+(w/2);    else        len /= 2;    if (h%2 != 0)        h = (h/2)+1;    else        h /= 2;    rb->lcd_clear_display();    rb->lcd_putsxy(LCD_WIDTH/2-len,(LCD_HEIGHT/2)-h, SOKOBAN_TITLE);    rb->lcd_update();    rb->sleep(HZ*2);    rb->lcd_clear_display();    rb->lcd_putsxy(3,  6, "[OFF] To Stop");    rb->lcd_putsxy(3, 16, "[ON] To Undo");    rb->lcd_putsxy(3, 26, "[F1] - Level");    rb->lcd_putsxy(3, 36, "[F2] Same Level");    rb->lcd_putsxy(3, 46, "[F3] + Level");    rb->lcd_update();    rb->sleep(HZ*2);    rb->lcd_clear_display();    init_boards();    if (get_level_count() != 0) {        rb->splash(HZ*2, true, "Failed loading levels!");        return PLUGIN_OK;    }    return sokoban_loop();}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -