一个扫雷程序
2012-10-24 10:58
399 查看
#ifndef _GAME_MINE #define _GAME_MINE #include "etk_type.h" #include "etk_rect.h" #include "etk_display_sdl.h" #include "etk_platform.h" #include "etk_window.h" #include "etk.h" #include "etk_wnd_manager.h" #include "etk_util.h" #include "etk_stack.h" #include "etk_button.h" #include "etk_image_jpeg_decoder.h" #include "etk_image_bmp_decoder.h" #include "etk_widget.h" #include "etk_platform.h" struct mine_t{ char *top; //for paint char *middle; //for judge char *bottom; //raw data int rows; int cols; int bombcount; int recount; int toolix; char status; }mine_t; typedef struct mine_t mine_type; void mine_click_cell(mine_type* mine, unsigned short x, unsigned short y, char isuser); void mine_click_tool(mine_type* mine, unsigned short ix); Ret mine_event(EtkWidget* thiz, EtkEvent* event); void mine_rand_mine(mine_type* mine); void mine_init_mine(mine_type* mine); int mine_bombcount(mine_type* mine, int x, int y); void mine_init_bmp(); void mine_draw_client(EtkWidget* thiz); Ret mine_paint(EtkWidget* thiz); Ret etk_mine_on_mouse_event(EtkWidget* thiz, EtkEvent* event); EtkWidget* etk_game_mine(int x, int y, int rows, int cols, int count); void etk_game_mine_destory(EtkWidget* minewin); #endif
#include "mine.h" #include "etk_pipe.h" //#define MINE_DEBUG //window title bar property #define MINE_WINDOW_TITLE_HEIGHT 20 #define MINE_WINDOW_TITLE_CLOSE_HEIGHT 16 #define MINE_WINDOW_TITLE_CLOSE_WIDTH 16 #define MINE_WINDOW_TITLE_CLOSE_TOP ((MINE_WINDOW_TITLE_HEIGHT - MINE_WINDOW_TITLE_CLOSE_HEIGHT)/2) #define MINE_WINDOW_TITLE_CLOSE_LEFT MINE_WINDOW_TITLE_CLOSE_TOP #define MINE_WINDOW_TITLE_CLOSE_BOTTOM (MINE_WINDOW_TITLE_CLOSE_TOP + MINE_WINDOW_TITLE_CLOSE_HEIGHT) #define MINE_WINDOW_TITLE_CLOSE_RIGHT (MINE_WINDOW_TITLE_CLOSE_LEFT + MINE_WINDOW_TITLE_CLOSE_WIDTH) //mine cell size #define MINE_CELL_WIDTH 16 #define MINE_CELL_HEIGHT 16 //about mine scale #define MINE_ROWS mine->rows #define MINE_COLS mine->cols //tool bar property #define MINE_TOOL_HEIGHT_ALL 20 #define MINE_TOOL_CELL_WIDTH 16 #define MINE_TOOL_CELL_HEIGHT 16 #define MINE_TOOL_CELL_COUNT 6 #define MINE_TOOL_HEIGHT MINE_TOOL_CELL_HEIGHT //widow size #define MINE_CLIENT_EDGE 0 #define MINE_WINDOW_WIDTH ((MINE_CELL_WIDTH * MINE_COLS) + MINE_CLIENT_EDGE) #define MINE_WINDOW_HEIGHT ((MINE_WINDOW_TITLE_HEIGHT + MINE_TOOL_HEIGHT_ALL + (MINE_CELL_HEIGHT * MINE_ROWS))+MINE_CLIENT_EDGE) //client a #define MINE_WINDOW_CLIENT_WIDTH (MINE_CELL_WIDTH * MINE_COLS) #define MINE_WINDOW_CLIENT_HEIGHT (MINE_CELL_HEIGHT * MINE_ROWS) #define MINE_WINDOW_CLIENT_LEFT (((MINE_WINDOW_WIDTH - MINE_WINDOW_CLIENT_WIDTH))/2) #define MINE_WINDOW_CLIENT_TOP ((MINE_WINDOW_HEIGHT - MINE_WINDOW_TITLE_HEIGHT - MINE_TOOL_HEIGHT_ALL - MINE_WINDOW_CLIENT_HEIGHT )/2 + MINE_WINDOW_TITLE_HEIGHT + MINE_TOOL_HEIGHT_ALL) #define MINE_WINDOW_CLIENT_RIGHT (MINE_WINDOW_CLIENT_LEFT + MINE_WINDOW_CLIENT_WIDTH) #define MINE_WINDOW_CLIENT_BOTTOM (MINE_WINDOW_CLIENT_TOP + MINE_WINDOW_CLIENT_HEIGHT) //toolbar property #define MINE_TOOL_WIDTH_ALL MINE_WINDOW_WIDTH #define MINE_TOOL_WIDTH (MINE_TOOL_CELL_WIDTH * MINE_TOOL_CELL_COUNT) #define MINE_TOOL_TOP (((MINE_TOOL_HEIGHT_ALL-MINE_TOOL_HEIGHT)/2) + MINE_WINDOW_TITLE_HEIGHT) #define MINE_TOOL_LEFT ((MINE_TOOL_WIDTH_ALL - MINE_TOOL_WIDTH)/2) #define MINE_TOOL_RIGHT (MINE_TOOL_LEFT + MINE_TOOL_WIDTH) #define MINE_TOOL_BOTTOM (MINE_TOOL_TOP + MINE_TOOL_HEIGHT) //position switch //client //client to window #define MINE_CLIENT_X2WIN(_x) ((_x) + MINE_WINDOW_CLIENT_LEFT) #define MINE_CLIENT_Y2WIN(_y) ((_y) + MINE_WINDOW_CLIENT_TOP) //window to client #define MINE_CLIENT_WIN2X(_x) ((_x) - MINE_WINDOW_CLIENT_LEFT) #define MINE_CLIENT_WIN2Y(_y) ((_y) - MINE_WINDOW_CLIENT_TOP) //tool bar //client to window #define MINE_TOOL_X2WIN(_x) ((_x) + MINE_TOOL_LEFT) #define MINE_TOOL_Y2WIN(_y) ((_y) + MINE_TOOL_TOP) //window to client #define MINE_TOOL_WIN2X(_x) ((_x) - MINE_TOOL_LEFT) #define MINE_TOOL_WIN2Y(_y) ((_y) - MINE_TOOL_TOP) //get mine value #define MINE_GET(_mine, _member, _y, _x) (((_mine)->##_member##[((_mine)->cols * (_y) + (_x))])) //game status #define MINE_STA_RUN 0 //running #define MINE_STA_DIE 1 //death #define MINE_STA_SUC 2 //success //bmp resource EtkBitmap *mine_bmp_bomb[3] = {NULL, NULL, NULL}; EtkBitmap *mine_bmp_sta[3] = {NULL, NULL, NULL}; EtkBitmap *mine_bmp_num[9]; EtkBitmap *mine_bmp_tool[6]; #define MINE_BMP_TOOL_SMILE 0 #define MINE_BMP_TOOL_CRY 1 #define MINE_BMP_TOOL_SUCCESS 2 #define MINE_BMP_TOOL_FLAG 3 #define MINE_BMP_TOOL_UKN 4 #define MINE_BMP_TOOL_CUR 5 #define MINE_TOOL_IX_FLAG 0 #define MINE_TOOL_IX_UKN 1 #define MINE_TOOL_IX_CUR 2 #define MINE_TOOL_IX_FACE 4 #define MINE_EMPTY 0 #define MINE_BOMB 1 #define MINE_BMP_STA 9 #define MINE_BMP_STA_CT 3 #define MINE_BMP_STA_BLANK 9 #define MINE_BMP_STA_FLAG 10 #define MINE_BMP_STA_UNK 11 #define MINE_BMP_BOMB 12 #define MINE_BMP_BOMB_CT 2 #define MINE_BMP_BOMB_NAT 12 #define MINE_BMP_BOMB_FOC 13 //when select cell void mine_click_cell(mine_type* mine, unsigned short x, unsigned short y, char isuser) { int i,j; if(mine->status != MINE_STA_RUN || x >= mine->cols || y >= mine->rows)return; if( MINE_GET(mine, top, y, x) != MINE_BMP_STA_BLANK && MINE_GET(mine, top, y, x) != MINE_BMP_STA_FLAG && MINE_GET(mine, top, y, x) != MINE_BMP_STA_UNK)return; if(isuser) { if(mine->toolix == MINE_TOOL_IX_FLAG) { if(MINE_GET(mine, top, y, x) == MINE_BMP_STA_BLANK) MINE_GET(mine, top, y, x) = MINE_BMP_STA_FLAG; else MINE_GET(mine, top, y, x) = MINE_BMP_STA_BLANK; return; } else if(mine->toolix == MINE_TOOL_IX_UKN) { if(MINE_GET(mine, top, y, x) == MINE_BMP_STA_BLANK) MINE_GET(mine, top, y, x) = MINE_BMP_STA_UNK; else MINE_GET(mine, top, y, x) = MINE_BMP_STA_BLANK; return; } } if( MINE_GET(mine, top, y, x) != MINE_BMP_STA_BLANK && MINE_GET(mine, top, y, x) != MINE_BMP_STA_UNK)return; if(MINE_GET(mine, bottom, y, x) == MINE_EMPTY) //is bomb { MINE_GET(mine, top, y, x) = MINE_GET(mine, middle, y, x); if(MINE_GET(mine, middle, y, x) == 0) { if(x > 0)mine_click_cell(mine, x-1, y, 0); //left if(y > 0)mine_click_cell(mine, x, y-1, 0); //top if(x < (MINE_COLS-1))mine_click_cell(mine, x+1, y, 0); //right if(y < (MINE_ROWS-1))mine_click_cell(mine, x, y+1, 0); //right } --mine->recount; if(mine->recount == 0) //success { mine->status = MINE_STA_SUC; if(mine->bombcount < (mine->cols * mine->rows - 1)) ++mine->bombcount; } } else { if(isuser) //fail { for(j = 0; j < MINE_ROWS; ++j){ for(i = 0; i < MINE_COLS; ++i){ if(MINE_GET(mine, bottom, j, i) == MINE_BOMB){ MINE_GET(mine, top, j, i) = MINE_BMP_BOMB_NAT; } } } MINE_GET(mine, top, y, x) = MINE_BMP_BOMB_FOC; mine->status = MINE_STA_DIE; } else //nothing to do { return; } } } //when select tool void mine_click_tool(mine_type* mine, unsigned short ix){ switch(ix){ case MINE_TOOL_IX_FACE:{ mine_rand_mine(mine); mine->status = MINE_STA_RUN; mine->toolix = MINE_TOOL_IX_CUR; break; } case MINE_TOOL_IX_CUR: case MINE_TOOL_IX_FLAG: case MINE_TOOL_IX_UKN:{ mine->toolix = ix; } } } Ret etk_mine_on_mouse_event(EtkWidget* thiz, EtkEvent* event){ EtkWindowClass *priv=(EtkWindowClass*)thiz->subclass; mine_type* mine = NULL; mine = (mine_type*)priv->data[0]; if(event->type == ETK_EVENT_MOUSE_DOWN){ EtkWindowClass* priv=(EtkWindowClass*)thiz->subclass; e32 x = event->u.mouse.x - thiz->rect.x; e32 y = event->u.mouse.y - thiz->rect.y; if( x >= MINE_WINDOW_CLIENT_LEFT && x < MINE_WINDOW_CLIENT_RIGHT &&y >= MINE_WINDOW_CLIENT_TOP && y < MINE_WINDOW_CLIENT_BOTTOM){ mine_click_cell(mine,MINE_CLIENT_WIN2X(x) / MINE_CELL_WIDTH,MINE_CLIENT_WIN2Y(y) / MINE_CELL_WIDTH, 1); } else if(x >= MINE_TOOL_LEFT && x < MINE_TOOL_RIGHT && y >= MINE_TOOL_TOP && y < MINE_TOOL_BOTTOM){ mine_click_tool(mine, MINE_TOOL_WIN2X(x) / MINE_TOOL_CELL_WIDTH); } mine_paint(thiz); }else if(event->type==ETK_EVENT_MOUSE_UP){ EtkRect r; r.width=1; r.height=1; r.x=event->u.mouse.x-thiz->rect.x; r.y=event->u.mouse.y-thiz->rect.y; r=etk_rect_intersect(priv->close_rect,r); if(r.width>0){ EtkEvent e; //printf("--etk_window_on_mouse_event\n"); etk_event_init(&e, ETK_EVENT_WND_DESTROY); e.widget = thiz; etk_wnd_manager_dispatch_event(etk_default_wnd_manager(),&e); } } } //event Ret mine_event(EtkWidget* thiz, EtkEvent* event){ int x, y; EtkWindowClass *priv=(EtkWindowClass*)thiz->subclass; Ret ret; EtkEvent e; EtkRect r; mine_type* mine = NULL; mine = (mine_type*)priv->data[0]; if(event==NULL) return; switch(event->type){ case ETK_EVENT_UPDATE: etk_widget_paint_all(thiz); //etk_window_update(thiz,&event->u.rect); break; case ETK_EVENT_MOVE_RESIZE: //dbg_printf("ETK_EVENT_MOVE_RESIZE\n"); if(etk_widget_is_visible(thiz)){ etk_wnd_manager_update(etk_default_wnd_manager()); } break; case ETK_EVENT_SHOW: //dbg_printf("ETK_EVENT_SHOW\n"); etk_widget_paint(thiz); etk_event_init(&e, ETK_EVENT_SHOW); e.widget = thiz; etk_wnd_manager_dispatch_event(etk_default_wnd_manager(),&e); break; case ETK_EVENT_HIDE: etk_event_init(&e, ETK_EVENT_HIDE); e.widget = thiz; etk_wnd_manager_dispatch_event(etk_default_wnd_manager(), &e); break; case ETK_EVENT_MOUSE_DOWN: case ETK_EVENT_MOUSE_UP: case ETK_EVENT_MOUSE_MOVE: case ETK_EVENT_MOUSE_LONG_PRESS: ret = etk_mine_on_mouse_event(thiz,event); break; case ETK_EVENT_KEY_DOWN: case ETK_EVENT_KEY_UP: case ETK_EVENT_KEY_LONG_PRESS:{ ret = etk_window_on_key_event(thiz,event); break; } default: break; } return RET_OK; } //create a random mine void mine_rand_mine(mine_type* mine){ int i, j,x,y; //time_t tm = 0; //srand(time(&tm)); mine->recount = (MINE_ROWS * MINE_COLS) - mine->bombcount; for(j = 0; j < MINE_ROWS; ++j){ for(i = 0; i < MINE_COLS; ++i){ MINE_GET(mine, bottom, j, i) = MINE_EMPTY; MINE_GET(mine, top, j, i) = MINE_BMP_STA_BLANK; } } for(i = 0; i < mine->bombcount; ++i){ do{ x = rand() % MINE_COLS; y = rand() % MINE_ROWS; }while(MINE_GET(mine, bottom, y, x) != MINE_EMPTY); MINE_GET(mine, bottom, y, x) = MINE_BOMB; } //display middle for(j = 0; j < MINE_ROWS; ++j){ for(i = 0; i < MINE_COLS; ++i){ MINE_GET(mine, middle, j, i) = mine_bombcount(mine, i, j); } } mine->toolix = MINE_TOOL_IX_CUR; } //initialize mine void mine_init_mine(mine_type* mine){ int size; size = MINE_ROWS * MINE_COLS * sizeof(char); mine->top = (char*)ETK_MALLOC(size); mine->middle = (char*)ETK_MALLOC(size); mine->bottom = (char*)ETK_MALLOC(size); if(mine->bombcount > (MINE_ROWS * MINE_COLS)){ mine->bombcount = (MINE_ROWS * MINE_COLS); } mine_rand_mine(mine); } int mine_bombcount(mine_type* mine, int x, int y){ int ct = 0; if(x > 0 && MINE_GET(mine, bottom, y, x-1) == MINE_BOMB)++ct; //left if(y > 0 && MINE_GET(mine, bottom, y-1, x) == MINE_BOMB)++ct; //top if(x < (MINE_COLS-1) && MINE_GET(mine, bottom, y, x+1) == MINE_BOMB)++ct; //right if(y < (MINE_ROWS-1) && MINE_GET(mine, bottom, y+1, x) == MINE_BOMB)++ct; //right if(x > 0 && y > 0 && MINE_GET(mine, bottom, y-1, x-1) == MINE_BOMB)++ct; //left top if(x > 0 && y < (MINE_ROWS-1) && MINE_GET(mine, bottom, y+1, x-1) == MINE_BOMB)++ct; //left bottom if(y > 0 && x < (MINE_COLS-1) && MINE_GET(mine, bottom, y-1, x+1) == MINE_BOMB)++ct; //right top if(x < (MINE_COLS-1) && y < (MINE_ROWS-1) && MINE_GET(mine, bottom, y+1, x+1) == MINE_BOMB)++ct; //right bottom return ct; } void mine_init_bmp(){ if(mine_bmp_num[0] != NULL){ return; } //number 0 to 8 mine_bmp_num[0] = load_bmp("./mine/num_0.bmp"); mine_bmp_num[1] = load_bmp("./mine/num_1.bmp"); mine_bmp_num[2] = load_bmp("./mine/num_2.bmp"); mine_bmp_num[3] = load_bmp("./mine/num_3.bmp"); mine_bmp_num[4] = load_bmp("./mine/num_4.bmp"); mine_bmp_num[5] = load_bmp("./mine/num_5.bmp"); mine_bmp_num[6] = load_bmp("./mine/num_6.bmp"); mine_bmp_num[7] = load_bmp("./mine/num_7.bmp"); mine_bmp_num[8] = load_bmp("./mine/num_8.bmp"); //8 //state mine_bmp_sta[0] = load_bmp("./mine/sta_blank.bmp");//9 mine_bmp_sta[1] = load_bmp("./mine/sta_flag.bmp"); //10 mine_bmp_sta[2] = load_bmp("./mine/sta_unknown.bmp"); //11 //bomb mine_bmp_bomb[0] = load_bmp("./mine/bomb_nat.bmp"); //12 mine_bmp_bomb[1] = load_bmp("./mine/bomb_focused.bmp"); //13 //tool //face mine_bmp_tool[MINE_BMP_TOOL_SMILE] = load_bmp("./mine/tool_smile.bmp"); mine_bmp_tool[MINE_BMP_TOOL_CRY] = load_bmp("./mine/tool_cry.bmp"); mine_bmp_tool[MINE_BMP_TOOL_SUCCESS] = load_bmp("./mine/tool_success.bmp"); mine_bmp_tool[MINE_BMP_TOOL_FLAG] = load_bmp("./mine/tool_flag.bmp"); mine_bmp_tool[MINE_BMP_TOOL_UKN] = load_bmp("./mine/tool_unknown.bmp"); mine_bmp_tool[MINE_BMP_TOOL_CUR] = load_bmp("./mine/tool_cursor.bmp"); } //draw game clinet void mine_draw_client(EtkWidget* thiz){ int i, j; char c; EtkBitmap *bmp = NULL; EtkRect srec, drec; EtkCanvas *can = NULL; mine_type *mine = NULL; EtkWindowClass *priv=(EtkWindowClass *)thiz->subclass; mine = (mine_type*)priv->data[0]; if(mine_bmp_num[0] == NULL){ //did't initialize bitmap mine_init_bmp(); if(mine_bmp_num[0] == NULL){ return; } } srec.x = 0; srec.y = 0; drec.height = srec.height = MINE_CELL_HEIGHT; drec.width = srec.width = MINE_CELL_WIDTH; can = thiz->canvas; for(j = 0; j < MINE_ROWS; ++j){ for(i = 0; i < MINE_COLS; ++i){ drec.x = MINE_CLIENT_X2WIN(i * MINE_CELL_WIDTH); drec.y = MINE_CLIENT_Y2WIN(j * MINE_CELL_HEIGHT); c = MINE_GET(mine, top, j, i) ; if(c>= 0 && c <= MINE_BMP_BOMB_FOC) { if( c >=0 && c <= 8) bmp = mine_bmp_num[c]; else if(c >=9 && c <= 11){ bmp = mine_bmp_sta[c-9]; } else{ bmp = mine_bmp_bomb[c-12]; } etk_canvas_draw_bitmap(can, bmp, &srec, &drec, 0); } else { //printf("Error!\n"); } } } //toolbar //face drec.height = srec.height = MINE_TOOL_CELL_HEIGHT; drec.width = srec.width = MINE_TOOL_CELL_WIDTH; drec.x = MINE_TOOL_X2WIN(MINE_TOOL_IX_FACE * MINE_TOOL_CELL_WIDTH); drec.y = MINE_TOOL_Y2WIN(0); if(mine->status == MINE_STA_RUN) { etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_SMILE], &srec, &drec, 0); } else if(mine->status == MINE_STA_DIE) { etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_CRY], &srec, &drec, 0); } else if(mine->status == MINE_STA_SUC) { etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_SUCCESS], &srec, &drec, 0); } //flag drec.x = MINE_TOOL_X2WIN(MINE_TOOL_IX_FLAG * MINE_TOOL_CELL_WIDTH); etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_FLAG], &srec, &drec, 0); //unknow drec.x = MINE_TOOL_X2WIN(MINE_TOOL_IX_UKN * MINE_TOOL_CELL_WIDTH); etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_UKN], &srec, &drec, 0); //cursor drec.x = MINE_TOOL_X2WIN(MINE_TOOL_IX_CUR * MINE_TOOL_CELL_WIDTH); etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_CUR], &srec, &drec, 0); //can->draw_rect(can, MINE_TOOL_LEFT, MINE_TOOL_TOP, MINE_TOOL_WIDTH, MINE_TOOL_HEIGHT, 0xff0000); //draw select box can->draw_rect(can, MINE_TOOL_X2WIN(mine->toolix*MINE_TOOL_CELL_WIDTH), MINE_TOOL_Y2WIN(0), MINE_TOOL_CELL_WIDTH-1, MINE_TOOL_CELL_HEIGHT-1, 0xff0000); } //redraw snake munch Ret mine_paint(EtkWidget* thiz){ EtkRect rectitle; EtkColor coltitle; EtkBitmap *bmptitle=NULL; EtkWindowClass *priv=(EtkWindowClass*)thiz->subclass; if((thiz->type&ETK_WIDGET_WINDOW)){ const char *text = NULL; rectitle.x = 0; rectitle.y = 0; rectitle.height = MINE_WINDOW_TITLE_HEIGHT; rectitle.width = thiz->rect.width; etk_color_init(&coltitle,0xffffff-0x8f8fcf,ETK_PIXEL_BGR24); bmptitle = etk_bitmap_create(rectitle.width, rectitle.height, 32, coltitle); //code should be change to save mem //Draw close box etk_bitmap_draw_rect(bmptitle, MINE_WINDOW_TITLE_CLOSE_LEFT, MINE_WINDOW_TITLE_CLOSE_TOP, MINE_WINDOW_TITLE_CLOSE_WIDTH, MINE_WINDOW_TITLE_CLOSE_HEIGHT, 0xcccccc); etk_bitmap_draw_line(bmptitle, MINE_WINDOW_TITLE_CLOSE_LEFT, MINE_WINDOW_TITLE_CLOSE_TOP, MINE_WINDOW_TITLE_CLOSE_RIGHT, MINE_WINDOW_TITLE_CLOSE_BOTTOM); etk_bitmap_draw_line(bmptitle, MINE_WINDOW_TITLE_CLOSE_RIGHT, MINE_WINDOW_TITLE_CLOSE_TOP, MINE_WINDOW_TITLE_CLOSE_LEFT, MINE_WINDOW_TITLE_CLOSE_BOTTOM); //title bar area etk_canvas_draw_bitmap(thiz->canvas, bmptitle, &rectitle, &rectitle, 0x00); etk_bitmap_destroy(bmptitle); } //client area mine_draw_client(thiz); //thiz->display->update(thiz->display,thiz->canvas->bitmap, &thiz->rect, thiz->rect.x-thiz->rect.x,thiz->rect.y-thiz->rect.y); //etk_default_wnd_manager_update_widget(etk_default_wnd_manager(),thiz); return RET_OK; } EtkWidget* etk_game_mine(int x, int y, int rows, int cols, int count){ EtkWidget* thiz; EtkWindowClass *priv; mine_type* mine; mine = (mine_type*)ETK_MALLOC(sizeof(mine_type)); mine->rows = rows; mine->cols = cols; mine->bombcount = count; mine->status = MINE_STA_RUN; mine_init_mine(mine); thiz=etk_window_create(x, y, MINE_WINDOW_WIDTH, MINE_WINDOW_HEIGHT,ETK_WIDGET_WINDOW); priv=(EtkWindowClass*)thiz->subclass; priv->has_head=0; priv->data[0] = mine; thiz->event = mine_event; thiz->paint = mine_paint; return thiz; } //destory mine void etk_game_mine_destory(EtkWidget* minewin){ if(minewin!=NULL){ mine_type * mine; EtkWindowClass *priv=(EtkWindowClass*)minewin->subclass; mine = (mine_type*)priv->data[0]; ETK_FREE(mine->bottom); ETK_FREE(mine->middle); ETK_FREE(mine->top); ETK_FREE(priv->data[0]); } }
相关文章推荐
- 一个简单的扫雷程序
- 用Windbg调试一个Windows自带扫雷程序的逻辑bug
- 用Windbg调试一个Windows自带扫雷程序的逻辑bug
- 一个jQuery版的扫雷程序
- 我写的一个扫雷破解程序
- 一个漂亮的Delphi程序(Delphi在分形艺术中的应用)
- WPF程序只允许一个启动在MVVMLight框架下找不到资源的问题
- 一个简单的显示bmp图像宽高的c程序
- MIT-scheme写的一个数据处理程序
- 一个远程注入的例子(让本机的所有程序弹出一个sylar对话框)
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 改编的一个屏幕保护程序
- 黑马程序员 一个准程序的内心告白,原来上帝是那么的遥远
- 未能加载文件或程序集xxx或它的某一个依赖项 试图加载格式不正确的程序
- 计划写一个财务管理程序
- 发现了Windows自带的一个很有用的程序分析工具
- Qt Quick学习---------------构建一个简单的qml程序
- C++小游戏扫雷——如何写出一个简易的扫雷
- 一个简单的万年历程序