#include "block.h" #include "draw.h" #include "button.h" #include #include "delay.h" char base[MAX_X][MAX_Y] = {0}; //x*y //0为空 1为下落完成 2为正在下落 extern unsigned char score; extern enum OPR opr; enum GS blockGameStatus = __idle; void blockInit() { blockGameStatus = start; } void blockDestroy() { memset(base, 0, sizeof(base)); blockGameStatus = over; } void genPiece() { char i, j; //需要一点随机性 int random = TH0 % 10; if(blockGameStatus == over) return; //若存在尚未下落完成的方块则打断 for(i = 0; i < MAX_X; i++) for(j = 0; j < MAX_Y; j++) if(base[i][j] == 2) return; //当两个方块的情况 if(random == 0) { base[4][9] = 2; } //当两个方块的情况 if(random == 1 || random == 2) { base[4][9] = 2; // base[4][10] = 2; // } else if(random == 3) { base[3][9] = 2; //// base[4][9] = 2; } //当三个方块的情况 else if(random == 4 || random == 5) { base[4][11] = 2; base[4][10] = 2; base[4][9] = 2; } else if(random == 6) { base[3][9] = 2; base[4][9] = 2; base[5][9] = 2; } else if(random == 7) { base[3][10] = 2; base[3][9] = 2; base[4][9] = 2; } else if (random == 8) { base[4][9] = 2; base[3][9] = 2; base[4][9] = 2; } //当四个方块的情况 else if(random == 9) { base[3][10] = 2; base[4][10] = 2; base[3][9] = 2; base[4][9] = 2; } } //动作是否在屏幕内 unsigned char isIegal(char i, char j) { if(i >= 0 && i < MAX_X && j >= 0 && j < MAX_Y && base[i][j] != 1) return 1; return 0; } //方块绘制 void drawBlock() { char i, j; for(i = 0; i < 8; i++) for(j = 0; j < 8; j++) if(base[i][j] != 0) placeIMG_BLOCK(i, j); else placeVOID_BLOCK(i, j); } //方块下落与合并 void dropPiece() { char i, j, flag = 0; //检测是否触底 for(i = 0; i < MAX_X; i++) { for(j = 0; j < MAX_Y; j++) { if(flag == 1) break; if(base[i][j] == 2) { //若触底,做标记 if(flag == 0 && (base[i][j - 1] == 1 || j == 0)) { flag = 1; break; } } } if(flag == 1) break; } //转换嵌套 for(i = 0; i < MAX_X; i++) { for(j = 0; j < MAX_Y; j++) { if(base[i][j] == 2) { //无标记则下落 if(flag == 0 && isIegal(i, j - 1)) { base[i][j - 1] = 2; base[i][j] = 0; } //有标记则转换 else if(flag == 1) base[i][j] = 1; } } } } //方块平移 void moveLeftPiece() { char i, j; if(blockGameStatus == over) return; for(i = 0; i < MAX_X; i++) for(j = 0; j < MAX_Y; j++) if(base[i][j] == 2 && !isIegal(i - 1, j)) { return; } for(i = 0; i < MAX_X; i++) for(j = 0; j < MAX_Y; j++) if(base[i][j] == 2) { base[i - 1][j] = 2; base[i][j] = 0; } } void moveRightPiece() { char i, j; if(blockGameStatus == over) return; for(i = MAX_X - 1; i >= 0; i--) for(j = MAX_Y - 1; j >= 0; j--) if(base[i][j] == 2 && !isIegal(i + 1, j)) { return; } for(i = MAX_X - 1; i >= 0; i--) for(j = MAX_Y - 1; j >= 0; j--) if(base[i][j] == 2 ) { base[i + 1][j] = 2; base[i][j] = 0; } } //判断是否游戏结束/分数增加 void judgeBlock() { char i, j, k, h, count; if(blockGameStatus == over) return; //逐行扫描 for(j = 0; j < MAX_Y; j++) { count = 0; for(i = 0; i < MAX_X; i++) { //有则计数 if(base[i][j] == 1) { count++; } } //计数足则整体下移 if(count == 8) { score++; blockGameStatus = good; for(k = 0; k < MAX_X; k++) for(h = j ; h < MAX_Y - 1; h++) base[k][h] = base[k][h + 1]; } } } void blockGameOver() { char j,i; if(blockGameStatus == over) return; for(j = 0; j < MAX_X; j++) { //满足此条件则游戏结束 if(base[j][7] == 1) { blockGameStatus = over; break; } } //结束则填满 if(blockGameStatus == over) { for(j = 0; j < MAX_Y; j++) for(i = 0; i < MAX_X; i++) { //此处看似降低效率,但其实是为了增加喜剧效果 delayms(10); base[i][j]=1; placeIMG_BLOCK(i, j); } } }