| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5414 人关注过本帖
标题:自己用五天时间写的一个控制台俄罗斯方块~~~
只看楼主 加入收藏
阿冲
Rank: 2
等 级:论坛游民
帖 子:29
专家分:40
注 册:2009-10-5
结帖率:75%
收藏
已结贴  问题点数:0 回复次数:33 
自己用五天时间写的一个控制台俄罗斯方块~~~
只学到函数,所以写个在控制台下玩的小游戏~~~~


程序代码:
#include <iostream>
#include <ctime>
using namespace std;
#define ROW 10
#define COL 10
//-------------------------- 声明函数-----------------
void bDown();//向下走
void bleft();//向左走
void bRight();//向右走
void bBian();//变形
void cRanShape();//初始化随机方块
void arrView();//显示界面
void fenshu();//计算分数

//----------定义方块的结构------------------
struct tagShape
{
    int x;//当前方块的横坐标
    int y;//当前方块的纵坐标
    int rB;//随机大变化;
    int rS;//随机小变化;
    int iKey;//判断是否可以初始化;
    int iX;//方块的行数
    int iY;//方块的列数
    int iOver;//游戏结束
    int ifen;//当前得分
}tShape;
tagShape & T_Shape = tShape;//定义结构引用

//------------------定义全局变量-----------------------------------------

int g_arrInfo[ROW][COL] = {0};  //定义环境二维数组全局变量

int i = 0 , j = 0;//用于FOR循环的临时变量;

int g_arrBox[7][4][5][4] =  //---------定义方块变化四维数组全局变量,共七次大变化,四次小变化,每次变化四四格
{
//---------竖条变化开始(0)----------;
{    
    {
        {1,1,1,1}, 
        {0,0,0,0}
    },
    {
        {1,0,0,0}, 
        {1,0,0,0}, 
        {1,0,0,0}, 
        {1,0,0,0},
        {0,0,0,0}
    },
    {
        {1,1,1,1}, 
        {0,0,0,0}
    },
    {
        {1,0,0,0}, 
        {1,0,0,0}, 
        {1,0,0,0}, 
        {1,0,0,0},
        {0,0,0,0}
    }
},
//---------竖条变化结束----------;
    
//----------右弯变化开始(1)----------
{
    {
        {1,1,1,0}, 
        {1,0,0,0}, 
        {0,0,0,0}
    },
    {   
        {1,1,0,0}, 
        {0,1,0,0}, 
        {0,1,0,0}, 
        {0,0,0,0} 
    },
    {   
        {0,0,1,0}, 
        {1,1,1,0}, 
        {0,0,0,0}
    },
    {   
        {1,0,0,0}, 
        {1,0,0,0}, 
        {1,1,0,0}, 
        {0,0,0,0} 
    }
},
//----------右弯变化结束----------

//-----------左弯变化开始(2)---------;
{
    {
        {1,1,1,0}, 
        {0,0,1,0}, 
        {0,0,0,0}
    },
    {
        {0,1,0,0}, 
        {0,1,0,0}, 
        {1,1,0,0}, 
        {0,0,0,0} 
    },
    {
        {1,0,0,0}, 
        {1,1,1,0}, 
        {0,0,0,0}
    },
    {
        {1,1,0,0}, 
        {1,0,0,0}, 
        {1,0,0,0}, 
        {0,0,0,0} 
    }
},
//----------左弯变化结束----------

//--------土变化开始(3)--------------
{
    {
        {1,1,1,0}, 
        {0,1,0,0}, 
        {0,0,0,0}
    },
    {
        {0,1,0,0}, 
        {1,1,0,0}, 
        {0,1,0,0}, 
        {0,0,0,0} 
    },
    {
        {0,1,0,0}, 
        {1,1,1,0}, 
        {0,0,0,0}
    },
    {
        {1,0,0,0}, 
        {1,1,0,0}, 
        {1,0,0,0}, 
        {0,0,0,0} 
    }
},
//-----------土变化结束------------

//-----------左闪变化开始(4)------------
{
    {
        {1,1,0,0}, 
        {0,1,1,0}, 
        {0,0,0,0}
    },
    {
        {0,1,0,0}, 
        {1,1,0,0}, 
        {1,0,0,0}, 
        {0,0,0,0} 
    },
    {
        {1,1,0,0}, 
        {0,1,1,0}, 
        {0,0,0,0}
    },
    {
        {0,1,0,0}, 
        {1,1,0,0}, 
        {1,0,0,0}, 
        {0,0,0,0} 
    }
},
//-----------左闪变化结束------------

//-----------右闪变化开始(5)------------
{
    {
        {0,1,1,0}, 
        {1,1,0,0}, 
        {0,0,0,0}
    },
    {
        {1,0,0,0}, 
        {1,1,0,0}, 
        {0,1,0,0}, 
        {0,0,0,0} 
    },
    {
        {0,1,1,0}, 
        {1,1,0,0}, 
        {0,0,0,0} 
    },
    {
        {1,0,0,0}, 
        {1,1,0,0}, 
        {0,1,0,0}, 
        {0,0,0,0} 
    }
},
//-----------右闪变化结束------------

//-----------田变化开始(6)------------
{
    {
        {1,1,0,0}, 
        {1,1,0,0}, 
        {0,0,0,0}
    },
    {
        {1,1,0,0}, 
        {1,1,0,0}, 
        {0,0,0,0}
    },
    {
        {1,1,0,0}, 
        {1,1,0,0}, 
        {0,0,0,0}
    },
    {
        {1,1,0,0}, 
        {1,1,0,0}, 
        {0,0,0,0}
    }
}

};
//---------结束定义方块变化四维数组全局变量-----------------------



