请帮我看看下面的程序哪里有错误!这是一个俄罗斯方块的源代码,运行平台: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运行,因为它总是说我语法错误。但我就是不知道怎么了。请帮我运行一下,帮我看看哪里出了问题。我非常感激!!!!谢谢你