基于allegro5的黑白棋子翻转游戏
2012-11-01 19:10
330 查看
很早以前用turbo c 2.0写的第一个游戏,今天看了下allegro 5的介绍,
在ubuntu上的code::blocks上自己编译了allegro5,重新写了这个小游戏,代码很短,就不写注释了。放在这里做备忘吧。
在ubuntu上的code::blocks上自己编译了allegro5,重新写了这个小游戏,代码很短,就不写注释了。放在这里做备忘吧。
/* allegro5+c 2012/11/1 ymc */ #include <stdio.h> #include <allegro5/allegro.h> #include <allegro5/allegro_primitives.h> #include <allegro5/allegro_native_dialog.h> #include <allegro5/allegro_font.h> #include <allegro5/allegro_ttf.h> #define MAX 8 #define B_SIZE 100 #define B_BORDER 20 int N=4; int width; int height; int x_border=100; int y_border=100; const char *helptxt[3]={"Move:up,down,left,right","Flip:space,enter","Exit:Esc"}; bool redraw; bool doexit; bool win; bool map[MAX][MAX]; ALLEGRO_DISPLAY * display = NULL; ALLEGRO_EVENT_QUEUE *event_queue = NULL; ALLEGRO_FONT *font = NULL; ALLEGRO_DISPLAY_MODE disp_data; ALLEGRO_COLOR fd_color,bk_color,bd_color,cur_color; int cur_x,cur_y; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; void data_init() { if(N<MAX) N++; else N=5; for(int i=0;i<N;i++) for(int j=0;j<N;j++) map[i][j]=false; // map[0][0]=map[1][0]=map[0][1]=false; cur_x=cur_y=0; redraw = false; doexit = false; win = false; width = disp_data.width; height = disp_data.height; x_border = (width-N*B_SIZE-(N-1)*(B_BORDER))/2; y_border = (height-N*B_SIZE-(N-1)*(B_BORDER))/2; } void game_init() { al_init(); al_init_primitives_addon(); al_install_keyboard(); al_init_font_addon(); al_init_ttf_addon(); //al_get_display_mode(al_get_num_display_modes() - 1, &disp_data); font = al_load_ttf_font("FreeSerif.ttf",36,0 ); al_get_display_mode(0, &disp_data); al_set_new_display_flags(ALLEGRO_FULLSCREEN); display = al_create_display(disp_data.width, disp_data.height); event_queue = al_create_event_queue(); al_register_event_source(event_queue, al_get_display_event_source(display)); al_register_event_source(event_queue, al_get_keyboard_event_source()); bk_color = al_map_rgb(220,220,220); fd_color = al_map_rgb(255,255,255); bd_color = al_map_rgb(100,100,100); cur_color = al_map_rgb(0,0,255); al_clear_to_color(bk_color); data_init(); } void game_destroy() { al_shutdown_primitives_addon(); al_destroy_display(display); al_destroy_event_queue(event_queue); } void drawblock(int i,int j,ALLEGRO_COLOR color,ALLEGRO_COLOR bdcolor) { int x=x_border+i*(B_SIZE+B_BORDER); int y=y_border+j*(B_SIZE+B_BORDER); al_draw_filled_rectangle(x,y,x+B_SIZE,y+B_SIZE,color); al_draw_rectangle(x,y,x+B_SIZE,y+B_SIZE, bdcolor,3); } void draw_block(int i,int j) { ALLEGRO_COLOR color,bdcolor; if(map[i][j]) color=fd_color; else color=bk_color; if(i == cur_x && j == cur_y) bdcolor = cur_color; else bdcolor = bd_color; drawblock(i,j,color,bdcolor); } void draw_screen() { al_clear_to_color(bk_color); for(int i=0;i<N;i++) for(int j=0;j<N;j++) draw_block(i,j); al_draw_text(font, fd_color, x_border,y_border-8*B_BORDER,ALLEGRO_ALIGN_LEFT, helptxt[0]); al_draw_text(font, fd_color, x_border,y_border-6*B_BORDER,ALLEGRO_ALIGN_LEFT, helptxt[1]); al_draw_text(font, fd_color, x_border,y_border-4*B_BORDER,ALLEGRO_ALIGN_LEFT, helptxt[2]); al_flip_display(); } void flip(int x,int y) { int x1,y1; map[x][y]=!map[x][y]; for(int k=0;k<4;k++) { x1=x+dir[k][0]; y1=y+dir[k][1]; if(x1>=0 && x1<N && y1>=0 && y1<N) map[x1][y1]=!map[x1][y1]; } } bool check_game() { for(int i=0;i<N;i++) for(int j=0;j<N;j++) if(map[i][j]==false) return false; return true; } short m_box(const char* message = "Well Done!Play game again?", const char* content_title = "Congratulate", const char* title = "Win") { switch(al_show_native_message_box(al_get_current_display(), title, content_title, message, NULL, ALLEGRO_MESSAGEBOX_YES_NO)) { case 0: return 0; // case 1: return 1; // ok or yes case 2: return 2; // no or cancel } return 0; } int main() { ALLEGRO_EVENT ev; game_init(); draw_screen(); while(!doexit) { al_wait_for_event(event_queue,&ev); if(ev.type == ALLEGRO_EVENT_KEY_DOWN) { switch(ev.keyboard.keycode) { case ALLEGRO_KEY_UP: if(cur_y>0) { cur_y--; redraw=true; } break; case ALLEGRO_KEY_DOWN: if(cur_y<N-1) { cur_y++; redraw=true; } break; case ALLEGRO_KEY_LEFT: if(cur_x>0) { cur_x--; redraw=true; } break; case ALLEGRO_KEY_RIGHT: if(cur_x<N-1) { cur_x++; redraw=true; } break; case ALLEGRO_KEY_SPACE: case ALLEGRO_KEY_ENTER: flip(cur_x,cur_y); win = check_game(); redraw=true; break; case ALLEGRO_KEY_ESCAPE: doexit=true; break; } } if(!doexit && redraw && al_is_event_queue_empty(event_queue)) { redraw = false; draw_screen(); } if(win) { win=false; switch(m_box()) { case 2://no ,exit game doexit=true; break; case 1://yes,continue to play game data_init(); redraw=true; break; } } } game_destroy(); return 0; }
相关文章推荐
- Python游戏开发-04-键盘方向键控制精灵移动和翻转(基于Python游戏开发-01)
- 基于HTML5+WebSocket+JAVA的棋牌游戏开发,从入门到放弃(三)
- 基于TCP的网络游戏黑白棋系列(四):游戏棋盘
- <cocos2d-x for wp7>使用cocos2d-x制作基于Tile地图的游戏:加入敌人和战斗(三)
- 如何使用Cocos2D制作一款基于tile的游戏
- 基于TCP/IP的手机聊天游戏(附带源码和解释)之服务器端类
- 基于Unity3D引擎的Android游戏优化
- 19_Android中图片处理原理篇,关于人脸识别网站,图片加载到内存,图片缩放,图片翻转倒置,网上撕衣服游戏案例编写
- 发一个基于Cocos2d-x的游戏
- 基于unity3d游戏的android版本逆向初探
- 基于TCP/IP的手机聊天游戏(附带源码和解释)之客户端类
- 基于TCP/IP的手机聊天游戏(附带源码和解释)之客户端类
- 基于TCP/IP的手机聊天游戏(附带源码和解释)之客户端类
- 基于OpenGL ES 的图片翻转例子,包含双面贴图3D变换
- 基于HTML5/Javascrip的游戏开发框架Phaser
- 基于OGRE的开源游戏
- 【Unity游戏开发之十一】基于NGUI的表情图文混排解决方案
- 6.基于ZMQ的游戏网络层基础架构
- 基于网狐架构台州四张游戏的开发-分牌
- 基于cocos2d-x的游戏框架设计——李成