int main()
{
    cRanShape(); //先随机一个方块    
    int iFangxiang = 0;//输入方向
    T_ = 0;//游戏结束初始化为0,为1时则结束游戏
    T_Shape.ifen = 0;//当前得分初始化为0
    enum {Left=1,Right,Down,Bianxing};
    while (1)
    {        
        switch (iFangxiang)
        {
            case Left:
                bleft();
                break;
            case Right:
                bRight();
                break;
            case Down:
                bDown();
                break;
            case Bianxing:
                bBian();
                break;
        }        
        
        
        if (T_Shape.iKey) //如果到达最后就重新生成方块,并计算得分;
        {
            fenshu();
            cRanShape();            
        }
        
        arrView();
        
        if (T_ == 1)//游戏结束退出循环
        {
            cout << "-------------------------游戏结束,总得分:" << T_Shape.ifen <<"--------------------------" << endl;
            break;
        }        
        
        cout << "当前得分:" << T_Shape.ifen << " " << "请输入方向(1左2右3下4变形):";
        cin >> iFangxiang;
    }
    
    return 0;
}

void cRanShape()//初始化随机方块
{    
    int iCenter = COL / 2;

    srand( time(0) );
    T_Shape.rB = rand() % 7;//随机方块7次大变化
    T_Shape.rS = rand() % 4;//随机方块4次小变化
    int iTmp = 0;

    T_Shape.iKey = 0;//初始化0,如果为1就可以执行下次循环
    T_Shape.x = 0; //方块现在坐标位置的横坐标
    T_Shape.y = iCenter - 2; //方块现在坐标位置的纵坐标
    
    for (i = 0; i < T_Shape.iX; ++i)//游戏结束条件
    {
        for (j = 0; j < T_Shape.iY; ++j)
        {
            if (g_arrBox[T_Shape.rB][T_Shape.rS][i][j] == 1 && g_arrInfo[T_Shape.x + i][T_Shape.y + j] == 1)
            {
                T_ = 1;
                break;
            }
        }
    }

    //初始化方块大小为零
    T_Shape.iX = 0;
    T_Shape.iY = 0;

    for (i = 0; i < 4; ++i) //方块赋值并计算方块的大小
    {
        for (j = 0; j < 4; ++j)
        {
            if (g_arrInfo[i][j + iCenter - 2] == 0)//如果空间为0则赋值
            {
                g_arrInfo[i][j + iCenter - 2] = g_arrBox[T_Shape.rB][T_Shape.rS][i][j];
            }    
            if (g_arrBox[T_Shape.rB][T_Shape.rS][i][j] == 1)//计算方块一行的个数
            {
                iTmp = 1;
            }
            if (g_arrBox[T_Shape.rB][T_Shape.rS][i][j] == 1 && g_arrBox[T_Shape.rB][T_Shape.rS][i + 1][j] == 0)//计算方块列数
            {
                T_Shape.iY += 1;
            }
            
        }
        if (iTmp == 1)//只要该行有一个方块为1,则为一行,临时变量ITMP清零
        {
            T_Shape.iX += 1;
            iTmp = 0;
        }
    }
    if (T_Shape.iY == 0)//如果是竖条就加一
    {
        T_Shape.iY = 1;
    }
}

void arrView() //显示界面
{
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            if (g_arrInfo[i][j])
                cout << "■";
            else
                cout << "□";
        }
        cout << endl;
    }
}

