64,666
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
#include <windows.h>
#include <conio.h>
#include <time.h>
static int px[7][4][4]={{{-1,0,-1,0},{-1,0,-1,0},{-1,0,-1,0},{-1,0,-1,0}},
{{0,0,0,0},{1,0,-1,2},{0,0,0,0},{1,0,-1,2}},
{{-1,0,-1,0},{0,0,-1,1},{-1,0,-1,0},{0,0,-1,1}},
{{1,0,0,1},{0,0,-1,1},{1,0,0,1},{0,0,-1,1}},
{{0,0,-1,0},{1,0,0,2},{0,0,0,1},{1,0,-1,1}},
{{0,0,0,1},{-1,0,-2,0},{0,0,-1,0},{-1,0,-1,1}},
{{0,0,-1,1},{0,0,-1,0},{0,0,-1,1},{0,0,0,1}}};
static int py[7][4][4]={{{-1,0,0,-1},{-1,0,0,-1},{-1,0,0,-1},{-1,0,0,-1}},
{{-3,0,-1,-2},{0,0,0,0},{-3,0,-1,-2},{0,0,0,0}},
{{-2,0-1,-1},{-1,0,0,-1},{-2,0-1,-1},{-1,0,0,-1}},
{{-2,0,-1,-1},{-1,0,-1,0},{-2,0,-1,-1},{-1,0,-1,0}},
{{-2,0,-2,-1},{-1,0,-1,-1},{-2,0,-1,0},{-1,0,0,0}},
{{-2,0,-1,-2},{-1,0,-1,-1},{-2,0,-0,-1},{-1,0,0,0}},
{{-1,0,0,0},{-2,0,-1,-1},{-1,0,-1,-1},{-2,0,-1,-1}}};
int fen=0;
typedef struct node
{
int a[10];
int num;
struct node *next,*parent;
}Node;
Node *head;
void InitNode()
{
Node *p1,*p2;
p1=(Node*)malloc(sizeof(Node));
head=p1;
p1->next=NULL;
p1->parent=NULL;
for(int i=0;i<18;++i)
{
p2=(Node*)malloc(sizeof(Node));
p2->num=0;
for(int j=0;j<10;++j)p2->a[j]=0;
p1->next=p2;
p2->parent=p1;
p1=p2;
}
p1->next=NULL;
for(int j=0;j<10;++j)p1->a[j]=1;
head=head->next->next->next; //头指针上面再留三节点,用于后面判断是否有方块
}
void go(int x,int y) //光标移动
{
COORD point={2*x+2,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
}
void DelNode()
{
Node *p;
for(int i=0;i<15;i++)
{
p=head;
head=head->next;
delete(p);
}
delete(head);
}
int GetNum(int b) //小于b的随机数
{
srand(time(NULL));
int a=rand()%b;
return a;
}
void PrintBox(int x,int y) //显示移动方块
{
if(y<0)return;
go(x,y);
cout<<"■";
}
void ClearBox(int x,int y) //消方块
{
go(x,y);
cout<<" ";
}
void Print() //重新输出起到消行作用
{
Node *p;
system("cls");
p=head->next;
for(int i=0;i<15;++i)
{
cout<<"■";
for(int j=0;j<10;j++)
{
if(p->a[j])cout<<"■";
else cout<<" ";
}
cout<<"■"<<endl;
p=p->next;
}
go(15,4);cout<<"↑ 变形";
go(15,5);cout<<"↓ 加速";
go(15,6);cout<<"← 左移";
go(15,7);cout<<"→ 右移";
go(15,8);cout<<"空格 下降";
go(15,9);cout<<"回车 暂停";
go(15,10);cout<<"得分: "<<fen;
}
bool CheckBox(int a,int b,int c,Node *p) //检查是否有禁止的方块
{
Node *q;
for(int i=0;i<4;i++)
{
switch(py[a][b][i])
{
case 0:q=p;break;
case -1:q=p->parent;break;
case -2:q=p->parent->parent;break;
case -3:q=p->parent->parent->parent;break;
}
if(q->a[px[a][b][i]+c])return true;
}
return false;
}
void Stop(int a,int b,int c,int d) //暂停
{
system("cls");
int boutt;
go(10,5);
cout<<"休息,休息一会";
go(10,6);
cout<<"按回车键继续";
do
{
boutt=getch();
}while(boutt!=13);
Print();
for(int i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
int Check(int a,int b,int c,int d,Node *p) //判断变形时是否有障碍物,并作出处理,成功处理返回真,处理失败返回假
{
int cc=c;
b++;
if(px[a][b][2]+c<0)cc=0-px[a][b][2];
if(px[a][b][3]+c>9)cc=9-px[a][b][3];
if(CheckBox(a,b,cc,p))return 0;
return cc;
}
void Control(int a,int &b,int &c,int d,int &n,Node *p)
{
int boutt,i,cc;
if(kbhit())
{
do
{
boutt=getch();
}while(boutt==224);
}
switch(boutt)
{
case 72:if((cc=Check(a,b,c,d,p))!=0)
{
for(i=0;i<4;i++)
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
b++;
c=cc;
if(b==4)b=0;
for(i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
break;
case 75:if(px[a][b][2]+c>0)
{
if(CheckBox(a,b,c-1,p->next))break;
for(i=0;i<4;i++)
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
c--;
for(i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
break;
case 77:if(px[a][b][3]+c<9)
{
if(CheckBox(a,b,c+1,p->next))break;
for(i=0;i<4;i++)
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
c++;
for(i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
break;
case 80:n=1;break;
case 32:n=0;break;
case 13:Stop(a,b,c,d);break;
}
}
void ClearLine(Node *p) //消行
{
Node *p1,*p2;
p1=p->next;
p2=p->parent;
p2->next=p1;
p1->parent=p2;
p1=head->next;
head->next=p;
p->next=p1;
p1->parent=p;
p->parent=head;
p->num=0;
for(int i=0;i<10;i++)p->a[i]=0;
}
void End(int fen)
{
system("cls");
go(10,5);
cout<<"游戏结束!!!"<<endl;
go(10,6);
cout<<"得分:"<<fen<<endl;
}
void main()
{
Node *p,*q;
InitNode();
int a,b;
Print();
while(1)
{
int n=10;
int c=5;
p=head->next;
a=GetNum(7);
b=GetNum(4);
for(int d=1;d<15;d++)
{
bool bb=0;
if(CheckBox(a,b,c,p->next))bb=1;
if(bb)
{
for(int i=0;i<4;i++)
{
switch(py[a][b][i])
{
case 0:q=p;break;
case -1:q=p->parent;break;
case -2:q=p->parent->parent;break;
case -3:q=p->parent->parent->parent;break;
}
q->a[px[a][b][i]+c]=1;
q->num++;
}
}
for(int i=0;i<4;i++)
{
if(bb)PrintBox(px[a][b][i]+c,py[a][b][i]+d-1);
else PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
if(!bb)
{
for(i=0;i<n;i++)
{
Control(a,b,c,d,n,p);
Sleep(50);
}
for(i=0;i<4;i++)
{
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
}
}
else break;
p=p->next;
}
q=head->next;
for(int i=0,f=0;i<15;++i)
{
if(q->num==10)
{
p=q->next;
ClearLine(q);
f++;
q=p;
}
else q=q->next;
}
fen=fen+(f*f);
if(f)Print();
if(head->num)
{
End(fen);
break;
}
}
DelNode();
}