俄罗斯方块消除满格问题,消除一行后出了问题

动感地带世界风 2014-05-04 11:34:58
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define S1 60 //初始位置(S1,S1)
#define S2 20 //单位大小
#define M 18 //宽度多少单位
#define N 23 //高度多少单位
#define Width 600
#define Henght 700
IMAGE img,img1,img2,img3,img4,img5,img6,img7,img8,img9,img10,img11;
int b,f,p,q,q2,number,count1,count2,count3,c[5],d[5],cc[5],dd[5];
int Time=15;
int number2=0;
int count4=0;
int get=0;


struct Barrier
{
int x;
int y;
IMAGE z;
}barrier[M+1][N+1],barrier2[M+1][N+1],coor1;
typedef struct Barrier coor;

//顺时针旋转90度函数

coor rotate(int x,int y,int x0,int y0)
{
int x1,y1;
x1=y0-y+x0;
y1=x-x0+y0;
coor1.x=x1;
coor1.y=y1;
return coor1;
}
void rotate2()
{
for (b=0;b<4;b++)
{
c[b]=c[b]+S2*1/2;d[b]=d[b]+S2*1/2;
rotate(c[b],d[b],c[4],d[4]);
c[b]=coor1.x-S2*1/2;
d[b]=coor1.y-S2*1/2;
}
}

//左移右移函数
void Move(int i)
{
for (b=0;b<5;b++)
c[b]=c[b]+S2*i;
}
//恢复变换前坐标的函数
void Restore()
{
for (b=0;b<5;b++)
{
c[b]=cc[b];
d[b]=dd[b];
}
}
//判断旋转或左移或右移后是否重叠
void room()
{
count2=0;
for (b=0;b<4;b++)
for (f=0;f<2;f++)
{
p=c[b];q=d[b]-(d[b]-S1)%S2+S2*f;
if (barrier[(p-S1)/S2][(q-S1)/S2].x==p && barrier[(p-S1)/S2][(q-S1)/S2].y==q)
count2++;
}
if (count2!=0)
count1--;
}

//初始化图形函数

void Ding()
{
c[0]=S1+9*S2; d[0]=S1+S2;
c[1]=c[0]; d[1]=d[0]+S2;
c[2]=c[1]; d[2]=d[1]+S2;
c[3]=c[1]+S2; d[3]=d[1];
c[4]=c[1]+(1.0/2)*S2;d[4]=d[1]+(1.0/2)*S2;
}
void RightL()
{
c[0]=S1+9*S2; d[0]=S1+S2;
c[1]=c[0]+S2; d[1]=d[0];
c[2]=c[1]; d[2]=d[1]+S2;
c[3]=c[1]; d[3]=d[2]+S2;
c[4]=c[0]+S2*1.0/2;d[4]=d[0]+(3.0/2)*S2;
}
void LeftL()
{
c[0]=S1+8*S2; d[0]=S1+S2;
c[1]=c[0]; d[1]=d[0]+S2;
c[2]=c[0]; d[2]=d[1]+S2;
c[3]=c[0]+S2; d[3]=d[0];
c[4]=c[0]+(3.0/2)*S2;d[4]=d[0]+(3.0/2)*S2;
}
void LeftZ()
{
c[0]=S1+10*S2; d[0]=S1+S2;
c[1]=c[0]; d[1]=d[0]+S2;
c[2]=c[0]-S2; d[2]=d[1];
c[3]=c[2]; d[3]=d[2]+S2;
c[4]=c[2]+(1.0/2)*S2;d[4]=d[2]+(1.0/2)*S2;
}
void RightZ()
{
c[0]=S1+8*S2; d[0]=S1+S2;
c[1]=c[0]; d[1]=d[0]+S2;
c[2]=c[1]+S2; d[2]=d[1];
c[3]=c[2]; d[3]=d[2]+S2;
c[4]=c[2]+(1.0/2)*S2;d[4]=d[2]+(1.0/2)*S2;
}
void Square()
{
c[0]=S1+8*S2; d[0]=S1+S2;
c[1]=c[0]+S2; d[1]=d[0];
c[2]=c[0]; d[2]=d[0]+S2;
c[3]=c[1]; d[3]=d[2];
}
void Yi()
{
c[0]=S1+7*S2;d[0]=S1+S2;
c[1]=c[0]+S2;d[1]=d[0];
c[2]=c[1]+S2;d[2]=d[1];
c[3]=c[2]+S2;d[3]=d[2];

}

