俄罗斯方块如何添加变形功能

jmck99 2010-12-28 08:18:30
#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*/
}
}

这是我写的代码,但是变形功能写不出来,请高手试试
...全文
161 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
吴明治 2010-12-28
  • 打赏
  • 举报
回复
每种方块用编号1,2,3这样标记下来 1的每种方向用(1,1)(1,2)这样的记下来 每种方块的每种方块都取出来就行了

65,210

社区成员

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

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