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 + -
显示快捷键?