//画边框

void Region()
{
IMAGE img1;
IMAGE img2;
initgraph(Width,Henght);
setbkcolor(GREEN);
cleardevice();
loadimage(&img3,"D:\\C共享\\俄罗斯方块\\images\\GameRegionRim2.jpg");
putimage(S1,S1,&img3);
getimage(&img3,S1,S1,S2,S2);
loadimage(&img4,"D:\\C共享\\俄罗斯方块\\images\\square_blue.jpg");
putimage(S1,S1,&img4);
getimage(&img4,S1,S1,S2,S2);
loadimage(&img5,"D:\\C共享\\俄罗斯方块\\images\\square_darkBlue.jpg");
putimage(S1,S1,&img5);
getimage(&img5,S1,S1,S2,S2);
loadimage(&img6,"D:\\C共享\\俄罗斯方块\\images\\square_green.jpg");
putimage(S1,S1,&img6);
getimage(&img6,S1,S1,S2,S2);
loadimage(&img7,"D:\\C共享\\俄罗斯方块\\images\\square_orange.jpg");
putimage(S1,S1,&img7);
getimage(&img7,S1,S1,S2,S2);
loadimage(&img8,"D:\\C共享\\俄罗斯方块\\images\\square_purple.jpg");
putimage(S1,S1,&img8);
getimage(&img8,S1,S1,S2,S2);
loadimage(&img9,"D:\\C共享\\俄罗斯方块\\images\\square_red.jpg");
putimage(S1,S1,&img9);
getimage(&img9,S1,S1,S2,S2);
loadimage(&img10,"D:\\C共享\\俄罗斯方块\\images\\square_yellow.jpg");
putimage(S1,S1,&img10);
getimage(&img10,S1,S1,S2,S2);
loadimage(&img2,"E:\\Image\\c.jpg",Width,Henght);
putimage(0,0,&img2);
getimage(&img,S1+S2,S1+S2,(M-1)*S2,(N-1)*S2);

for (p=S1;p<S1+M*S2+1;p+=S2)
{
q=S1;
putimage(p,q,&img3);
barrier[(p-S1)/S2][(q-S1)/S2].x=p;
barrier[(p-S1)/S2][(q-S1)/S2].y=q;
q=S1+N*S2;
putimage(p,q,&img3);
barrier[(p-S1)/S2][(q-S1)/S2].x=p;
barrier[(p-S1)/S2][(q-S1)/S2].y=q;

}
for (q=S1;q<S1+N*S2+1;q+=S2)
{
p=S1;
putimage(p,q,&img3);
barrier[(p-S1)/S2][(q-S1)/S2].x=p;
barrier[(p-S1)/S2][(q-S1)/S2].y=q;
p=S1+M*S2;
putimage(p,q,&img3);
barrier[(p-S1)/S2][(q-S1)/S2].x=p;
barrier[(p-S1)/S2][(q-S1)/S2].y=q;
}
settextstyle(25, 0, _T("宋体"));
outtextxy(20,600,_T(" Ver 1.0 Your Score : Made By Yao"));

}

void RandNumber()
{
number=(int)(rand()%7+4);
}


