}
int tmpx=(int)x;
if(tmpx > 19||tmpx < 0) break; }
if(BLOCK[(int)y][(int)x]==1) //判断是否发生冲突 { }
break;
}
if(i < 4)
return 1; return 0;
/*
关键部分在这里,主要是要判断方块下一次的移动是否合法, 本程序通过对b数组所存储的下标是否在BLOCK数组中已经为1 来判断,这样,只需要在BLOCK的最外层加一圈1,就不用通过 原来的方式来判断方块是否越界 */
void key(unsigned char k,int x,int y) {
int i,ret;
if(over == false) { if(k==UP)//此处需要改成调用变换图形样式的函数
{
Change(); } else if(k==DOWN)//后续还要修改,移动到底部过了一段时间之后就不能左右移动了
{
for(i=0;i<4;i++)//需继续添加以1和-1作为哨兵 { }
curLoc[i][1]-=0.1f;
ret=CheckConflict();
if(ret == 1)//发生冲突,则将修改复原 { }
for(i=0;i<4;i++) curLoc[i][1]+=0.1f;
over=true;//并且可以生成下一个方块了
}
else if(k==RIGHT) {
}
} { }
for(i=0;i<4;i++)
curLoc[i][0]+=0.1f; ret=CheckConflict(1);
if(ret == 1)//发生冲突,则将修改复原 { }
for(i=0;i<4;i++)
curLoc[i][0]-=0.1f;
else if(k==LEFT)
for(i=0;i<4;i++)
curLoc[i][0]-=0.1f; ret=CheckConflict(1);
if(ret == 1)//发生冲突,则将修改复原 { }
for(i=0;i<4;i++) curLoc[i][0]+=0.1f;
if(over==true) CheckDelete();
glutPostRedisplay();//调用这个函数可以重新绘图,每次相应消息之后,所有全部重绘
} /*
让方块定时下降 */
void down(int id) { int i,ret;
if(over!=true) { for(i=0;i<4;i++)//需继续添加以1和-1作为哨兵 {
}
curLoc[i][1]-=0.1f;
ret=CheckConflict();
if(ret == 1)//发生冲突,则将修改复原 {
for(i=0;i<4;i++)
curLoc[i][1]+=0.1f;
if(curLoc[0][1] >= b[currentBlock][0][1]) { cout<<\
}
}
exit(1);
}
over=true;//并且可以生成下一个方块了
if(over==true) CheckDelete(); glutPostRedisplay();
glutTimerFunc(1000,down,1); }
//作图函数,要修改,利用BLOCK数组绘图 void myDisplay1() {
int i,j;
glClear(GL_COLOR_BUFFER_BIT); //不能使用深度测试,否则画出来的图形很乱
for(i=0;i<20;i++) {
for(j=0;j<20;j++) { }
if(BLOCK[i][j]==1) { }
glColor3f(0.0f,1.0f,0.0f);
//用蓝色画图
glRectf(j/10.0f-1.0f,i/10.0f-1.0f,j/10.0f-1.0f+0.1f,i/10.0f-1.0f+0.1f); glLineWidth(2.0f);
glBegin(GL_LINE_LOOP); glColor3f(0.0f,0.0f,0.0f);
glVertex2f(j/10.0f-1.0f,i/10.0f-1.0f);
glVertex2f(j/10.0f-1.0f+0.1f,i/10.0f-1.0f);
glVertex2f(j/10.0f-1.0f+0.1f,i/10.0f-1.0f+0.1f); glVertex2f(j/10.0f-1.0f,i/10.0f-1.0f+0.1f); glEnd(); glFlush();
}
if(over == false) {
for(i=0;i<4;i++) { glColor3f(0.0f,1.0f,0.0f);
glLineWidth(2.0f);
glBegin(GL_LINE_LOOP); glColor3f(0.0f,0.0f,0.0f);
//用蓝色画图
glRectf(curLoc[i][0],curLoc[i][1],curLoc[i][0]+0.1f,curLoc[i][1]+0.1f);
}
}
glVertex2f(curLoc[i][0],curLoc[i][1]);
glVertex2f(curLoc[i][0]+0.1f,curLoc[i][1]);
glVertex2f(curLoc[i][0]+0.1f,curLoc[i][1]+0.1f); glVertex2f(curLoc[i][0],curLoc[i][1]+0.1f); glEnd(); glFlush();
}
glutSwapBuffers();
/*
* 随机生成方块,原理即生成一个7以内的随机数, * 对应的二维数组即为下一个产生的方块 */
void CreateBlocks() {
int i,j;
myDisplay1(); if(over) {
srand(time(NULL));
currentBlock=rand()%7; for(i=0;i<7;i++) //关键之处,每次创建一个新的方块后要将变形的记录
turn[i]=0;
清空 }
}
for(i=0;i<4;i++) for(j=0;j<2;j++)
{ }
curLoc[i][j]=b[currentBlock][i][j];
over=false;
glutPostRedisplay();
void main(int argc ,char **argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE); glutInitWindowPosition(400,100); glutInitWindowSize(600,600);
InitBLOCK();
glutCreateWindow(\俄罗斯方块 author:parkfang\glutDisplayFunc(&CreateBlocks); glutTimerFunc(1000,down,1);
}
glutKeyboardFunc(key);
glClearColor(1.0f,1.0f,1.0f,1.0f);//用白色清除屏幕 glutMainLoop();