//---------------------------向下走开始--------------------------------
void bDown()
{
    
    for (i = 0; i < T_Shape.iX; ++i)//先判断能不能向下走--
    {
        for (j = 0; j < T_Shape.iY; ++j)
        {
            if (g_arrBox[T_Shape.rB][T_Shape.rS][i][j] == 1 && g_arrBox[T_Shape.rB][T_Shape.rS][i + 1][j] == 0 && g_arrInfo[T_Shape.x + i + 1][T_Shape.y + j] == 1 || T_Shape.x + T_Shape.iX == ROW)
            {
                T_Shape.iKey = 1;
            }
        }
    }


    if (T_Shape.iKey == 0) //如果可以向下走就开始执行
    {
        for (i = T_Shape.x + T_Shape.iX ; i > 0 ; --i)
        {        
            for (j = T_Shape.y; j < T_Shape.y + T_Shape.iY; ++j)
            {    
                if (g_arrInfo[i][j] == 0 && g_arrInfo[i - 1][j] == 1 )
                {
                    g_arrInfo[i][j] = 1;
                    g_arrInfo[i - 1][j] =0;    
                }            
            }
        }
    T_Shape.x += 1; //往下走加一
    }
    

}

//---------------------------向下走结束--------------------------------



//------------------------向左走开始-----------------------
void bleft()
{
    int iTmp = 0;
    for (i = 0; i < T_Shape.iX; ++i)//先判断能不能向左走--
    {
        for (j = 0; j < T_Shape.iY; ++j)
        {
            if (g_arrBox[T_Shape.rB][T_Shape.rS][i][j] == 1 && g_arrBox[T_Shape.rB][T_Shape.rS][i][j - 1] == 0 && g_arrInfo[T_Shape.x + i][T_Shape.y + j - 1] == 1 || T_Shape.y == 0)
            {
                iTmp = 1;
            }
        }
    }

    if (iTmp == 0)
    {

        for (i = T_Shape.x; i < T_Shape.x + T_Shape.iX; ++i)
        {
            for (j = T_Shape.y; j < T_Shape.y + T_Shape.iY; ++j)
            {
                if (g_arrInfo[i][j - 1] == 0 && g_arrInfo[i][j] == 1)
                {
                    g_arrInfo[i][j - 1] = g_arrInfo[i][j];
                    g_arrInfo[i][j] = 0;
                }
            }
        }
    T_Shape.y -= 1;
    }

}

//----------------------------------------向左走结束------------------------------------------


//---------------------------向右走开始------------------------------------------

void bRight()
{
    int iTmp = 0;

    for (i = 0; i < T_Shape.iX; ++i)//先判断能不能向左走--
    {
        for (j = 0; j < T_Shape.iY; ++j)
        {
            if (g_arrBox[T_Shape.rB][T_Shape.rS][i][j] == 1 && g_arrBox[T_Shape.rB][T_Shape.rS][i][j + 1] == 0 && g_arrInfo[T_Shape.x + i][T_Shape.y + j + 1] == 1 || T_Shape.y + T_Shape.iY == COL)
            {
                iTmp = 1;
            }
        }
    }

    if (iTmp == 0)
    {
        for (i = T_Shape.x; i < T_Shape.x + T_Shape.iX; ++i)
        {
            for (j = T_Shape.y + T_Shape.iY; j > T_Shape.y; --j)
            {
                if (g_arrInfo[i][j] == 0 && g_arrInfo[i][j - 1] == 1)
                {
                    g_arrInfo[i][j] = g_arrInfo[i][j - 1];
                    g_arrInfo[i][j - 1] = 0;
                }
            }
        }
    T_Shape.y += 1;

    }

}
//--------------向右走结束----------------------------

