| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2796 人关注过本帖
标题:俄罗斯方块游戏
只看楼主 加入收藏
gtxuq
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-6-12
收藏
得分:0 
void MoveTrans( void )  // 逆时针翻转
    {
        if( IsFit( x, y, c, (z+1)%4 ) )
        {
            VoiceBeep();
            Draw( COLOR_C );
            z=(z+1)%4;
            Draw( COLOR_A );
        }
    }
    void MoveLeft( void )    // 向左移
    {
        if( IsFit( x-1, y, c, z ) )
        {
            VoiceBeep();
            Draw( COLOR_C );
            --x;
            Draw( COLOR_A );
        }
    }
    void MoveRight( void )  // 向右移
    {
        if( IsFit( x+1, y, c, z ) )
        {
            VoiceBeep();
            Draw( COLOR_C );
            ++x;
            Draw( COLOR_A );
        }
    }
    int MoveDown( void )   // 向下移, 游戏结束返回0, 触底返回-1,否则返回1
    {
        if( IsFit( x, y+1, c, z ) )
        {
            VoiceBeep();
            Draw( COLOR_C );
            ++y;
            Draw( COLOR_A );
            return 1;
        }
        if( y != -2 ) // 触底
        {
            Draw( COLOR_B );

            for( int i=0; i<4; ++i )
            {
                if( y+i<0 ) continue;
                for( int j=0; j<4; ++j )
                    if( bk[c][z][i][j] == 1 )
                        data[y+i][x+j] = 1;
            }

            RemoveRow();

            x=4, y=-2, c=next, z=0;
            next = rand()%7;
            DrawNext();
            return -1;
        }
        // 游戏结束
        gameover = true;
        DrawOver();
        return 0;
    }
    bool MoveDownDown( void ) // 下落到底
    {
        int r;
        for( ; r=MoveDown(),r==1; );
        return r == -1;
    }
private:
    static const char bg[21*38+1];
    static const char bk[7][4][4][4];
    static const WORD COLOR_A; // 运动中的颜色
    static const WORD COLOR_B; // 固定不动的颜色
    static const WORD COLOR_C; // 空白处的颜色
private:
    DWORD freq, dura; // 声效频率,延续时间
    int keys[8]; // 8个控制键
    char decs[8][5]; // 8个控制键的描述, 长度为4个字节, 不含\0

    bool gameover;
    bool pause; // 暂停
    bool voice; // 声效开关
    int score, level; // 得分 和 速度
    char data[19][11];
    int next;
    int x, y, c, z; // x坐标,y坐标,当前方块,方向

    Window win;
};
2008-06-16 00:12
gtxuq
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-6-12
收藏
得分:0 
const char RussiaDiamonds::bg[21*38+1] =
    "┏━━━━━━━━━━━┓┏━━━━┓"
    "┃■■■■■■■■■■■┃┃        ┃"
    "┃■■■■■■■■■■■┃┃        ┃"
    "┃■■■■■■■■■■■┃┗━━━━┛"
    "┃■■■■■■■■■■■┃            "
    "┃■■■■■■■■■■■┃ 退出= ESC  "
    "┃■■■■■■■■■■■┃            "
    "┃■■■■■■■■■■■┃ 开始=      "
    "┃■■■■■■■■■■■┃ 暂停=      "
    "┃■■■■■■■■■■■┃ 声效=      "
    "┃■■■■■■■■■■■┃ 变形=      "
    "┃■■■■■■■■■■■┃ 左移=      "
    "┃■■■■■■■■■■■┃ 右移=      "
    "┃■■■■■■■■■■■┃ 下移=      "
    "┃■■■■■■■■■■■┃ 落地=      "
    "┃■■■■■■■■■■■┃            "
    "┃■■■■■■■■■■■┃            "
    "┃■■■■■■■■■■■┃ 速度  得分 "
    "┃■■■■■■■■■■■┃┏━━━━┓"
    "┃■■■■■■■■■■■┃┃0  00000┃"
    "┗━━━━━━━━━━━┛┗━━━━┛";
