level 5
//俄罗斯方块
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <windows.h>
#include <time.h>
using namespace std;
int arr[25][12];//游戏画面大小
char key;//记录输入的字符
int second[4][4];//记录出现的方块的形状
int upcoming[4][4];//下一个方块的形状
int abscissa = 4;//横坐标
int ordinate = 1;//纵坐标
int sec = 1000;//下落的时间
long score = 0;//记录得分
int grade = 0;//等级
int die =0;//死了
void end()//结束
{
for(int i = 1; i < 11;i ++ )
if(arr[5][i])
die = 1;
}
void output()//输出屏幕
{
system("cls");
for(int i = 4;i < 25;i ++)
{
if(i == 4)
cout<<"■■■■■■■■■■■■"<<endl;
for(int j = 0;j < 12;j ++)
{
if(arr[i][j])
cout<<"■";
else
cout<<"□";
}
if(i < 8)
for(int k = 0; k < 4;k ++ )
{
if(upcoming[i - 4][k])
cout<<"■";
else
cout<<"□";
}
if(i == 8)
cout<<"等级:";
if(i == 9)
cout<<setw(6)<<grade;
if(i == 10)
cout<<"分数:";
if(i == 11)
2011年04月10日 08点04分
1
level 5
cout<<setw(6)<<score;
if(i != 24)
cout<<endl;
}
}
void in()//输入字符
{
key = 0;
while(kbhit())
{
key = getch();
}
}
void cut()//削去形成一行的方块
{
int sum,t = 0;
for(int i = 4;i < 24;i ++ )
{
sum = 0;
for(int j = 1;j < 11;j ++ )
{
if(arr[i][j] == 1)
sum ++;
}
if(sum == 10)
{
for(int k = i;k > 3;k -- )
for(int l = 1;l < 11;l ++ )
{
if(i == 4)
arr[i][l] = 0;
else
arr[k][l] = arr[k - 1][l];
}
i --;
t += 1;
}
}
switch(t)
{
case 1:score += 1;break;
case 2:score += 3;break;
case 3:score += 6;break;
case 4:score += 10;break;
}
if(score < 100)
2011年04月10日 08点04分
2
level 5
grade = 0,sec = 1000;
else if(score < 200)
grade = 1,sec = 900;
else if(score < 300)
grade = 2,sec = 800;
else if(score < 400)
grade = 4,sec = 700;
else if(score < 500)
grade = 4,sec = 600;
else if(score < 600)
grade = 5,sec = 500;
else if(score < 700)
grade = 6,sec = 400;
else if(score < 800)
grade = 7,sec = 300;
else if(score < 900)
grade = 8,sec = 200;
else if(score < 1000)
grade = 9,sec = 100;
}
void spin()//旋转方块
{
int temp[4][4];
int t = 1;
for(int i = 0; i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
temp[i][j] = 0;
for(int i = -1;i < 2;i ++ )
for(int j = -1;j < 2; j++)
temp[i + 1][j + 1] = second[1 - j][1 + i];
for(int i = 0; i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
{
if(temp[i][j] && arr[ordinate + i][abscissa + j] - second[i][j] > 0)
t = 0;
}
if(second[1][1] && second[1][2] && second[2][1] && second[2][2])
t = 0;
if(second[1][0] && second[1][1] && second[1][2] && second[1][3])
{
if(arr[ordinate + 3][abscissa + 1] == 0)
temp[3][1] = 1;
else
t = 0;
}
if(second[0][1] && second[1][1] && second[2][1] && second[3][1])
2011年04月10日 08点04分
3
level 5
{
if(arr[ordinate + 1][abscissa + 3] == 0)
temp[1][3] = 1;
else
t = 0;
}
if(t == 1)
{
for(int i = 0; i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
{
arr[ordinate + i][abscissa + j] -= second[i][j];
arr[ordinate + i][abscissa + j] += temp[i][j];
second[i][j] = temp[i][j];
}
}
}
void left()//向左移动
{
int t = 0;
for(int i = 0; i < 4;i ++ )
{
for(int j = 0;j < 4;j ++ )
{
if(second[i][j] && arr[ordinate + i][abscissa + j - 1])
{
t = 1;
break;
}
if(second[i][j])
break;
}
if(t == 1)
break;
}
if(t == 0)
{
abscissa -- ;
for(int i = 0; i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
if(second[i][j])
{
2011年04月10日 08点04分
4
level 5
arr[ordinate + i][abscissa + j] += second[i][j];
arr[ordinate + i][abscissa + j + 1] -= second[i][j];
}
}
}
void right()//向右移动
{
int t = 0;
for(int i = 0; i < 4;i ++ )
{
for(int j = 3;j >= 0;j -- )
{
if(second[i][j] && arr[ordinate + i][abscissa + j + 1])
{
t = 1;
break;
}
if(second[i][j])
break;
}
if(t == 1)
break;
}
if(t == 0)
{
abscissa ++ ;
for(int i = 0; i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
if(second[i][j])
{
arr[ordinate + i][abscissa + j] += second[i][j];
arr[ordinate + i][abscissa + j - 1] -= second[i][j];
}
}
}
void pause()//暂停
{
sec *= -1;
}
void growNest()//出现下一个下落的方块
{
int t = rand() % 7;
switch(t)
{
case 0:
for(int i = 0;i < 4; i++ )
2011年04月10日 08点04分
5
level 5
for(int j = 0;j < 4;j ++ )
{
if(j == 1)
upcoming[i][j] = 1;
else
upcoming[i][j] = 0;
}
break;
case 1:
for(int i = 0;i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
{
if(i != 3 && j == 1 || i == 2 && j == 2)
upcoming[i][j] = 1;
else
upcoming[i][j] = 0;
}
break;
case 2:
for(int i = 0;i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
{
if(i != 3 && j == 2 || i == 2 && j == 1)
upcoming[i][j] = 1;
else
2011年04月10日 08点04分
6
level 5
upcoming[i][j] = 0;
}
break;
case 3:
for(int i = 0;i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
{
if(i != 3 && j == 1 || i == 1 && j == 2)
upcoming[i][j] = 1;
else
upcoming[i][j] = 0;
}
break;
case 4:
for(int i = 0;i < 4;i ++ )
for(int j = 0;j < 4;j++ )
{
if(i < 2&& j == 1 || i != 0 && i != 3 && j == 2)
upcoming[i][j] = 1;
else
upcoming[i][j] = 0;
}
break;
case 5:
for(int i = 0;i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
2011年04月10日 08点04分
7
level 5
{
if(i < 2 && j == 2 || i != 0 && i != 3 && j == 1)
upcoming[i][j] = 1;
else
upcoming[i][j] = 0;
}
break;
case 6:
for(int i = 0;i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
{
if((i == 1 || i == 2) && (j == 1 || j == 2))
upcoming[i][j] = 1;
else
upcoming[i][j] = 0;
}
break;
}
}
void grow()//出现第一个方块
{
growNest();
for(int i = 0;i < 4; i++ )
for(int j = 0;j < 4;j ++ )
second[i][j] = upcoming[i][j];
for(int i = 0; i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
if(second[i][j])
arr[ordinate + i][abscissa + j] += second[i][j];
growNest();
}
void stop()//方块落到底时
{
cut();
abscissa = 4;
ordinate = 1;
2011年04月10日 08点04分
8
level 5
for(int i = 0;i < 4; i++ )
for(int j = 0;j < 4;j ++ )
second[i][j] = upcoming[i][j];
for(int i = 0; i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
if(second[i][j])
arr[ordinate + i][abscissa + j] += second[i][j];
growNest();
end();
}
void down()//方块下落
{
for(int j = 0;j < 4;j ++ )
for(int i = 3; i >= 0;i -- )
{
if(second[i][j] && arr[ordinate + i + 1][abscissa + j])
stop();
if(second[i][j])
break;
}
ordinate ++ ;
for(int i = 0; i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
{
arr[ordinate + i][abscissa + j] += second[i][j];
arr[ordinate + i - 1][abscissa + j] -= second[i][j];
}
}
void quick()//加速下落
{
int t = 1;
while(t)
{
ordinate ++ ;
for(int i = 0; i < 4;i ++ )
for(int j = 0;j < 4;j ++ )
{
if(second[i][j])
arr[ordinate + i][abscissa + j] += second[i][j];
arr[ordinate + i - 1][abscissa + j] -= second[i][j];
}
for(int j = 0;j < 4;j ++ )
2011年04月10日 08点04分
9