//-------------------------------------变形开始--------------------------------------------------------------
void bBian()
{
    for (i = 0; i < T_Shape.iX; ++i)//先清零,再计算
    {
        for (j = 0; j < T_Shape.iY; ++j)
        {
            if (g_arrBox[T_Shape.rB][T_Shape.rS][i][j] == 1 )
            {
                g_arrInfo[T_Shape.x + i][T_Shape.y + j] = 0;
            }
        }
    }
    //-----设置一个临时变量用来判断当前环境可否变形,每变一次形就将小类加一,如果大于三自动赋零------------
    int iRs = T_Shape.rS;
    iRs += 1;
    if (iRs > 3)
    {
        iRs = 0;
    }

    int iTmp = 0 , iOk = 0;    
    int iX = 0; //定义临时方块大小变量ix,iy,用来测当前方块可否变形
    int iY = 0;
    //--------计算方块大小开始-------------
    for (i = 0; i < 4; ++i)
    {
        for (j = 0; j < 4; ++j)
        {            
            if (g_arrBox[T_Shape.rB][iRs][i][j] == 1)//计算方块行数
            {
                iTmp = 1;
            }
            if (g_arrBox[T_Shape.rB][iRs][i][j] == 1 && g_arrBox[T_Shape.rB][iRs][i + 1][j] == 0)//计算方块列数
            {
                iY += 1;
            }            
        }
        if (iTmp == 1)
        {
            iX += 1;
            iTmp = 0;
        }
    }
    if (iY == 0)//如果是竖条就加一
    {
        iY = 1;
    }
    //--------计算方块大小结束-------------

    //-----------再来计算当前状态可否变化-------------------------

    for (i = 0; i < iX; ++i)
    {
        for (j = 0; j < iY; ++j)
        {
            if (g_arrBox[T_Shape.rB][iRs][i][j] == 1 && g_arrInfo[T_Shape.x + i][T_Shape.y + j] == 1 || T_Shape.x + iX >= ROW || T_Shape.y + iY >= COL)
            {
                iOk = 1;
            }
        }
    }

    //-----------------计算结束-----------------------------

    if (iOk == 0)//达到条件就变形,否则还原
    {        
        for (i = 0; i < iX; ++i)
        {
            for (j = 0; j < iY; ++j)
            {
                if (g_arrBox[T_Shape.rB][iRs][i][j] == 1)
                {
                    g_arrInfo[T_Shape.x + i][T_Shape.y + j] = 1;
                }
            }
        }
        T_Shape.rS = iRs; T_Shape.iX = iX; T_Shape.iY = iY;
    }
    else
    {
        for (i = 0; i < T_Shape.iX; ++i)//先清零,再计算
        {
            for (j = 0; j < T_Shape.iY; ++j)
            {
                if (g_arrBox[T_Shape.rB][T_Shape.rS][i][j] == 1 )
                {
                    g_arrInfo[T_Shape.x + i][T_Shape.y + j] = 1;
                }
            }
        }
    }

}

//--------------------计算分数开始--------------------------------------------------------------------------

void fenshu()
{
    int iTmp = 0 , iTmpFen = 1;
    int k,l;//临时的小变量
    for (i = T_Shape.x; i < T_Shape.x + T_Shape.iX; ++i)
    {
        for (j = 0; j < COL; ++j)
        {
            if (g_arrInfo[i][j] == 0)//只要该行有一个为0,则不能得分
            {
                iTmp = 1;
            }
        }
        if (iTmp == 1)
        {
            iTmp = 0;//如果不能得分则清零重新循环
        }
        else
        {
            iTmpFen *= 2;//得分(消一行加2分,两行4分,三行8分,四行16分)

            for (k = i; k > 0; --k)
            {
                for (l = 0; l < COL; ++l)//去掉消行的格数
                {                    
                    g_arrInfo[k][l] = g_arrInfo[k - 1][l];    
                    g_arrInfo[k - 1][l] = 0;
                    //cout << k << " , " << j << endl;
                }
            }            
            
        }
    }
    T_Shape.ifen += iTmpFen;
}
收到的鲜花
  • newCpp2009-10-22 16:30 送鲜花  5朵   附言:好文章
搜索更多相关主题的帖子: 控制台 俄罗斯方块 时间 
2009-10-22 11:52
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:1 
想不到,方块可以这样编

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2009-10-22 11:59
阿冲
Rank: 2
等 级:论坛游民
帖 子:29
专家分:40
注 册:2009-10-5
收藏
得分:0 
以下是引用lonmaor在2009-10-22 11:59:42的发言:

想不到,方块可以这样编

那一般都是怎么编的呢???
2009-10-22 12:03
zodiac207
Rank: 2
等 级:论坛游民
帖 子:16
专家分:38
注 册:2009-10-14
收藏
得分:0 
牛,但游戏性比较差,但应该可以改进
2009-10-22 13:26
newCpp
Rank: 5Rank: 5
来 自:火星
等 级:职业侠客
威 望:3
帖 子:256
专家分:375
注 册:2009-8-17
收藏
得分:0 
太猛了点儿吧!

编程语言视频教程在线播放学习
2009-10-22 16:19
landielingwu
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2009-3-29
收藏
得分:0 
厉害!!
2009-10-22 17:07
huang1990
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-10-22
收藏
得分:0 
undefined
2009-10-22 18:26
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
厉害!

迭代的是人,递归的是神。
2009-10-22 18:36
loookc
Rank: 2
等 级:论坛游民
帖 子:24
专家分:11
注 册:2009-10-15
收藏
得分:0 
厉害
2009-10-22 20:38
shl305
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:36
专家分:121
注 册:2009-3-13
收藏
得分:0 
真有工夫
2009-10-22 23:44
快速回复:自己用五天时间写的一个控制台俄罗斯方块~~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033105 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved