请帮我看看下面的程序哪里有错误!这是一个俄罗斯方块的源代码,运行平台:DOS+TC3.0

/* .....以上面的程序代码为例。由于帖子内容原因,请继续阅读下期帖子:*/

void渲染(void);/*独特的绘图功能*/

/*注意,这个函数重绘整个地图,根据地图中的格子和小方框在地图中的中间坐标,在适当的位置绘制小方框*/

/*当然/*DOS的图形很低,但是这里全屏画图还是可以的。我用双缓冲区来交换图纸,这让我感觉更好*/

void init map(void);/*初始化地图(大框)*/

/*之前提到过这个二维数组里有一个1的圆防止小盒子出界,而这个就是生成这个圆的函数*/

void new game();/*创建新游戏*/

/*此函数初始化一个或多个时钟,并构建第一个下降框。当然,施工结束后,进行预览*/

void rotateBox(int box 1[5][5],int box 2[5][5]);

/*核心函数成员,逆时针旋转box1 90度,保存在box2 */

void rebidnext();

/*核心函数成员,生成下一个框*/

int drop();

/*核心函数的成员,向下移动下坠框(实际上是增加下坠框的Y值)。当然需要判断是否与地图格子和地图重叠,不能完成下落操作,返回0*/

void putBox();

/*在此之上,落盒和地图是两个独立的维度。*/*当下落失败时,小盒子将返回顶部再次进行下落。当这种情况发生时,原来的盒子内容当然会变成地图上的内容。putBox就是根据XY */在地图上写下坠框的内容

void clear();

/*此功能在掉落失败和putBox后执行,扫描整幅地图*//*并去除点阵的整行。具体细节在函数*/中描述

int move(int dir);

/*左右移动下拉框,dir表示向左或向右,与drop相同*/

int test(int mx,int my,int box[5][5]);

/*这是判断方框在MX和我的坐标中是否与地图上的非空格子重叠的关键点。这是一个非常常见的函数*/

int rotate();

/*旋转下降盒。当然,如果旋转后和地图冲突,会取消旋转,返回0,但是返回值好像没用~ */

int new fall();

/*创建下降元素,将“下一个”预览的内容复制到下降框*/*并将下降框移动到地图的顶部。当然,在这个过程中,如果顶部有冲突,它会返回0,这意味着它已满...gameOver*/

int main();

/*最后到达主功能,在这里可以看到整个游戏架子*/

/*结构,包括游戏主循环,键盘处理等...*/

/******************************************************\

*可变面积*

\******************************************************/

/*在上面的解释中,可能有些忽略,因为你可能不知道实际使用的变量*/

int map[MAX _ Y+4][MAX _ X+4];/*地图\大框...MAX_X,Y是可视面积*/

/*我说过我们需要在外面安排两个“警卫*/

int curbox[5][5];/*当前下落的盒子*/

int curx,cury/*保存当前活动框在地图上的位置*/

int next box[5][5];/*容纳下一个形状的盒子*/

/*这只是几个方框和坐标*/

/*这里有七个标准的俄罗斯方块图形格子,会复制到相应的方框*/*...:) */

Int box[MAX_C][5][5] = {/*MAX_C(7)预定义框*/

{

{0,0,0,0,0},

{0,0,0,0,0},

{1,1,1,1,0},

{0,0,0,0,0},

{0,0,0,0,0}

},

{

{0,0,0,0,0},

{0,0,1,0,0},

{0,1,1,1,0},

{0,0,0,0,0},

{0,0,0,0,0}

},

{

{0,0,0,0,0},

{0,1,1,0,0},

{0,0,1,1,0},

{0,0,0,0,0},

{0,0,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,0}

},

{

{0,0,0,0,0},

{0,1,1,0,0},

{0,0,1,0,0},

{0,0,1,0,0},

{0,0,0,0,0}

},

{

{0,0,0,0,0},

{0,0,1,1,0},

{0,0,1,0,0},

{0,0,1,0,0},

{0,0,0,0,0}

},

{

{0,0,0,0,0},

{0,0,1,1,0},

{0,0,1,1,0},

{0,0,0,0,0},

{0,0,0,0,0}

}

};

/******************************************************\

*时钟*

\******************************************************/

/*时钟部分也很好理解,一个用来设置时钟,一个用来测试时钟激活状态*/

定时器tDown/*正常的下降定时时钟间隔将会更大*/

定时器tFast/*按下KEY_DOWN时使用快速下降*/

int speed = 13;/*控制下降时间间隔*/

#定义快速_INTV 1 /*快速时钟的间隔*/

Int GetTickCount() {/*读取BIOS时钟*/

int ret

ret = peek(0x0,0x46e);/*实际在0:046e读取内存内容*/

ret & lt& lt= 8;/*这个地方是$ % # $ $ % &;^*/

ret += peek(0x0,0x 46c);/*新东西那么多,找几本书看看*/

返回(ret);

}