const char RussiaDiamonds::bk[7][4][4][4] =
{
    {
        { { 0,1,1,0 },{ 1,1,0,0 },{ 0,0,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 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 1,1,0,0 },{ 0,1,1,0 },{ 0,0,0,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,0,0,0 } },
        { { 0,1,0,0 },{ 1,1,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 1,1,1,0 },{ 1,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,0,0,0 } },
        { { 0,0,1,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 1,1,1,0 },{ 0,0,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,1,0,0 },{ 1,0,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 0,1,0,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } },
        { { 1,1,1,0 },{ 0,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,1,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 } },
        { { 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 } }
    }
};
const WORD RussiaDiamonds::COLOR_A = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY;
const WORD RussiaDiamonds::COLOR_B = FOREGROUND_GREEN;
const WORD RussiaDiamonds::COLOR_C = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE;

void MessageDeal( RussiaDiamonds rds[], int num )
{
    int* counts = new int[num];
    memset( counts, 0, num*sizeof(int) );
    for( ; ; )
    {
        if( _kbhit() )
        {
            int k = _getch();
            if( k == 0x1B ) break; // 遇到 Esc 键则退出
            if( k==0 || k==0xE0 )  // 控制字符
                k = _getch()<<8 | k;
            else if( k>='a' && k<='z' ) // 小写字母转化为大写
                k = k - ( 'a'-'A' );

            for( int n=0; n<num; ++n )
                rds[n].MessageDeal( k );
        }
        for( int n=0; n<num; ++n )
        {
            if( rds[n].IsRun() && 10-rds[n].Level()==++counts[n] )
            {
                counts[n] = 0;
                rds[n].Down();
            }
        }
        Sleep( 55 );
    }
    delete[] counts;
}
2008-06-16 00:12
gtxuq
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-6-12
收藏
得分:0 
int main()
{
//* 一个人玩
    Console csl;
    COORD crect = { 38, 21 };
    csl.Open( "罗刹国方块 beta", crect );

    int keys[8] = { 0x00000042, 0x00000053, 0x00000056, 0x000048E0, 0x00004BE0, 0x00004DE0, 0x000050E0, 0x00000020 };
    char decs[8][5] = { "B","S","V","↑","←","→","↓","空格" };
    RussiaDiamonds rd(csl,0,0);
    rd.Open( keys, decs, 1760, 10 );
    MessageDeal( &rd, 1 );
//*/
/* 二个人玩(仅用于测试多窗体,多窗体是为了将来联网作战准备的)
    // 二个人玩时有一个问题:如果两个键同时按着不放,则只有后一个起作用
    Console csl;
    COORD crect = { 38 + 38, 21 };
    csl.Open( "罗刹国方块 alpha", crect );

    int keys[2][8] = { {0x00003B00,0x00003C00,0x00003D00,0x00000057,0x00000041,0x00000044,0x00000053,0x00000058}
                      ,{0x00000037,0x00000038,0x00000039,0x000048E0,0x00004BE0,0x00004DE0,0x000050E0,0x00000030} };
    char decs[2][8][5] = { { "F1", "F2", "F3", "W",  "A",  "D",  "S",  "X" }
                          ,{ "7",  "8",  "9",  "↑", "←", "→", "↓", "0" } };
    RussiaDiamonds rds[2] = { RussiaDiamonds(csl,0,0), RussiaDiamonds(csl,38,0) };
    rds[0].Open( keys[0], decs[0], 1760, 10 );
    rds[1].Open( keys[1], decs[1], 2760, 10 );
    MessageDeal( rds, 2 );
//*/
    return 0;
}
2008-06-16 00:13
gtxuq
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-6-12
收藏
得分:0 
以上为一个俄罗斯方块代码,有哪位能对上述代码作出如下修改:
1、运行程序时,控制台窗口按照默认大小显示,游戏区域大小不变。
2、游戏中的方块区域改为20*10,并且取消声音模块。
3、方块的移动、旋转改为手动执行,即输入命令进行相应的操作,命令格式自定。
4、能不能不用图形界面,而用“*”或者“■”来直接在控制台上显示,不用一些句柄。
2008-06-16 00:14
快速回复:俄罗斯方块游戏
数据加载中...
 
   



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

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