fang.c

来自「redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是B」· C语言 代码 · 共 571 行 · 第 1/2 页

C
571
字号
/*方块游戏源码*/

#include <CsAgb.h>
#include <rb_stdio.h>
#include <graph.h>
#include <Qgraph.h>
#include <rmath.h>
#include <rb_string.h>
#define gametime  *(u16*)0x400010C//时钟(TIME_3)
#define SET_BAS 10344//SRAM 存档基础(前10K用于BASIC储备)
#define fang_set_M 270//方块游戏存档区 (80字节)

extern u32 TM_CN;//TIME 计数器
extern u32 KeyDelayCnt; //按徤延时
extern u32 rnd(u32);

struct fang_loc
{
   u8 xp;
   u8 yp;
};
typedef struct
{
   char flag;//S/N
   u16 dat[20];//游戏数据
   u16 lines;//消行
   u32 hi_score;//最高分
   u32 score;//分数
   struct fang_loc now[4];//当前方块
   struct fang_loc next[4];//下个方块
   u8 ctype;
} fang_mes;//方块游戏存储数据

const u16 fang_game_color[5][2]={
   {RGB(25,5,10),18000},{0,RGB(30,30,30)},{RGB(10,5,8),RGB(27,27,27)},
   {RGB(3,7,15),RGB(26,26,27)},{RGB(30,30,0),RGB(15,5,10)}
};//五种颜色方案

extern u16 rb_co;
extern u16 rb_bg;
extern u8 rb_yp;//RBASIC的一些公共变量,这里挪来用用

#define myobj_cnt 15
extern u8 myobj[myobj_cnt];
extern void myobj_new_str(char *str,u8 step);
extern void (*sys_deamon)();

void fang_obj()//得分时的一点修饰
{
   int i;
   rb_yp--;
   if (rb_yp<30)
   {
      sys_deamon=NULL;
      for (i=0;i<myobj_cnt;i++) CS_MoveObj(myobj[i],-10,-10);
      CS_ShowSprites();
      return;
   }
   for (i=0;i<myobj_cnt;i++) CS_MoveObj(myobj[i],100+i*8,rb_yp);
   CS_ShowSprites();
}

void fang_newobj(char *str)
{
   int i;
   sys_deamon=NULL;
   myobj_new_str(str,1);//更改字符数据
   rb_yp=70;
   for (i=0;i<myobj_cnt;i++) CS_MoveObj(myobj[i],100+i*8,70);
   sys_deamon=fang_obj;
}

void fang_game_sv(fang_mes *M,u8 act)//方块游戏存档
{
   CS_SeekInSRAM(SRAM_SEEK_START,SET_BAS+fang_set_M);
   if (act==1) CS_SaveToSRAM(M,sizeof(fang_mes));//存档
   else if (act==2) CS_LoadFromSRAM(M,sizeof(fang_mes));//读档
}
void fang_dat_to_sv(u8 *stats,u16 *dat)//方块数据转化为存档数据
{
   int i,j;
   u16 temp;
   for (i=0;i<20;i++)
   {
      temp=0;
      for (j=0;j<10;j++) temp=temp*2+stats[i*11+j];
      dat[i]=temp;
   }
}
void fang_sv_to_dat(u8 *stats,u16 *dat)//存档数据转化为方块数据
{
   int i,j;
   u16 mm[10]={0x200,0x100,0x080,0x040,0x020,0x010,0x008,0x004,0x002,0x001};
   for (i=0;i<20;i++)
   {
      stats[i*11+10]=0;
      for (j=0;j<10;j++)
      {
         stats[i*11+j]=(dat[i]&mm[j]?1:0);
         stats[i*11+10]+=stats[i*11+j];
      }
   }
}
void fang_timer()//游戏计数程序,用于控制方块下落速度
{
   TM_CN++;
   if (sys_deamon && (TM_CN&0x3)==0) sys_deamon();
}

void box_display(u8 xp,u8 yp,u8 mod)//方块显示
{
   Q_box(72+xp*6,29+yp*6,76+xp*6,33+yp*6,(mod?rb_co:rb_bg));
   return;
}
void fang_clear_line(u8 *clear,u8 lines)//方块消行
{
   u8 i,j,m,k;
   u32 wait;
   for (j=0;j<6;j++)
   {
      for (k=0;k<lines;k++)
      {
         for (i=0;i<10;i++) box_display(i,*(clear+k),j%2);
      }
      for (wait=0;wait<2000000;wait++) m++;//空循环实现闪烁效果
   }
   return;
}
void map_display(struct fang_loc *map,u8 mod)//显示方块(由四个方格组成)
{
   u8 i=0;
   for (i=0;i<4;i++) box_display((map+i)->xp,(map+i)->yp,mod);
   return;
}