int setTimer(Timer *t,unsigned int intv,BOOL en) {

t->;enabled = en/*设置时钟*/

t->;intervel = intv

t->;last time = GetTickCount();/*lasttime记录最后的*/

/* What /*tickcount返回*/

/*因此,当再次测试时间时,新tickcount会生成它。减去最后一次tickcount得到一个时间间隔,可以与intervel进行比较,以确定它是否被激活*/

返回0;

}

Boolstesttimer (timer * t) {/*以上六行解释:)*/

无符号int tmp,dt;

如果(!(t->;enabled))返回FALSE

tmp = GetTickCount();

dt = tmp-(t-& gt;last time);

if(dt & gt;= t->;intervel) {

t->;lasttime = tmp

返回TRUE

}

返回FALSE

}

void渲染(void) {

int x,y;

静态int c page = 0;/*当前页面,使用*/

#define STARTX 50 /*定义几个常量*/

#定义STARTY 0

#定义镜头18

setactivepage(cPage=(cPage == 0?1:0));/*选择页面*/

clear device();/*清空屏幕*/

set color(15);

矩形(STARTX + LEN * 2 - 2,

STARTY + LEN * 3 - 2

STARTX + LEN * (MAX_X - 2) + 2,

STARTY+LEN *(MAX _ Y-2)+2);

/*用白色画出轮廓*/

setfillstyle(SOLID_FILL,5);

for(y = 3;y & ltMAX _ Y-2;Y++) {/*画地图*/

for(x = 2;x & ltMAX _ X-2;x++) {

if(map[y][x]) {

矩形(x * LEN + STARTX,

y * LEN + STARTY,

x * LEN + STARTX + LEN,

y * LEN+STARTY+LEN);

bar( x * LEN + STARTX + 1,

y * LEN + STARTY + 1,

x * LEN + STARTX + LEN - 2,

y * LEN+STARTY+LEN-2);

}

}

}

/*不要把画图操作介绍的太复杂,只是为了写作*/

/*在上面的段落中,根据局部地图上的点阵将地图反映到屏幕上*/

for(y = 0;y & lt5;Y++) {/*画落体*/

for(x = 0;x & lt5;x++) {

if(curbox[y][x]) {

if(y+cury & gt;2) {

矩形((x + curx) * LEN + STARTX,

(y + cury) * LEN + STARTY,

(x + curx) * LEN + STARTX + LEN,

(y+cury)* LEN+STARTY+LEN);

bar((x+curx)* LEN+STARTX+1,

(y + cury) * LEN + STARTY + 1,

(x + curx) * LEN + STARTX + LEN - 2,

(y+cury)* LEN+STARTY+LEN-2);

}

}

}

}

/*根据下落框在地图上的坐标,将下落框绘制到相应的区域*/

for(y = 0;y & lt5;Y++) {/*画下一个*/

for(x = 0;x & lt5;x++) {

if(nextbox[y][x]) {

矩形(x * LEN + 320,

y * LEN + 10,

x * LEN + 338,

y * LEN+28);

bar( x * LEN + 321,

y * LEN + 11,

x * LEN + 336,

y * LEN+26);

}

}

}

/*这将绘制下一个框的预览*/

setvisual page(c page);/*确保在页面中绘制*/

/*展示它*/

}

/******************************************************\

*初始化部分*

\******************************************************/

/*提供newGame()来初始化新游戏*/

Void initMap(void) {/*初始化映射*/

int x,y;/*我们需要一圈警卫...*/

for(y = 0;y & ltMAX _ Y;y++) {

for(x = 0;x & ltMAX _ X;x++) {

if(x & lt;2 | | x & gtMAX _ X-3 | | y & gt;MAX_Y - 3)

map[y][x]= 1;

else map[y][x]= 0;

}

}/*此形状在此处初始化*/

}/*当然没有封面...*/

Void newGame() {/*创建新游戏*/

int x,y;

init map();/*初始化映射*/

srand(GetTickCount());/*初始化随机生成器*/

rebidnext();/*创建下一个*/

setTimer(& amp;tDown,速度,1);/*开始时钟(快速和慢速)*/

setTimer(& amp;tFast,FAST_INTV,1);

new fall();/*操作跌落箱*/

/*所以第一个下落的方块在地图的顶部准备好了*/

}

/******************************************************\

*核心功能*

\******************************************************/

void rotate box(int box 1[5][5],int box2[5][5]) {

/*旋转box1并输出到box2*/

int x,y;

for(x = 0;x & lt5;X++) /*这个函数可能需要实际的*/

for(y = 4;y & gt= 0;Y-)/*写出来打动*/

box 2[y][x]= box 1[x][4-y];

}

Void rebuidNext() {/* *创建下一个形状并将其放入nextbox */

int i,x,y;

I = random(MAX _ C);/*选择几个方块中的一个*/

for(y = 0;y & lt5;Y++) /*并复制它*/

for(x = 0;x & lt5;x++)

next box[y][x]= box[I][y][x];/*复制*/

}

