debug了几天,求高人解决这段程序的问题。
/*****************************************************************************\ * *
* RusBlock_Rewrite.c *
* *
* Developed by Yagami_Tao *
* *
\*****************************************************************************/
/*
*ATTENTION!
*MAIN PROBLEM CONTAINING WITH RUSBLOCK:
*1,DeleteLine();
*2,GameOver();
*3,DropBlock();
*4,DropBlockPreview();
*5,Initial_G();
*6,KeyAction();
*7,Socor();
*/
/*
* This Program is Written at 2011.4.30.
* Have a good time.
*/
/*Some Statement and Defination and Include Before Running Program*/
#include <stdio.h>
#include <bios.h>
#include <dos.h>
#include <stdlib.h>
#include <graphics.h>
#ifdef __cplusplus
# define __CPPARGS ...
#else
# define __CPPARGS
#endif
#define BLOCKSIZE 20
#define VITUAL_COLOR RED
#define BK_COLOR YELLOW
#define MATRIX (block_window[i][j])
#define MATRIX_SUB (block_preview_window[i][j])
#define POINTER ((draw_window == "block_window") ? block_window : block_preview_window)
#define UP 0x4800/*chage shape*/
#define DOWN 0x5000/*drop block imediatilly*/
#define LEFT 0x4b00/*control block to left*/
#define RIGHT 0x4d00/*control block to right*/
#define SPACE 0x3920/*drop block faster*/
#define ENTER 0x1c0d/*pause game and resume game*/
#define ESC 0x011b/*exit game*/
#define BLOCK_J 3
#define BLOCK_I 1
#define WIDTH 12
#define HIGH 22
#define BLANK 50
int dropnow = 0;
int block_j,block_i;
int block_shape;
int block_color;
int block_preview_shape;
int block_preview_color;
struct window {
int left;
int top;
int right;
int bottom;
int sign;
int color;
};
struct window block_window[HIGH][WIDTH];
struct window block_preview_window[6][6];
int block_model[7][4][4] =
{
{{0,0,0,1},
{0,0,0,1},
{0,0,0,1},
{0,0,0,1}},
{{0,1,1,1},
{0,0,1,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,1,1},
{0,0,1,0},
{0,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,1},
{0,0,1,1},
{0,0,1,0},
{0,0,0,0}},
{{0,0,1,0},
{0,0,1,1},
{0,0,0,1},
{0,0,0,0}}
};
/*Function Defination Before Main Function*/
void delete_line(int line)
{
int j;
while(line > 0)
{
/*move line*/
for(j = 1; j <WIDTH-1; j++)
{
block_window[line][j].sign = block_window[line-1][j].sign;
block_window[line][j].color = block_window[line-1][j].color;
if(line == 1)
{
block_window[line][j].sign = 0;
block_window[line][j].color = BLANK;
}
}
/*draw line*/
for(j = 1; j < WIDTH-1; j++)
{
if(block_window[line][j].sign || line == 1)
{
setfillstyle(SOLID_FILL, block_window[line][j].color);
bar(block_window[line][j].left, \
block_window[line][j].top, \
block_window[line][j].right, \
block_window[line][j].bottom);
}
}
/**/
line--;
}
}
int Full_Scan(void)
{
int i,j;
int full_line = 0;
int full_sign = 1;
/*scanning*/
for(i = 1; i < HIGH - 1 && full_sign; i++)
{
for(j = 1; j < WIDTH - 1; j++)
{
if(!block_window[i][j].sign)
full_sign = 0;
}
if(full_sign)
{
full_line = i;
full_sign = 0;
}
else
full_sign = 1;
}
return full_line;
}
void Draw_Artist(char *draw_window, int draw_shape, int draw_color, int draw_j, int draw_i)
{
int i,j;
setfillstyle(SOLID_FILL,draw_color);
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
{
if(block_model[draw_shape][i][j])
{
bar(POINTER[i+draw_i][j+draw_j].left, \
POINTER[i+draw_i][j+draw_j].top, \
POINTER[i+draw_i][j+draw_j].right, \
POINTER[i+draw_i][j+draw_j].bottom);
POINTER[i+draw_i][j+draw_j].color = draw_color;
if(draw_color == BLANK)
POINTER[i+draw_i][j+draw_j].sign = 0;
else
POINTER[i+draw_i][j+draw_j].sign = 1;
}
}
}
void DrawBlock(int b_j, int b_i, int b_shape, int b_color)
{
Draw_Artist("block_window",b_shape,BLANK,b_j,b_i);
Draw_Artist("block_window",b_shape,b_color,b_j,b_i);
}
void DrawBlockPreview(int b_shape, int b_p_shape, int b_p_color)
{
Draw_Artist("preview_window",b_shape,BLANK,1,1);
Draw_Artist("preview_window",b_p_shape,b_p_color,1,1);
}
void Initial_G(int gmode,int gdriver)
{
int errcode;
registerbgidriver(EGAVGA_driver);
initgraph(&gmode,&gdriver,"");
errcode = graphresult();
if(errcode != grOk)
{
printf("What The Fuck!You know what i mean??\n");
printf("%s\n",grapherrormsg(errcode));
while(!bioskey(1));
exit(1);
}
}
void Initial_Window(void)
{
int i,j;
setbkcolor(BK_COLOR);
for(i = 0; i < HIGH; i++)
for(j = 0; j < WIDTH; j++)
{
block_window[i][j].left = 10 + BLOCKSIZE * j ;
block_window[i][j].top = 10 + BLOCKSIZE * i;
block_window[i][j].right = 30 + BLOCKSIZE * j;
block_window[i][j].bottom = 30 + BLOCKSIZE * i;
block_window[i][j].sign = 0;
block_window[i][j].color = VITUAL_COLOR;
}
for(i = 0; i < 6; i++)
for(j = 0; j < 6; j++)
{
block_preview_window[i][j].left = 280 + BLOCKSIZE * j ;
block_preview_window[i][j].top = 10 + BLOCKSIZE * i;
block_preview_window[i][j].right = 300 + BLOCKSIZE * j;
block_preview_window[i][j].bottom = 30 + BLOCKSIZE * i;
block_preview_window[i][j].sign = 0;
block_preview_window[i][j].color = VITUAL_COLOR;
}
for(i = 0, j = WIDTH; i < HIGH; i++)
{
block_window[i][0].sign = 1;
block_window[i][j-1].sign = 1;
}
for(i = 0, j = 6; i < 6; i++)
{
block_preview_window[i][0].sign = 1;
block_preview_window[i][j-1].sign = 1;
}
for(j = 0, i = HIGH; j < WIDTH; j++)
{
block_window[0][j].sign = 1;
block_window[i-1][j].sign = 1;
}
for(j = 0, i = 6; j < 6; j++)
{
block_preview_window[0][j].sign = 1;
block_preview_window[i-1][j].sign = 1;
}
/*draw window*/
for(i = 0; i < HIGH; i++)
for(j = 0; j < WIDTH; j++)
{
if(MATRIX.sign == 1)
setfillstyle(SOLID_FILL,MATRIX.color);
else
setfillstyle(SOLID_FILL,BLANK);
bar(MATRIX.left,MATRIX.top,MATRIX.right,MATRIX.bottom);
}
for(i = 0; i < 6; i++)
for(j = 0; j <6; j++)
{
if(MATRIX_SUB.sign == 1)
setfillstyle(SOLID_FILL,MATRIX_SUB.color);
else
setfillstyle(SOLID_FILL,BLANK);
bar(MATRIX_SUB.left,MATRIX_SUB.top,MATRIX_SUB.right,MATRIX_SUB.bottom);
}
}
void Random_B(int *shape, int *color)
{
randomize();
*shape = random(6);
do {
*color = rand();
} while(*color == BLANK);
}
void Draw_NB(void)/*bug this function!*/
{
block_shape = block_preview_shape;
block_color = block_preview_color;
DrawBlock(block_j, block_i, block_shape, block_color);
Random_B(&block_preview_shape,&block_preview_color);
DrawBlockPreview(block_shape,block_preview_shape,block_preview_color);
}
int dropable(void)
{
int i,j;
int dropable_value = 1;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
{
if(block_model[block_shape][i][j])
block_window[i+block_i][j+block_j].sign = 0;
}
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
{
if(block_model[block_shape][i][j] && block_window[i+block_i+1][j+block_j].sign)
dropable_value = 0;
}
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
{
if(block_model[block_shape][i][j])
block_window[i+block_i][j+block_j].sign = 1;
}
return dropable_value;
}
void DropBlock(int b_j, int b_i)
{
int i,j;
setfillstyle(SOLID_FILL,BLANK);/*destory virtual block*/
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
{
if(block_window[i+b_i][j+b_j].sign)
{
bar(block_window[i+b_i][j+b_j].left,\
block_window[i+b_i][j+b_j].top,\
block_window[i+b_i][j+b_j].right,\
block_window[i+b_i][j+b_j].bottom);
block_window[i+b_i][j+b_j].sign = 0;
block_window[i+b_i][j+b_j].color = BLANK;
}
}
Draw_Artist("block_window",block_shape,block_color,b_j,b_i + 1);
block_i += 1;
}
#define TIMER 0x1c /*interrupt function*/
void interrupt (*oldhandler)(__CPPARGS);
void interrupt DropNow_If(__CPPARGS)
{
static int counter = 0;
if(++counter > 10)
{
dropnow = 1;
counter = 0;
}
oldhandler();
}
void DropNow_Begin(void interrupt ( *handler)(__CPPARGS))
{
oldhandler = getvect(TIMER);
disable();
setvect(TIMER,handler);
enable();
}
/*Main Function*/
int main(void)
{
/*some defination*/
int key_value;
/*initialize graphic layer*/
Initial_G(VGA,VGAHI);
Initial_Window();
block_j = BLOCK_J;
block_i = BLOCK_I;
Random_B(&block_preview_shape, &block_preview_color);
Draw_NB();
DropNow_Begin(DropNow_If);
/*
*main circle in running
*only exit when gameover
*/
while(!gameover())
{
/*keyaction scanning and operation*/
if(bioskey(1))
{
key_value = bioskey(0);
KeyAction(key_value);
if() /*full line?*/
{
/*delete line*/
/*socor*/
}
}
/*drop block in 1 sencond*/
if(dropnow)
{
dropnow = 0;
if(dropable()) /*dropable?*/
{
DropBlock(block_j,block_i);/*drop block*/
}
else
{
block_j = BLOCK_J;
block_i = BLOCK_I;
Draw_NB();/*draw a new block*/
}
while(Full_Scan()) /*full line?*/
{
delete_line(Full_Scan()); /*delete line*/
/*socor increase*/
}
}
}
/*gameover and some operation*/
}
/*The End*/