回 帖 发 新 帖 刷新版面

主题:[讨论]用VS2005 C++编俄罗斯方块求助

我是刚上大二的学生,也就刚刚学的C++。学校要求用VS2005编个俄罗斯方块,下面是我已经憋出来的代码,其实也就是刚刚完成了键盘控制,想知道怎么才能实现用数组显示方块并旋转,诚心求教,谢谢各位前辈了。
注:colorConsole.h是我们老师弄好的头文件
#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include <cmath>
#include "colorConsole.h"

using namespace std;

typedef int BOOL;
typedef  unsigned char  BYTE;
typedef  unsigned short   WORD;
typedef  unsigned long   DWORD;
#define    KEY_LEFT = 75;
#define KEY_UP = 72;
#define KEY_RIGHT = 77;
#define KEY_DOWN = 80;
void main(void)
{
    int x = 0,y = 0;
    bool flag = true;
    HANDLE handle;
    handle = initiate();
    WORD wColors[1];
    wColors[0] = FOREGROUND_RED | FOREGROUND_INTENSITY;
    textout(handle,x,y,wColors,1,"■");
    textout(handle,x,y+1,wColors,1,"■");
    textout(handle,x,y+2,wColors,1,"■");
    textout(handle,x+2,y+2,wColors,1,"■");
    while (x < 70)
    {
        if (_kbhit())
        {
            _getch();
            switch (_getch())
            {
            case 75:
                {
                    //flag=!flag;
                    textout(handle,x-2,y,wColors,1,"■");
                    textout(handle,x-2,y+1,wColors,1,"■");
                    textout(handle,x-2,y+2,wColors,1,"■");
                    textout(handle,x,y+2,wColors,1,"■");
                    Sleep(200);
                    textout(handle,x-2,y,wColors,1,"  ");
                    textout(handle,x-2,y+1,wColors,1,"  ");
                    textout(handle,x-2,y+2,wColors,1,"  ");
                    textout(handle,x,y+2,wColors,1,"  ");
                    x = x - 2;
                    break;
                }
            case 72:
                {
                    //flag=!flag;
                    textout(handle,x,y-1,wColors,1,"■");
                    textout(handle,x,y,wColors,1,"■");
                    textout(handle,x,y+1,wColors,1,"■");
                    textout(handle,x+2,y+1,wColors,1,"■");
                    Sleep(200);
                    textout(handle,x,y-1,wColors,1,"  ");
                    textout(handle,x,y,wColors,1,"  ");
                    textout(handle,x,y+1,wColors,1,"  ");
                    textout(handle,x+2,y+1,wColors,1,"  ");
                    y = y - 1;
                    break;
                }
            case 77:
                {
                    //flag=!flag;
                    textout(handle,x+2,y,wColors,1,"■");
                    textout(handle,x+2,y+1,wColors,1,"■");
                    textout(handle,x+2,y+2,wColors,1,"■");
                    textout(handle,x+4,y+2,wColors,1,"■");
                    Sleep(200);
                    textout(handle,x+2,y,wColors,1,"  ");
                    textout(handle,x+2,y+1,wColors,1,"  ");
                    textout(handle,x+2,y+2,wColors,1,"  ");
                    textout(handle,x+4,y+2,wColors,1,"  ");
                    x = x + 2;
                    break;
                }
            case 80:
                {
                    //flag=!flag;
                    textout(handle,x,y+1,wColors,1,"■");
                    textout(handle,x,y+2,wColors,1,"■");
                    textout(handle,x,y+3,wColors,1,"■");
                    textout(handle,x+2,y+3,wColors,1,"■");
                    Sleep(200);
                    textout(handle,x,y+1,wColors,1,"  ");
                    textout(handle,x,y+2,wColors,1,"  ");
                    textout(handle,x,y+3,wColors,1,"  ");
                    textout(handle,x+2,y+3,wColors,1,"  ");
                    y = y + 1;
                    break;
                }
            default:;
            }
        }
        if (flag)
        {
            textout(handle,x,y,wColors,1,"■");
            textout(handle,x,y+1,wColors,1,"■");
            textout(handle,x,y+2,wColors,1,"■");
            textout(handle,x+2,y+2,wColors,1,"■");
            Sleep(300);
            textout(handle,x,y,wColors,1,"  ");
            textout(handle,x,y+1,wColors,1,"  ");
            textout(handle,x,y+2,wColors,1,"  ");
            textout(handle,x+2,y+2,wColors,1,"  ");
            y++;
        }
    }
}

回复列表 (共2个回复)

沙发

提供一些思路:
1.需要一种结构去保存各种方块的状态.可以包括形状,初始方向,当前方向,旋转方法等

2.从画面表现上来看, 方块的移动与旋转 其实 就是先擦除原先的背景,再将方块绘制到新的地方.

3.如果你有多线程的知识,还可以启动一个线程来控制方块的自动下落与消除.

板凳

程序并非“憋”出来。
不要冲动,要抑制“一开始就写代码”的想法。凡事都要有个计划,先想想这个程序需要做多少内容(一条一条列出来),每一条内容大概需要写多少代码,这些代码写起来难度如何。规划好了,做起来才会有信心。
不要把所有的代码都堆积在main函数里面。划分成多个函数,这样不仅仅看起来清晰,而且能够体现出思路的清晰。代码的混乱往往是因为思路的混乱。

大概应该像这样写:

typedef struct Block { /* ... */ } Block;   --> 表示一个正在下落的方块
typedef struct Map { /* ... */ } Map;       --> 表示整个地图,里面有若干已经落地的方块
void Block_Init(Block* b);                  --> 创建一个新的方块
void Block_Fall(Block* b);                  --> 方块下落一格
void Block_MoveL(Block* b);                 --> 方块左移一格
void Block_MoveR(Block* b);                 --> 方块右移一格
void Block_RotateCW(Block* b);              --> 方块顺时针旋转
void Block_RotateCCW(Block* b);             --> 方块逆时针旋转
void Map_Init(Map* m);                      --> 地图初始化
void Map_TestBlock(Map* m, Block* b);       --> 如果方块落地,则将它填入地图中
void Map_CalcScore(Map* m);                 --> 判断是否得分,若是,消去整行格子
int  Map_IsGameOver(Map* m);                --> 判断是否已经结束游戏
void Draw(Map* m, Block* b);                --> 在屏幕上显示地图和方块

int main()
{
    Map m;
    Block b;
    int is_game_over = 0;  --> 不为0表示游戏结束

    Map_Init(&m);
    Block_Init(&b);

    while (!is_game_over)
    {
        if (键盘有动作)
            --> 调用Block_MoveL、Block_MoveR、Block_RotateCCW、Block_RotateCCW等

        if (经过了足够多时间,需要下落一格)
        {
            Block_Fall(&b);
            Map_TestBlock(&m, &b);  /* 下落之后需要判断是否落地,并且计算得分 */
            Map_CalcScore(&m);
            is_game_over = Map_IsGameOver(&m);
        }

        Draw(&m, &b);
    }

    return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册