在MTK上实现数独小游戏
一次听朋友说起印度人喜欢数独小游戏。当时第一次听说数独这个名词,十分疑惑,就立即在百度上查了一下。大致了解了一下数独的玩法。百度对数独的解释大致如下:
九宫格数独,是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数字谜题。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次。这种游戏全面考验做题者观察能力和推理能力,虽然玩法简单,但数字排列方式却千变万化,所以不少教育者认为数独是训练头脑的绝佳方式。
了解了其内容,思考片刻,感觉完全可以在MTK上实现,立即动手花了二十多分钟写了一个DEMO版。这里未考虑架构和移植,仅做技能方面的尝试。本版本适用于240X320的LCD。效果如下图,一个数独的初始化窗口,了解数独算法的人,可以很容易根据我的函数写出可应用的游戏。
奉上代码如下:
#if 1 //jia gdi_handle my_base_layer, my_bg_layer; void ExitDrawTudokuScreen() { gdi_layer_flatten_previous_to_base(); if (my_bg_layer != NULL) { gdi_layer_free(my_bg_layer); } } void DrawTudokuScreen(void) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ S32 i , j; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ EntryNewScreen(MAIN_MENU_SCREENID, ExitDrawTudokuScreen, DrawTudokuScreen, NULL); //开启多层 clear_screen(); entry_full_screen(); gdi_layer_multi_layer_enable(); gdi_layer_create(0, 0, UI_device_width, UI_device_height, &my_bg_layer); if (my_bg_layer == NULL) { return; } gdi_layer_lock_frame_buffer(); gdi_layer_get_base_handle(&my_base_layer); gdi_push_and_set_alpha_blending_source_layer(my_base_layer); //把base_layer层作为blending层 gdi_layer_clear_background(GDI_COLOR_TRANSPARENT);//刷色 gdi_layer_set_source_key(TRUE, GDI_COLOR_TRANSPARENT); //画数独,修改数独数值时使用,这里为维护作者权益,省略了一部分重要的代码 gdi_pop_and_restore_alpha_blending_source_layer(); //恢复blending层 gdi_layer_push_and_set_active(my_bg_layer); gdi_layer_clear_background(GDI_COLOR_TRANSPARENT);//刷色 gdi_layer_set_source_key(TRUE, GDI_COLOR_TRANSPARENT); // 画标题 gui_move_text_cursor(100, 10); gui_set_text_color(UI_COLOR_LIGHT_GREY); gui_print_text(L"Tudoku"); //画81个小方格 for (i = 0; i < 10; i++) { gui_wline(3,i*26+43, 234, i*26+43, UI_COLOR_BLACK, 1); gui_wline(3+i*26,43, 3+i*26, 277, UI_COLOR_BLACK, 1); } //画9个大方格,并把边框加宽 for (i = 0; i < 4; i++) { gui_wline(3,i*26*3+43, 234, i*26*3+43, UI_COLOR_BLACK, 3); gui_wline(3+i*26*3,43, 3+i*26*3, 277, UI_COLOR_BLACK, 3); } //在方框事输入数字 gui_set_font(&MMI_small_font); gui_set_text_color(UI_COLOR_RED); for (i = 0; i < 9; i++) { for (j = 0; j < 9;j++) { S32 x = 3, y = 43; x += i*26 + 5; y += j*26 + 5; gui_move_text_cursor(x, y); gui_print_text(L"0"); } } gdi_layer_pop_and_restore_active(); gdi_layer_unlock_frame_buffer(); gdi_layer_blt(my_bg_layer, my_base_layer, NULL, NULL, 0, 0, UI_device_width, UI_device_height); SetKeyHandler(GoBackHistory, KEY_RSK, KEY_EVENT_UP); } #endif
声明:本文是作者原创,受著作权法保护,请勿转载和用于商业用途,作者保留对侵权行为追究的权力!