void Action()
{
int a;
char e;
for (;;)
{
count1=0;
getimage(&img1,S1+S2,S1+S2,(M-1)*S2,(N-1)*S2);
BeginBatchDraw();
RandNumber();
if (number==4)
{img11=img4; Yi();}
else if (number==5)
{img11=img5; LeftZ(); }
else if (number==6)
{img11=img6; Ding(); }
else if (number==7)
{img11=img7; RightZ(); }
else if (number==8)
{img11=img8; Square();}
else if (number==9)
{img11=img9; LeftL();}
else
{img11=img10; RightL(); }

for (a=0;;a++)
{
for (b=0;b<4;b++)
putimage(c[b],d[b],&img11);
if (kbhit())
{
e=getch();
if (isascii(e))
goto loop;
else
loop: e=getch();
switch(e)
{
case 72:
{
if (number==8)
goto loop2;
if (number==4)
{
count1++;
if (count1%2==1)
{
c[0]=c[0]+S2;d[0]=d[0]-S2;
c[1]=c[1];d[1]=d[1];
c[2]=c[2]-S2;d[2]=d[2]+S2;
c[3]=c[3]-2*S2;d[3]=d[3]+2*S2;
}
if (count1%2==0)
{
c[0]=c[0]-S2;d[0]=d[0]+S2;
c[1]=c[1];d[1]=d[1];
c[2]=c[2]+S2;d[2]=d[2]-S2;
c[3]=c[3]+2*S2;d[3]=d[3]-2*S2;
}

}
else
rotate2();
room();
if (count2!=0)
Restore();
break;
}
case 75:
{
Move(-1);
room();
if (count2!=0)
Restore();
break;
}
case 77:
{
Move(1);
room();
if (count2!=0)
Restore();
break;
}
case 80:
number2=20;
break;
}

}
//判断是否碰到下面的障碍物:
if ((S2+a)%S2==0)
{
count2=0;
for (b=0;b<4;b++)
{
p=c[b];q=d[b]+S2;
if (barrier[(p-S1)/S2][(q-S1)/S2].x==p && barrier[(p-S1)/S2][(q-S1)/S2].y==q)
{
for (f=0;f<4;f++)
{
p=c[f];q=d[f];
barrier[(p-S1)/S2][(q-S1)/S2].x=p;
barrier[(p-S1)/S2][(q-S1)/S2].y=q;
barrier[(p-S1)/S2][(q-S1)/S2].z=img11;
}
count2++;
break;
}

}
if (count2!=0)
break;
}
loop2: for (b=0;b<5;b++)
{
d[b]=d[b]+1;//
cc[b]=c[b];// 切记 : 三者顺序不能颠倒
dd[b]=d[b];//

}
FlushBatchDraw();
if (number2>0)
goto loop3;
else
Sleep(Time);
loop3: number2--;
putimage(S1+S2,S1+S2,&img1);
}
EndBatchDraw();

//判断某一行是否填满

for (q=1;q<N;q++)
{
count3=0;
for (p=1;p<M;p++)
if (barrier[p][q].x==S1+p*S2 && barrier[p][q].y==S1+q*S2)
count3++;
if (count3==M-1)
break;
}
if (count3==M-1)
{
get=q-1; //用来接收哪一行满了
count4++;
putimage(S1+S2,S1+S2,&img);
for (p=1;p<M;p++)
for (q=1;q<get;q++)
if (barrier[p][q].x==S1+p*S2 && barrier[p][q].y==S1+q*S2)
{
barrier2[p][q+1].x=S1+p*S2;
barrier2[p][q+1].y=S1+(q+1)*S2;
barrier2[p][q+1].z=barrier[p][q].z;
barrier[p][q].x=0;
barrier[p][q].y=0;
}
//擦除填满的一行
for (p=1;p<M;p++)
{
barrier[p][get].x=0;
barrier[p][get].x=0;
}

for (p=1;p<M;p++)
for (q=1;q<get+1;q++)
if (barrier2[p][q].x==S1+p*S2 && barrier2[p][q].y==S1+q*S2)
{
barrier[p][q].x=barrier2[p][q].x;
barrier[p][q].y=barrier2[p][q].y;
barrier[p][q].z=barrier2[p][q].z;
}
for (p=1;p<M;p++)
for (q=1;q<N;q++)
putimage(barrier[p][q].x,barrier[p][q].y,&barrier[p][q].z);
}
}
}




void main()
{
srand((unsigned)time(NULL));
Region();
Action();
getch();
}
...全文
228 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-05-05
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试是程序员必须掌握的技能之一。
  • 打赏
  • 举报
回复
问题被我找出来了
  • 打赏
  • 举报
回复
vc,一年不到
没事人 2014-05-05
  • 打赏
  • 举报
回复
楼主接触c几年了很好奇
  • 打赏
  • 举报
回复
我找出来了get=q,而不是q-1,但是除了这个错,还有错存在;
c_tianzi 2014-05-05
  • 打赏
  • 举报
回复
你用的Turbo C吗
  • 打赏
  • 举报
回复
想了好长时间,不知原因在哪,求大神指教,
  • 打赏
  • 举报
回复
我觉得没有错 barrier数组明明有些方块的

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