Int drop() {/*行踪,返回成功或失败*/

int newy/*盒子将放置的新位置*/

newy = cury+1;/*是当前的Y位置+1*/

if(test(curx,newy,curbox)) {

cury = newy/*测试箱在这个位置*/

返回1;/*有冲突吗?如果没有,*/

}/*直接设置cury */*/

返回0;

}

Void putBox() {/*在地图上填充边界框*/

int x,y;

for(y = 0;y & lt5;Y++) /*这个也简单,主要是对root */

for(x = 0;x & lt5;X++) /*根据curx,cury表示位置*/

if(curbox[y][x])

map[y+cury][x+curx]= curbox[y][x];

}

Void clear() {/*清除整行*/

/*这个函数其实效率很低,简单来说。

从头到尾都经过测试*/

/*具体算法是:从第0行到最后一行,测试地图格子是否满,如果满,从当前行开始,上面的地图下降一行*/

int x,y;

int dx,dy;

int完整标志;

for(y = 0;y & ltMAX _ Y-2;Y++) {/*最后两行是保留的*/

完整标志= 1;/*假设已满*/

for(x = 2;x & ltMAX _ X-2;X++) {/*保留列~ */

如果(!map[y][x]) {

完整标志= 0;

打破;

}

}

If(fullflag) {/*下移一行*/

for(dy = y;dy & gt0;dy -)

for(dx = 2;dx & ltMAX _ X-2;dx++)

map[dy][dx]= map[dy-1][dx];

for(dx = 2;dx & ltMAX _ X-2;dx++)

map[0][dx]= 0;

/*并清除第一行*/

}

}

}

Int move(int dir) {/*返回成功或失败*/

int newx

if(dir)newx = curx+1;

/*像drop一样,准备好移动的坐标*/

else newx = curx-1;

If(test(newx,cury,curbox)) {/*测试是否有冲突*/

curx = newx/*开关curx*/

返回1;

}

返回0;

}

int test(int mx,int my,int box[5][5]) {

/*测试盒子是否能降落在mx,我在地图中的位置*/*这是最关键的函数,判断是否有非空冲突*/*但是算法还是很简单的*/

int x,y;

for(y = 0;y & lt5;y++)

for(x = 0;x & lt5;x++)

if(map[y+my][x+MX]& amp;& amp方框[y][x])

返回0;

返回1;

}

int rotate() {

int x,y;

int newbox[5][5];/*我们必须将当前框旋转到新框*/

/*再次测试这个新盒子的冲突*/

rotateBox(curbox,new box);/*转到新框*/

if(test(curx,cury,newbox)) {

/*并且新框可以放在地图上不冲突*/

for(y = 0;y & lt5;y++)

for(x = 0;x & lt5;x++)

curbox[y][x]= new box[y][x];/*复制到*/

返回1;

}

否则返回0;

}

Int newfall() {/*无法创建下降元素。返回0*/

int x,y;

curx = MAX _ X/2-2;/*重新分配小方框的位置*/

cury = 0;

for(y = 0;y & lt5;y++)

for(x = 0;x & lt5;x++)

curbox[y][x]= next box[y][x];/*复制下一个框*/

rebidnext();/*重建nextBox*/

返回测试(curx、cury、curbox);

}

/************************************************************\

*主要功能-整个游戏架构*

\************************************************************/

int main() {

char键;/*记录当前按键*/

int I;

int gd = VGA,gm = VGAMED/*初始化图形模式*/

Timer * ptDown/*时钟下降(快或慢)*/

定时器趋势器;/*以免渲染给程序造成太大负担*/

/*用时钟控制渲染速度*/*设置为interval = 1,*/*所以是18 FPS,当然达不到标准的60 FPS...毕竟是DOS...*/

setTimer(& amp;趋势者,1,1);

init graph(& amp;gd,& ampgm,“”;/*初始化图形*/

new game();/*新游戏...*/

While(1) {/*主游戏循环*/

If(kbhit()) {/*如果按下键盘*/

key = getch();/*将键值读取到key*/

}

else key = 0;

开关(键){/*判断读取键*/

案例索引_UP:

rotate();/*,旋转下拉框*/

打破;

案例关键点_向下:

ptDown = & amptFast/*使用tFast时钟*/

打破;

案例关键字_左:

移动(0);/*向左移动*/

打破;

案例关键字_右:

移动(1);/*向右移动*/

打破;

案例键_ESC:

closegraph();/*结束游戏*/

退出(0);

默认值:

ptDown = & amptDown/*使用原始速度*/

}

If(testTimer(ptDown)) {/*已经在上面设置了行踪。

使用的时钟在ptDown */中

如果(!Drop()) {/* falls,0*/

putBox();/*写在地图上*/

clear();/*清除整行*/

如果(!Newfall()) {/*创建新的掉落,如果失败,游戏结束*/

closegraph();

退出(0);

}

}

}

if(testTimer(& amp;Trender)) /*最后...提供;给予...*/

render();

}

}。

/*本节目结束*/

我用Turbo C运行,因为它总是说我语法错误。但我就是不知道怎么了。请帮我运行一下,帮我看看哪里出了问题。我非常感激!!!!谢谢你