level 7
想用C写出来,不过最后失败了,尝试好久都没能解决。楼下分段暴晒代码,大神多多赐教
2016年01月21日 13点01分
1
level 7
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define H 18
#define W 15
int a[20][20];//空间
char fx;//方向
int type;//掉块类型
int x,y,ax,ay,bx,by,cx,cy;//变形模块
time_t t1,t2,end;
int tn;//时间刻度
int di[W];//底线
void fly();
void turn();
void left();
void right();
void down1();
void downn();
2016年01月21日 13点01分
2
level 7
int main(void)
{
srand(time(NULL));
for (int i=0;i<H;i++)
{
for (int j=0;j<W;j++)
{
a[j][i]=0;
if (i==0)
di[j]=H-2;
}
}
//空间初始化
while (1)
{
start();
fly(x,y);
do
{
switch (fx=getch())
{
case '2':turn();
case '4':left();
case '6':right();
case '8':down1();
}
t2=time(NULL);
end=difftime(t1,t2);
if (end%1==0)
{
down1();
}
clrscr();
draw();
}
while (y==di[x]||ay==di[ax]||by==di[bx]||cy==di[cx]);
a[x][y]=1;a[ax][ay]=1;a[bx][by]=1;a[cx][cy]=1;
}
}
2016年01月21日 13点01分
6
主函数弄了一部分
2016年01月21日 13点01分
level 7
void fly(x,y)
{
switch (type)
{
case 0:{ax=x;ay=by=y+1;bx=cx=x-1;cy=y;}
//方块
case 1:{ax=bx=x;cx=x+1;ay=y-1;cy=y;by=y+1;}
//卜型
case 2:{ay=by=y;cy=y-1;ax=x-1;bx=x+1;cx=x;}
//山型
case 3:{ax=x-1;bx=cx=x;ay=y;by=y+1;}
//
case 4:{ax=bx=cx=x+1;ay=y+1;by=y;cy=y-1;}
//T型
case 5:{ax=x-1;bx=x-2;cx=x-3;ay=by=cy=y;}
case 6:{ax=bx=cx=x;ay=y-1;by=y-2;cy=y-3;}
//长条
case 9:{ax=x;bx=x-1;cx=x-2;ay=by=cy=y-1;}
case 10:{ax=bx=cx=x-1;ay=y;by=y+1;cy=y+2;}
case 11:{ax=x;bx=x+1;cx=x+2;ay=by=cy=y+1;}
case 12:{ax=bx=cx=x+1;ay=y;by=y-1;cy=y-2;}
//L型
case 7:{ax=bx=x-1;cx=x;ay=y;by=y-1;cy=y+1;}
case 8:{ax=x-1;bx=x;cx=x+1;ay=y;by=cy=y-1;}
case 13:{ax=x-1;bx=x;cx=x+1;ay=by=y-1;cy=y;}
case 14:{ax=bx=x+1;cx=x;ay=y-1;by=y;cy=y+1;}
}
//Z型
}
2016年01月21日 13点01分
7
由 x,y 和类型 type 求其他小块坐标
2016年01月21日 13点01分
level 13
class baseBlock{};
class block0:public baseBlock{};
class block1:public baseBlock{};
然后维护一个基类表
std::list<baseBlock*>bls;
然后利用Random随机生成方块
维护一个pixel[][] Map,每次方块到底时检查满足消除条件的行并消除
2016年01月21日 23点01分
9
其实也不需要基类表
2016年01月21日 23点01分
@李登淳 不用类跟'Std能行嘛?前阵子看过一推箱子程序就没有用那些。主程序如何实现边随时间下降边操作的功能?
2016年01月22日 01点01分
@辛乡行者 当然可以,但是class管理起来比较省心,std可以节省时间精力。主程序用一个死循环+delay+getch
2016年01月22日 01点01分
level 7
void left()
{
//if (x==1||ax==1||bx==1||cx==1)
x--;
}
int main()
{
int x=7,y=-2;
three(x,y);
while (1)
{
usleep(2000000);
clrscr();
a[x][y]=0;a[ax][ay]=0;
a[bx][by]=0;a[cx][cy]=0;
fx=getch();
switch (fx)
{
case '4':
left();
break;
case '6':
x++;
break;
}
2016年01月23日 13点01分
11
输入6没问题,4后面直接用x--可以,换函数就不行
2016年01月23日 13点01分
全局x才行
![[黑线]](/static/emoticons/u9ed1u7ebf.png)
你这个x是局部变量
2016年01月23日 23点01分
level 7
由于函数调用问题未解决,弃用switch内嵌套函数,直接用复合语句
2016年01月23日 20点01分
12
level 7
/*下降函数:之前设置了到底数组di[W],感觉不太好用。这次判断每个小块下面一格的值,如果是1,跳出循环。*/
int enddown()
{
if (y == 13 || ay == 13 || by == 13 || cy == 13)
return 1;
else if (a[x][y + 1] == 1 && (ax != x || ay != y + 1) && (bx != x || by != y + 1)
&& (cx != x || cy != y + 1))
return 1;
else if (a[ax][ay + 1] == 1 && (x != ax || y != ay + 1) && (bx != ax || by != ay + 1)
&& (cx != ax || cy != ay + 1))
return 1;
else if (a[bx][by + 1] == 1 && (x != bx || y != by + 1) && (ax != bx || ay != by + 1)
&& (cx != bx || cy != by + 1))
return 1;
else if (a[cx][cy + 1] == 1 && (x != cx || y != cy + 1) && (ax != cx || ay != cy + 1)
&& (bx != cx || by != cy + 1))
return 1;
else
return 0;
}
2016年01月24日 16点01分
16