回复 91楼 九转星河
可以了~自己用数组在一定数量里面做了一个~可以用链表优化~~~因为这是部分游戏代码就不发不完整的了~加上游戏背景这个特效用了100行左右~~
PS:已经用链表优化成功~
[此贴子已经被作者于2017-5-16 03:42编辑过]

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
程序代码:
void Del_Clum(PClum* p)
{
PClum pt=(*p)->prior;
pt->next=(*p)->next;
if ((*p)->next!=NULL)
(*p)->next->prior=pt;
Free_Node((void** )p);
}
void Link_Clum(PClum p1,PClum p2)
{
if (p1==NULL||p2==NULL)
return ;
p1->next=p2;
p2->prior=p1;
}
void Show_Init_Map() //初始特效设计
{
COLORREF re_linecolor=getlinecolor();
COLORREF bgcolor=TRANSPARENT;
Game_Start=false;
int widht=(BOX2_WIDTH)/(MAP_SIZE); //Main盒子的宽
int height=(BOX2_HEIGHT)/(MAP_SIZE); //Main盒子的高
int i=0;
int j=0;
int t=0;
int show_Map[(BOX2_WIDTH)/(MAP_SIZE)*(BOX2_HEIGHT)/(MAP_SIZE)]={0};
int temp_Map[(BOX2_WIDTH)/(MAP_SIZE)*(BOX2_HEIGHT)/(MAP_SIZE)]={0};
int show_Map2[(BOX2_WIDTH)/(MAP_SIZE)*(BOX2_HEIGHT)/(MAP_SIZE)]={0}; //记录数据纵坐标
Map_Data show[(BOX2_WIDTH)/(MAP_SIZE)*(BOX2_HEIGHT)/(MAP_SIZE)]={0};
PClum head=NULL; //头节点
PClum end=NULL; //尾节点
for (i=0;i<widht*height;++i)
temp_Map[i]=i;
for (i=0,t=widht*height;i<widht*height;i++,t--) //生成方块数量的随机数
{
int s=rand()%t;
show_Map[i]=temp_Map[s];
show_Map[i]%=widht;
for (j=s;j<t-1;++j)
temp_Map[j]=temp_Map[j+1];
}
setlinecolor(bgcolor);
Creat_Node((void** )&head,sizeof(Clum)); //创建头节点
Creat_Node((void** )&end,sizeof(Clum)); //创建尾节点
Link_Clum(head,end);
for (t=0;t<widht*height;++t) //初始化方块数据
{
show[t].color=Map[widht-show_Map2[show_Map[t]]++-1][show_Map[t]].color; //获取初始化方块颜色
show[t].x=show_Map[t]; //获取方块下落的横坐标
}
memset(show_Map2,0,sizeof(show_Map2)); //重置数组
for (t=0;t<widht*height;++t)
{
PClum pclum=end->prior;
PClum pt=NULL;
PClum ps=head;
Creat_Node((void** )&pt,sizeof(Clum));
pt->map_data=show[t];
Link_Clum(pclum,pt); //链接两个节点
Link_Clum(pt,end);
BeginBatchDraw();
while ((ps=ps->next)&&(ps!=end))
{
int left=Box_Main.point.left+ps->map_data.x*MAP_SIZE; //获取方块的顶点信息
int top=Box_Main.point.top+ps->map_data.y*MAP_SIZE;
int right=left+MAP_SIZE;
int bottom=top+MAP_SIZE;
if (ps->map_data.y>0)
{
setfillcolor(bgcolor);
fillrectangle(left,top-MAP_SIZE,right,bottom-MAP_SIZE);
}
setfillcolor(ps->map_data.color); //设置方块颜色
fillrectangle(left,top,right,bottom); //填充方块颜色
Draw_Line_Rectangle //绘制边框信息
(
Box_Main.point.left,
Box_Main.point.top,
Box_Main.point.left+Box_Main.width,
Box_Main.point.top+Box_Main.height,
Box_Main.color.line_color,
bgcolor
);
if (ps->map_data.y<widht-show_Map2[ps->map_data.x]-1)
++ps->map_data.y;
else
{
show_Map2[ps->map_data.x]++;
PClum pt=ps->prior;
Del_Clum(&ps);
ps=pt;
}
}
EndBatchDraw(); //结束批量绘图
Sleep(FALL_TIME); //缓冲时间
}
Free_Node((void** )&head); //释放头节点
Free_Node((void** )&end); //释放尾节点
Data.timer.TIME_START=clock(); //游戏时间重新开始
FlushMouseMsgBuffer(); //清理鼠标缓冲区
}
[此贴子已经被作者于2017-5-16 03:53编辑过]

程序代码:int main()
{
int a[3][3]={{10,20,30},{40,50,60},{70,80,90}};
char b[3][3]={{'a','b','c'},{'d','e','f'},{'h','i','j'}};
void* (*p[2])[3]={0};
int i=0;
int j=0;
(int (*)[3])p[0]=(int (*)[3])a;
(char (*)[3])p[1]=(char (*)[3])b;
for (i=0;i<sizeof(**p)/sizeof(*p);++i)
for (j=0;j<sizeof(**p)/sizeof(***p);++j)
printf("%-4d%-4c\n",((int (*)[3])p[0])[j][i],((char (*)[3])p[1])[j][i]);
return 0;
}[此贴子已经被作者于2017-5-23 16:54编辑过]

程序代码:#include<stdio.h>
int main()
{
int a[][3]={{10,20,30},{40,50,60},{70,80,90}};
char b[][4]={{'a','b','c','d'},{'e','f','g','h'},{'i','j','k','l'},{'m','n','o','p'}};
void* (*p[2])[]={0};
int i=0;
int j=0;
(int (*)[sizeof(*a)/sizeof(**a)])p[0]=(int (*)[sizeof(*a)/sizeof(**a)])a;
(char (*)[sizeof(*b)/sizeof(**b)])p[1]=(char (*)[sizeof(*b)/sizeof(**b)])b;
for (i=0;i<sizeof(a)/sizeof(*a);++i)
for (j=0;j<sizeof(*a)/sizeof(**a);++j)
printf("%-4d",((int (*)[sizeof(*a)/sizeof(**a)])p[0])[j][i]);
puts("");
for (i=0;i<sizeof(b)/sizeof(*b);++i)
for (j=0;j<sizeof(*b)/sizeof(**b);++j)
printf("%-4c",((char (*)[sizeof(*b)/sizeof(**b)])p[1])[j][i]);
puts("");
return 0;
}