void map_save(struct fang_loc *map_re,struct fang_loc *map_sv)//保存方块数据
{
   u8 i;
   for (i=0;i<4;i++)
   {
      (map_sv+i)->xp=(map_re+i)->xp;
      (map_sv+i)->yp=(map_re+i)->yp;
   }
   return;
}

void show_next(struct fang_loc *map,u8 mod)//预告下一个方块
{
   struct fang_loc temp[4];
   u8 i;
   for (i=0;i<4;i++)
   {
      temp[i].xp=(map+i)->xp+11;
      temp[i].yp=(map+i)->yp;
   }
   map_display(temp,mod);
   return;
}
void map_down(struct fang_loc *map,u8 down)//方块下落
{
   u8 i;
   for (i=0;i<4;i++) (map+i)->yp+=down;
   return;
}
void map_qdown(struct fang_loc *map,u8 *plate)//方块快速下落
{
   u8 i,j,dow=0,stop=0,x,y,m=0;
   for (i=0;i<20;i++)
   {
      for (j=0;j<4;j++)
      {
         (map+j)->yp++;
         x=(map+j)->xp;
         y=(map+j)->yp;
         if ((map+j)->yp>19 || *(plate+x+11*y))
         {
            stop=1;
            m=j;
            break;
         }
      }
      if (stop) break;
   }
   for (i=0;i<=m;i++) (map+i)->yp--;
   return;
}
void map_left(struct fang_loc *map)//方块左移
{
   u8 i;
   for (i=0;i<4;i++) if (!(map+i)->xp) return;//检测是否最左
   for (i=0;i<4;i++) (map+i)->xp--;
   return;
}

void map_turn(struct fang_loc *map)//方块翻转
{
   int i,xp,yp;
   struct fang_loc temp[4];
   map_save(map,temp);
   for (i=1;i<4;i++)
   {
      xp=map->xp+(map+i)->yp-map->yp;
      yp=map->yp-(map+i)->xp+map->xp;
      if (xp<0 || yp<0 || xp>9 || yp>19)
      {
         map_save(temp,map);
         return;
      }
      (map+i)->xp=xp;
      (map+i)->yp=yp;
   }
   return;
}

void map_right(struct fang_loc *map)//方块右移
{
   u8 i;
   for (i=0;i<4;i++) if ((map+i)->xp==9) return;//检测是否最右
   for (i=0;i<4;i++) (map+i)->xp++;
   return;
}

void show_map_qdown(struct fang_loc *map,u8 step)//方块快速下落残影效果
{
   struct fang_loc now[4];
   u32 wait,temp;
   u8 i,j;
   map_save(map,now);
   for (j=0;j<step;j++)
   {
      map_display(now,1);
      for (wait=0;wait<200000;wait++) {temp++;}
      map_down(now,1);
   }
   map_save(map,now);
   for (j=0;j<step;j++)
   {
      map_display(now,0);
      for (wait=0;wait<200000;wait++) {temp++;}
      map_down(now,1);
   }
   return;
}
void fang_gameover()//游戏结束
{
   int i;
   u8 j;
   u32 wait;
   for (i=19;i>=0;i--)
   {
      for (j=0;j<10;j++) box_display(j,i,1);
      for (wait=0;wait<4000000;wait++) wait++;
   }
   return;
}
void show_num(u8 xp,u8 yp,u32 num,u8 cout)
{
   u8 i,temp[10],line,rol,times;
   const u8 number[10][15]={{1,1,1,1,0,1,1,0,1,1,0,1,1,1,1},{0,0,1,0,0,1,0,0,1,0,0,1,0,0,1},
   {1,1,1,0,0,1,1,1,1,1,0,0,1,1,1},{1,1,1,0,0,1,1,1,1,0,0,1,1,1,1},{1,0,1,1,0,1,1,1,1,0,0,1,0,0,1},
   {1,1,1,1,0,0,1,1,1,0,0,1,1,1,1},{1,1,1,1,0,0,1,1,1,1,0,1,1,1,1},{1,1,1,0,0,1,0,0,1,0,0,1,0,0,1},
   {1,1,1,1,0,1,1,1,1,1,0,1,1,1,1},{1,1,1,1,0,1,1,1,1,0,0,1,1,1,1}};
   if (cout>9) cout=9;
   for (i=0;i<cout;i++)
   {
      temp[i]=num%10;
      num=num/10;
   }
   for (i=0;i<cout;i++)
   {
      for (times=0;times<15;times++)
      {
         line=times/3;
         rol=times%3;
         r_draw(xp+i*4+rol,yp+line,(number[temp[cout-1-i]][times]?RGB(30,30,30):RGB(24,15,13)),0);
      }
   }
   return;
}
void fang_chang_color(u8 ctp,u8 stat[20][11])//更变艵方案
{
   int i,j;
   rb_co=fang_game_color[ctp][0];
   rb_bg=fang_game_color[ctp][1];
   for (i=0;i<20;i++)
   for (j=0;j<10;j++)

⌨️ 快捷键说明

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