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

📄 fifteen.c

📁 EGui是一个开源的图形系统软件,类似于QT/Embedded、GTK-FB、MicroWindow。目标是嵌入式平台整合解 决方案。基于Linux Framebuffer 设备驱动上实现。有完
💻 C
字号:
#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <sys/stat.h>#include <sys/types.h>#include <unistd.h>#include <string.h>#include <Egui.h>#include <widget.h>EGui_FBinfo Efbinfo;int bw = 40, bh = 30;		/* button w,h */int ww = 200, wh = 200;		/* window w,h */struct pos_xy{  short x;  short y;  short id;};struct pos_xy array_16[16];EGui_Widget * button[15];EGui_Widget * button_win ;int find_array_by_id (short id);void random_pos ();void button_click ( EGui_Widget     *widget){  int i,pos,can_move;  short id;  short winid;  /* find widget  */  for (i=0;i<15;i++)    {      if (widget == button[i])	{	  id = i;	  break;	}    }    pos = find_array_by_id (id);  can_move = find_empty (pos);    if (can_move == 16)    return ;  widget_move (widget,array_16[can_move].x,array_16[can_move].y);  array_16[pos].id      = 15;  array_16[can_move].id = id;  winid = find_winid ();  if (winid == 16)    {      widget_set_name(button_win,"YOU WIN!");      widget_draw (button_win);    }  widget_draw (widget->parent);}void button_win_click ( EGui_Widget     *widget){  int i;  int bu;  widget_set_name(widget,"New Start");  widget_draw (widget);    random_pos ();  for (i=0;i<16;i++)    {      bu = array_16[i].id;      if (bu != 15)	widget_move (button[bu],array_16[i].x,array_16[i].y);    }  widget_draw (widget->parent);}intfind_array_by_id (short id){  int i;    for (i=0;i<16;i++)    {      if (array_16[i].id == id)	return i;    }    return 15;}intfind_winid (){  int i;    for (i=0;i<16;i++)    {      if (array_16[i].id != i)	return i;    }  return 16;}int find_empty(int pos){  int new_pos;    new_pos = pos + 1;    if (( 0 <= new_pos) && (new_pos <16))    {      if (array_16[new_pos].id == 15)	return new_pos;    }  new_pos = pos - 1;    if ( 0 <= new_pos && new_pos <16)    {      if (array_16[new_pos].id == 15)	return new_pos;    }  new_pos = pos + 4;    if ( 0 <= new_pos && new_pos <16)    {      if (array_16[new_pos].id == 15)	return new_pos;    }  new_pos = pos - 4;    if ( 0 <= new_pos && new_pos <16)    {      if (array_16[new_pos].id == 15)	return new_pos;    }  return 16;}voidinit_pos (){  int pos_startx,pos_starty;  int i,j;    pos_startx = ww / 2 - 2 * bw - 2;  pos_starty = wh / 2 - 2 * bh - 2;    for (i=0;i<4;i++)    {      for (j=0;j<4;j++)	{	  array_16[i*4+j].x = pos_startx + (1+bw) * j + 1 ;	  array_16[i*4+j].y = pos_starty + (1+bh) * i + 1 ;	}    }}voidrandom_pos (){  array_16[0].id = 7 ;  array_16[1].id = 9;  array_16[2].id = 3;  array_16[3].id = 5;  array_16[4].id = 8;  array_16[5].id = 10;  array_16[6].id = 13;  array_16[7].id = 2;  array_16[8].id = 15;  array_16[9].id = 4;  array_16[10].id = 1;  array_16[11].id = 6;  array_16[12].id = 14;  array_16[13].id = 12;  array_16[14].id = 11;  array_16[15].id = 0; }voidcreate_buttons (EGui_Widget *parent){  int i;  int pos;  char name[2];  for (i=0;i<15;i++)    {      pos = find_array_by_id (i);      button[i] = new_button (parent,array_16[pos].x,array_16[pos].y,bw,bh);      sprintf (name,"%d",i);      widget_set_name(button[i],name);      widget_show(button[i]);      widget_register_callback (button[i], BUTTON_CLICK_LEFT,button_click);    }  }intmain(int argc, char **argv){  char * rgbbuf;  int width,height;  Ecolor * bgcolor;  int w,h;  EGui_Window * ewindow;  EGui_Widget * form;  EGui_Widget * button1, * button2;  EGui_Widget * win;  if (Egui_open (&Efbinfo))    return ;  bgcolor = malloc (sizeof ( Ecolor));  if (bgcolor == NULL)    {      printf ("malloc color ERROR\n");      return -1;    }  bgcolor->r = bgcolor->g = bgcolor->b = 0xcc;  /* create window will initial color's pixel.    */  ewindow = Egui_CreateWindow (&Efbinfo,150,100,ww,			       wh,bgcolor,EGUI_WINDOW_TOP);  if (ewindow == NULL)    {      printf ("New windows failed\n");      Egui_close ();      return 1;    }  Egui_SetWindowName(ewindow,"Fifteen");  Egui_drawwindow(ewindow);  win = new_widget_window(ewindow);  widget_show(win);  form = new_form (win);  widget_show (form);    /* init position */  init_pos ();  /* get random pos */  random_pos ();  create_buttons (form);    button_win = new_button (form,20,170,100,25);  widget_set_name(button_win,"New Start");  widget_show(button_win);  widget_register_callback (button_win, BUTTON_CLICK_LEFT,button_win_click);  widget_draw (win);    egui_loop ();  Egui_CloseWindow (ewindow);  free (bgcolor);  Egui_close ();}

⌨️ 快捷键说明

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