📄 002.cpp
字号:
#include<iostream>
#include <stdlib.h>
#include<time.h>
#include<windows.h>
#include <conio.h>
using namespace std;
int change();
typedef struct shape /*形状单一状态的记录*/
{
int co[8];
}shape;
typedef struct point /*点的坐标*/
{
int i;//纵坐标
int j;//横坐标
}point;
shape ps[19]={{0,1,1,0,1,1,2,1 },
{0,1,1,0,1,1,1,2 },
{0,0,1,0,2,0,1,1 },
{0,0,0,1,1,1,0,2 },
{0,0,1,0,2,0,3,0 },
{0,0,0,1,0,2,0,3 },
{0,0,0,1,1,0,1,1 },
{0,0,1,0,1,1,2,1 },
{1,0,0,1,1,1,0,2 },
{1,0,2,0,1,1,0,1 },
{0,0,0,1,1,1,1,2 },
{0,0,0,1,0,2,1,2 },
{2,0,0,1,1,1,2,1 },
{0,0,1,0,1,1,1,2 },
{0,0,0,1,1,0,2,0 },
{0,2,1,0,1,1,1,2 },
{0,0,1,0,2,0,2,1 },
{1,0,0,0,0,1,0,2 },
{0,0,0,1,1,1,2,1 },
};
int back[21][15] = {0}; //背景
int score = 0;
int check_change(point p,shape s)//判断右边是否越界
{
if(back[s.co[0]+ p.i][s.co[1]+p.j]==1 || back[s.co[2]+ p.i][s.co[3]+p.j ] == 1 || back[s.co[4]+ p.i][s.co[5]+p.j ]==1 || back[s.co[6]+ p.i][s.co[7]+p.j]==1)
{
return 0;
}
else return 1;
}
void show(point p, shape s1,shape s2)//显示方块
{
for(int i = 0; i <= 20; cout<<endl,i++)
{
for(int j = 0; j <= 14;j++)
{
if (s1.co[0]+p.i == i && s1.co[1]+p.j == j)
cout<<"■";
else if (s1.co[2]+p.i == i && s1.co[3]+p.j == j)
cout<<"■";
else if (s1.co[4]+p.i == i && s1.co[5]+p.j == j)
cout<<"■";
else if (s1.co[6]+p.i == i && s1.co[7]+p.j == j)
cout<<"■";
else if (back[i][j] == 1 )
cout<<"■";
else
cout<<" ";
}
if(i==3)
for(int j1 = 0; j1 <= 3;j1++)
{
if (s2.co[0]+i == i && s2.co[1] +1== j1)
cout<<"■";
else if (s2.co[2]+i == i && s2.co[3] +1== j1)
cout<<"■";
else if (s2.co[4] +i== i && s2.co[5] +1== j1)
cout<<"■";
else if (s2.co[6]+i == i && s2.co[7] +1== j1)
cout<<"■";
// else if (back[i][j] == 1 )
// cout<<"■ ";
else
cout<<" ";
}
}
cout<<endl<<" 分数:"<<score<<endl;
}
void update(point p, shape s)//更新
{
int i,j, count = 0;
for(i = 0; i <= 19;i++)
for(j = 1; j <= 13;j++)
{
if (s.co[0]+ p.i == i && s.co[1]+ p.j == j)
back[i][j] = 1;
else if (s.co[2]+ p.i == i && s.co[3]+p.j == j)
back[i][j] = 1;
else if (s.co[4]+p.i == i && s.co[5]+ p.j == j)
back[i][j] = 1;
else if (s.co[6]+ p.i == i && s.co[7]+ p.j == j)
back[i][j] = 1;
}
for(i = 0;i <= 19; i++) //消行
{
int flag = 1;
for(j = 1; j <=13; j++)
{
if(back[i][j] != 1)
{
flag = 0;
break;
}
}
if(flag == 1)
{
int k = i;
for(k=i;k>= 1;k--)
{
for(j=1;j<=13;j++)
back[k][j] = back[k-1][j];
}
count++;
}
}
if(count == 1)
score += 1;
else if(count == 2)
score += 3;
else if(count == 3)
score += 5;
else if(count == 4)
score += 10;
for(j = 1; j <=13; j++)
if(back[0][j] == 1)
{
cout<<"Game over!\n";
exit(0);
}
}
int check_buttom(point p, shape s)
{
if(back[s.co[0]+ p.i +1][s.co[1]+p.j]==1 ||back[s.co[2]+ p.i +1][s.co[3]+p.j] == 1
||back[s.co[4]+ p.i +1][s.co[5]+p.j]==1 ||back[s.co[6]+ p.i +1][s.co[7]+p.j]==1 )
{
return 0;//如果到底返回0
}
else return 1;//没有到底返回1
}
void move()
{
point p = {-2, 4};
int t1,t2;
t1 = rand()%19;
t2 = rand()%19;
while(1)
{
for(int i = 1; i <= 30; i++)
{
if(_kbhit())//_kbhit()判断是否有键盘消息
{
switch(_getch())//接收数据
{
case 0x50: // ↓向下移动
if(check_buttom(p, ps[t1]))
{
p.i++;
system("cls");
show(p,ps[t1],ps[t2]);
}
break;
case 0x4B: // ←向左移动
if(back[ps[t1].co[0]+ p.i][ps[t1].co[1]+p.j - 1] == 0 && back[ps[t1].co[2]+ p.i][ps[t1].co[3]+p.j - 1] == 0
&& back[ps[t1].co[4]+ p.i][ps[t1].co[5]+p.j - 1] == 0 && back[ps[t1].co[6]+ p.i][ps[t1].co[7]+p.j - 1] == 0)
{
p.j--;
system("cls");
show(p,ps[t1],ps[t2]);
}
break;
case 0x4d: // →向右移动
if(back[ps[t1].co[0]+ p.i][ps[t1].co[1]+p.j + 1]==0 && back[ps[t1].co[2]+ p.i][ps[t1].co[3]+p.j + 1] == 0
&& back[ps[t1].co[4]+ p.i][ps[t1].co[5]+p.j + 1]==0 && back[ps[t1].co[6]+ p.i][ps[t1].co[7]+p.j + 1]==0)
{
p.j++;
system("cls");
show(p,ps[t1],ps[t2]);
}
break;
case 0x48:// ↑变换形状
if(t1 == 3&&check_change( p, ps[0])) t1 = 0;
else if(t1 == 5&&check_change( p, ps[4])) t1 = 4;
else if(t1 == 6) t1 = 6;
else if(t1 == 8&&check_change(p, ps[7])) t1 = 7;
else if(t1 == 10&&check_change( p, ps[9])) t1 = 9;
else if(t1 == 14&&check_change(p, ps[11])) t1 = 11;
else if(t1 == 18&&check_change( p, ps[15])) t1 = 15;
else if(check_change( p, ps[t1+1])) t1++;
break;
case 32: //空格 直接降到底端
while(check_buttom(p, ps[t1]))
{
p.i++;
}
default:
break;
}
}
}
if(check_buttom(p, ps[t1]))
{
system("cls");
p.i++;
show(p, ps[t1],ps[t2]);
}
else
{
update(p, ps[t1]);
t1 = t2;
t2 = rand()%19;
p.i = -2;
p.j = 4;
}
Sleep(500);
}
}
void nint()//画方框
{
int i, j;
for(j=0;j<=14;j++)//画底部的边
back[20][j]=1;
for(i=0;i<=19;i++)//画左面的边
back[i][0]=1;
for(i=0;i<=19;i++)//画右面的边
back[i][14]=1;
}
int main()
{
srand(time(NULL));
nint();
move();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -