晒晒我的俄罗斯方块,花了近一个星期,本人大一,刚学不到一年
c++吧
全部回复
仅看楼主
level 5
lhx6538665 楼主
//俄罗斯方块
#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
lhx6538665 楼主
             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
lhx6538665 楼主
         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
lhx6538665 楼主
     {
         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
lhx6538665 楼主
                     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
lhx6538665 楼主
                 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
lhx6538665 楼主
                         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
lhx6538665 楼主
                 {
                     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
lhx6538665 楼主
     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
level 10
控制台程序?
2011年04月10日 08点04分 11
level 5
lhx6538665 楼主
回复:11楼
是啊
2011年04月10日 08点04分 12
level 11
我想知道控制台的俄罗斯方块是啥样
2011年04月10日 08点04分 13
level 7
楼主那个变型健是哪个? 看屏幕看得我眼睛也跟着一闪一闪了
2011年04月10日 08点04分 14
level 7
哦知道了,W
2011年04月10日 08点04分 15
level 11
看起来很强大的样子
2011年04月10日 08点04分 16
level 8
我是下半学期开始的C++。。现在刚学MFC。。正考虑是学MFC,还是QT。。[揉脸]
2011年04月10日 09点04分 17
level 5
lhx6538665 楼主
是啊,会闪,谁能解决不?
2011年04月10日 10点04分 18
level 10
听说图像要存入缓冲区···
不然屏幕一直闪一直闪····[汗]
2011年04月10日 12点04分 19
level 3
看看
2011年04月10日 17点04分 20
level 3
看看
2011年04月10日 17点04分 21
1 2 3 尾页