偶然发现之前的C++小游戏还有一个俄罗斯方块
发出来纪念一下
程序代码:
#include<iostream>
#include<conio.h>
#include<ctime>
#include<cstdlib>
#define N 25
#define M 10
using namespace std;
char Map[N][N],background[N][N]; //地图数组及底板数组
int score,type,type_next,IsChange=1;
double speed;
char dirction; //方向
char block_next[3][3]; //下一个方块
struct Position{int x,y;}; //坐标结构
struct Block{
char block[3][3]; //方块矩阵
char line[3]; //实体方块底边坐标
int left,right,bottom; //矩阵两边及底边坐标
int cnt; //变形样式
int left_boundry,right_boundry;
}one;
void Hello(){ //欢迎界面及地图初始化
cout << "\n\n\t\t\t■■■■■ ■■■■ ■■■■■ ■■■■ ■■■■ ■■■■■ \n";
cout << "\t\t\t ■ ■ ■ ■ ■ ■ ■ \n";
cout << "\t\t\t ■ ■ ■ ■ ■ ■ ■ \n";
cout << "\t\t\t ■ ■■■ ■ ■■■■ ■ ■■■■■ \n";
cout << "\t\t\t ■ ■ ■ ■ ■ ■ ■ \n";
cout << "\t\t\t ■ ■ ■ ■ ■ ■ ■ \n";
cout << "\t\t\t ■ ■■■■ ■ ■ ■■ ■■■■ ■■■■■ \n";
getchar();
score=0;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
Map[i][j]=background[j][i]=' ';
}
}
for(int i=1;i<N;i++) {
Map[i][0]=Map[i][N-1]=Map[N-1][i]='+';
background[i][0]=background[i][N-1]=background[N-1][i]='+';
}
}
void Map_Upate(){ //地图更新
system("cls");
for(int i=0;i<N;i++){
for(int j=0;j<N;j++)
cout<<Map[i][j]<<' ';
if(i==2) cout<<"\t\t 下一个";
if(i==3) cout<<"\t\t* * * * * * * *";
if(i==4){
cout<<"\t\t* ";
for(int w=0;w<=2;w++) cout<<block_next[0][w]<<' ';
cout<<" *";
}
if(i==5){
cout<<"\t\t* ";
for(int w=0;w<=2;w++) cout<<block_next[1][w]<<' ';
cout<<" *";
}
if(i==6){
cout<<"\t\t* ";
for(int w=0;w<=2;w++) cout<<block_next[2][w]<<' ';
cout<<" *";
}
if(i==7) cout<<"\t\t* * * * * * * *";
if(i==11) cout<<"\t Score:"<<score;
if(i==16) cout<<"\t左移:A 右移:D ";
if(i==18) cout<<"\t\t 加速下降:S ";
if(i==20) cout<<"\t\t 旋转:空格";
cout<<endl;
}
}
int Random(){ //随机函数
srand((unsigned)time(0));
return rand()%4+1;
}
void SetBlock(){ //设置方块
speed=500.0; //通用方法
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
one.block[i][j]=' ';
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
Map[j][i]=background[j][i];
}
}
if(Map[2][M-1]=='o'||Map[2][M]=='o'||Map[2][M+1]=='o'){ //初始方块处非空,游戏结束
cout<<"GAME OVER";
exit(-1);
}
//Random();
//特殊方法
one.left=M-1;
one.right=M+1;
one.bottom=2;
onet=0;
one.left_boundry=one.left;
one.right_boundry=one.right;
/******************* T 字型方块 ****************************/
if(type==1){
one.line[0]=one.line[1]=one.line[2]=one.bottom;
for(int i=0;i<=2;i++) one.block[2][i]='o';
one.block[1][1]='o';
}
/********************* 正方形方块 ***************************/
if(type==2){
one.line[0]=one.line[1]=one.line[2]=one.bottom;
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++) one.block[i][j]='o';
}
/*********************** L 型方块 **************************/
if(type==3){
one.line[0]=one.line[1]=one.bottom;
one.line[2]=-1;
for(int i=0;i<=2;i++) one.block[i][0]='o';
one.block[2][1]='o';
}
/********************** 一字型型方块 ************************/
if(type==4){
one.line[0]=one.line[1]=one.line[2]=one.bottom-1;
for(int i=0;i<=2;i++) one.block[1][i]='o';
}
}
void NextBlock(){ //下一个方块
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
block_next[i][j]=' ';
if(type_next==1){
for(int i=0;i<=2;i++) block_next[2][i]='o';
block_next[1][1]='o';
}
if(type_next==2){
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
block_next[i][j]='o';
}
if(type_next==3){
for(int i=0;i<=2;i++) block_next[i][0]='o';
block_next[2][1]='o';
}
if(type_next==4){
for(int i=0;i<=2;i++) block_next[1][i]='o';
}
}
void Revolve(){ //方块旋转
if(dirction==' '){
/***************** T 型方块旋转 *************************/
if(type==1){
if(onet==0){
for(int i=0;i<=2;i++) one.block[2][i]=' ';
for(int j=0;j<=2;j++) one.block[j][2]='o';
one.line[0]=-1;
one.line[1]=one.bottom-1;
one.line[2]=one.bottom;
one.left_boundry=one.left+1;
one.right_boundry=one.right;
onet++;
}
else if(onet==1){
for(int j=0;j<=2;j++) one.block[j][2]=' ';
for(int i=0;i<=2;i++) one.block[0][i]='o';
one.line[0]=one.bottom-2;
one.line[1]=one.bottom-1;
one.line[2]=one.bottom-2;
one.left_boundry=one.left;
one.right_boundry=one.right;
onet++;
}
else if(onet==2){
for(int i=0;i<=2;i++) one.block[0][i]=' ';
for(int j=0;j<=2;j++) one.block[j][0]='o';
one.line[0]=one.bottom;
one.line[1]=one.bottom-1;
one.line[2]=-1;
one.left_boundry=one.left;
one.right_boundry=one.right-1;
onet++;
}
else if(onet==3){
for(int i=0;i<=2;i++) one.block[i][0]=' ';
for(int j=0;j<=2;j++) one.block[2][j]='o';
one.line[0]=one.line[1]=one.line[2]=one.bottom;
one.left_boundry=one.left;
one.right_boundry=one.right;
onet=0;
}
}
/***************** 正方形方块旋转 *************************/
if(type==2){
one.line[0]=one.line[1]=one.line[2]=one.bottom;
}
/***************** L 型方块旋转 ***************************/
if(type==3){
if(onet==0){
for(int i=0;i<=2;i++) one.block[i][0]=' ';
for(int j=0;j<=2;j++) one.block[2][j]='o';
one.block[1][2]='o';
one.line[0]=one.bottom;
one.line[1]=one.bottom;
one.line[2]=one.bottom;
one.left_boundry=one.left;
one.right_boundry=one.right;
onet++;
}
else if(onet==1){
for(int j=0;j<=2;j++) one.block[2][j]=' ';
for(int i=0;i<=2;i++) one.block[i][2]='o';
one.block[0][1]='o';
one.line[0]=-1;
one.line[1]=one.bottom-2;
one.line[2]=one.bottom;
one.left_boundry=one.left+1;
one.right_boundry=one.right;
onet++;
}
else if(onet==2){
for(int i=0;i<=2;i++) one.block[i][2]=' ';
for(int j=0;j<=2;j++) one.block[0][j]='o';
one.block[1][0]='o';
one.line[0]=one.bottom-1;
one.line[1]=one.bottom-2;
one.line[2]=one.bottom-2;
one.left_boundry=one.left;
one.right_boundry=one.right;
onet++;
}
else if(onet==3){
for(int i=0;i<=2;i++) one.block[0][i]=' ';
for(int j=0;j<=2;j++) one.block[j][0]='o';
one.block[2][1]='o';
one.line[0]=one.line[1]=one.bottom;
one.line[2]=-1;
one.left_boundry=one.left;
one.right_boundry=one.right-1;
onet=0;
}
}
/***************** 一字型方块旋转 *************************/
if(type==4){
if(onet==0){
for(int i=0;i<=2;i++) one.block[1][i]=' ';
for(int j=0;j<=2;j++) one.block[j][1]='o';
one.line[0]=-1;
one.line[1]=one.bottom;
one.line[2]=-1;
one.left_boundry=one.left+1;
one.right_boundry=one.right-1;
onet++;
}
else if(onet==1){
for(int j=0;j<=2;j++) one.block[j][1]=' ';
for(int i=0;i<=2;i++) one.block[1][i]='o';
one.line[0]=one.bottom-1;
one.line[1]=one.bottom-1;
one.line[2]=one.bottom-1;
one.left_boundry=one.left;
one.right_boundry=one.right;
onet--;
}
}
}
}
void Clean(){ //清行及分数计算
int full=0;
for(int i=N-2;i>0;i--){
for(int j=1;j<N-1;j++){
if(Map[i][j]==' ') break;
if(j==N-2) full=1;
}
if(full==1) {
for(int k=1;k<N-1;k++){
Map[i][k]=background[i][k]=' ';
}
/*************** 闪烁效果 *********************/
double start=clock() / CLOCKS_PER_SEC;
while(clock()/CLOCKS_PER_SEC-start<=0.05);
Map_Upate();
Map_Upate();
/*************** 消行处理 *********************/
full=0;
for(int p=i;p>0;p--){
for(int q=1;q<N-1;q++){
Map[p][q]=Map[p-1][q];
background[p][q]=background[p-1][q];
}
}
score+=100; //加分数
}
}
}
int Arrive(){ //判断是否到达底边
if(background[one.line[0]+1][one.left]=='+'||background[one.line[2]+1][one.right]=='+'||background[one.line[1]+1][one.left+1]=='+'||
background[one.line[0]+1][one.left]=='o'||background[one.line[2]+1][one.right]=='o'||background[one.line[1]+1][one.left+1]=='o') {
for(int i=one.left,bi=0;i<=one.right;i++,bi++){
for(int j=one.bottom-2,bj=0;j<=one.bottom;j++,bj++){
if(background[j][i]==' ') background[j][i]=one.block[bj][bi]; //将方块加入底板
}
}
Clean();
return 1;
}
return 0;
}
void Move(){ //方块移动
bool timeover = true;
double start = (double)clock() / CLOCKS_PER_SEC; //得到程序目前为止运行的时间
while ((timeover = ((double)clock() / CLOCKS_PER_SEC - start <=speed / 1000.0)) && !_kbhit());//自动经过1秒或者等待1秒内的键盘输入
dirction='c';
if (timeover)
{
dirction=_getch(); //获取方向
}
switch(dirction){
case 'a':
if(one.left_boundry-1>0){
for(int i=one.left;i<=one.right;i++){
for(int j=one.bottom-2;j<=one.bottom;j++)
if(background[j][i]==' ') Map[j][i]=' ';
}
one.left--;
one.right--;
one.left_boundry--;
one.right_boundry--;
}
break;
case 'd':
if(one.right_boundry+1<N-1){
for(int i=one.left;i<=one.right;i++){
for(int j=one.bottom-2;j<=one.bottom;j++)
if(background[j][i]==' ')Map[j][i]=' ';
}
one.left++;
one.right++;
one.left_boundry++;
one.right_boundry++;
}
break;
case 's':
speed=10;
break;
case 'c': //固有方向
for(int i=one.left;i<=one.right;i++){
for(int j=one.bottom-2;j<=one.bottom;j++)
if(background[j][i]==' ') Map[j][i]=' ';
}
if(!Arrive()){
one.bottom++;
}
/******************** T 型方块实体底边坐标更新 ************************/
if(type==1){
if(onet==0){
one.line[0]=one.line[1]=one.line[2]=one.bottom;
}
else if(onet==1){
one.line[0]=-1;
one.line[1]=one.bottom-1;
one.line[2]=one.bottom;
}
else if(onet==2){
one.line[0]=one.bottom-2;
one.line[1]=one.bottom-1;
one.line[2]=one.bottom-2;
}
else if(onet==3){
one.line[0]=one.bottom;
one.line[1]=one.bottom-1;
one.line[2]=-1;
}
}
/***************** 正方形方块体底边坐标更新 *************************/
if(type==2){
one.line[0]=one.line[1]=one.line[2]=one.bottom;
}
/***************** L 型方块体底边坐标更新 ***************************/
if(type==3){
if(onet==0){
one.line[0]=one.line[1]=one.bottom;
one.line[2]=-1;
}
else if(onet==1){
one.line[0]=one.bottom;
one.line[1]=one.bottom;
one.line[2]=one.bottom;
}
else if(onet==2){
one.line[0]=-1;
one.line[1]=one.bottom-2;
one.line[2]=one.bottom;
}
else if(onet==3){
one.line[0]=one.bottom-1;
one.line[1]=one.bottom-2;
one.line[2]=one.bottom-2;
}
}
/***************** 一字型方块体底边坐标更新 *************************/
if(type==4){
if(onet==0){
one.line[0]=one.bottom-1;
one.line[1]=one.bottom-1;
one.line[2]=one.bottom-1;
}
else if(onet==1){
one.line[0]=-1;
one.line[1]=one.bottom;
one.line[2]=-1;
}
}
break;
case ' ':
Revolve();
break;
}
/***************************** 将方块矩阵加入地图 ***********************************/
int i,mi,j,mj;
for(mi=one.left,i=0;i<=2;i++,mi++){
for(mj=one.bottom-2,j=0;j<=2;j++,mj++)
//Map[mj][mi]=' ';
if(background[mj][mi]==' ') Map[mj][mi]=one.block[j][i];
}
}
int main(){
Hello();
type=Random();
SetBlock();
while(1){
Map_Upate();
if(IsChange) {
type_next=Random();
IsChange=0;
NextBlock();
}
if(Arrive()) {
type=type_next;
SetBlock();
IsChange=1;
}
Move();
}
}
更多推荐
C++ 黑框框小游戏(3)—— 俄罗斯方块
发布评论