电子领域吧 关注:55贴子:208
  • 1回复贴,共1

简易版的俄罗斯方块,呃,没有界面

只看楼主收藏回复

#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "windows.h"
#include "time.h"
#define random(x) (rand()%x)
#define N 13
#define M 10
#define K 5
int s[N][M]={{0,0,0,2,2,2},{0,0,0,0,2},{0},{0},{0},{0},{0},{0},{0},{0}, {1},{1,0,0,1},{1,1,1,1,1,1,0,1,1,1}};/*当前状态*/
int a[K][3][3]={{0,2,0,2,2,2},{2,0,0,2,2,2},{2,0,0,2,0,0,2,2},{2,2,2,0,0,2}, {{2},{2},{2}}};
void Disp()
{
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)printf("%c",s[i][j]?48+s[i][j]:' ');
printf("\n");
}
printf("\n\n操作说明:按4左移,按6右移,按2下移\n");
}
void Down()
{
int i,j,k;
for(j=0;j<M;j++)
if(s[N-1][j]==2)break;/*判断是否在下边界*/
if(j<M)/*若方块在下边界则将方块由2变1*/
{
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(s[i][j]==2)s[i][j]=1;
for(i=N-1;i>=0;i--)
{
for(j=0;j<M;j++)
if(s[i][j]==0)break;//判断第i行是否有空格
if(j==M)/*若第i行没空格消去第i行*/
for(k=i++-1;k>=0;k--)
for(j=0;j<M;j++)
s[k+1][j]=s[k][j];
}return;
}
for(i=0;i<N-1;i++)
{
for(j=0;j<M;j++)
if(s[i][j]==2)
if(s[i+1][j]!=0&&s[i+1][j]!=2)break;/*方块下方不空退出内循环*/
if(j<M)break;/*方块下方不空退出外循环*/
}
if(i<N-1||j<M)//若已触到则将方块由2变1
{
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(s[i][j]==2)s[i][j]=1;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(s[i][j]==2)s[i][j]=1;
for(i=N-1;i>=0;i--)
{
for(j=0;j<M;j++)
if(s[i][j]==0)break;//判断第i行是否有空格
if(j==M)/*若第i行没空格消去第i行*/
for(k=i++-1;k>=0;k--)
for(j=0;j<M;j++)s[k+1][j]=s[k][j];
} return;
}
for(i=N-1;i>=0;i--)
for(j=0;j<M;j++)
if(s[i][j]==2)s[i+1][j]=s[i][j],s[i][j]=0;/*方块下移*/
}
void Right()
{
int i,j;
for(i=0;i<N;i++)
if(s[i][M-1]==2)return;/* 已经在右边界退出 */
for(i=0;i<N;i++)
for(j=0;j<M-1;j++)
if(s[i][j]==2)
if(s[i][j+1]!=0&&s[i][j+1]!=2)return;/* 方块右方不空退出 */
for(j=M-2;j>=0;j--)
for(i=0;i<N;i++)
if(s[i][j]==2)s[i][j+1]=s[i][j],s[i][j]=0;/* 方块右移 */
}
void Left()
{
int i,j;
for(i=0;i<N;i++)
if(s[i][0]==2)return;/* 已经在左边界退出 */
for(i=0;i<N;i++)
for(j=1;j<M;j++)
if(s[i][j]==2)
if(s[i][j-1]!=0&&s[i][j-1]!=2)return;/* 方块左方不空退出 */
for(j=1;j<M;j++)
for(i=0;i<N;i++)
if(s[i][j]==2)s[i][j-1]=s[i][j],s[i][j]=0;/* 方块左移 */
}
int Have()/*判断是否有可移动方块,没有返回1,否则返回0*/
{
int i,j;
for(i=0;i<N;i++)
for(j=1;j<M;j++)
if(s[i][j]==2)return 0;
return 1;
}
void Add()/*随机生成方块*/
{
int t=random(K),x=random(M-3);/*生成两随机数t和x分别作为第t种方块和第x位置出现*/
int i,j;
if(x<0)x=-x%(M-3);
for(i=0;i<3;i++)
for(j=x;j<x+3;j++)s[i][j]=a[t][i][j-x];
return;
}
void main()
{
char c='A';
while(1)/*判断是否有按键,没有循环输出i,否则停,conio.h*/
{
if(!kbhit())c='2';
else c=getch();
if(c=='p')getch();
system("CLS");/*清屏,TC用clrscr();,VC用system("CLS");*/
switch(c)
{
case '4':Left();break; /*左移*/
case '6':Right();break; /*右移*/
case '9':case 27: return; /*按9或Esc(=27)另存后退出*/
case '2':; /*下移*/
default:Down();
}
c='2';
if(Have())Add();
Disp();
Sleep(600);/*睡眠600ms,windows.h*/
}
}


1楼2015-03-31 11:26回复
    一楼最好没有代码。
    有没有c4版的?


    IP属地:江苏来自手机贴吧3楼2015-03-31 11:46
    回复