This repository has been archived on 2024-01-06. You can view files and clone it, but cannot push or open issues or pull requests.
justhomework/MCU/MCU_REAL_FINAL/block.c

332 lines
6.8 KiB
C
Raw Normal View History

#include "block.h"
#include "draw.h"
#include "button.h"
#include <reg52.h>
2022-06-06 12:06:14 +00:00
#include "delay.h"
#include "eeprom.h"
2022-06-07 13:45:23 +00:00
extern unsigned int bestScore[];
char base[MAX_X][MAX_Y] = {0}; //x*y //0Ϊ<30><CEAA><31><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><32><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern unsigned int score;
2022-06-06 06:27:04 +00:00
extern enum OPR opr;
enum GS blockGameStatus = __idle;
void blockInit()
{
2022-06-07 13:45:23 +00:00
score = 0;
blockGameStatus = start;
}
void blockDestroy()
{
memset(base, 0, sizeof(base));
blockGameStatus = over;
}
void genPiece()
{
char i, j;
2022-06-06 06:27:04 +00:00
//<2F><>Ҫһ<D2AA><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int random = TH0 % 10;
if(blockGameStatus == over)
return;
2022-06-06 06:27:04 +00:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵķ<C9B5><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i = 0; i < MAX_X; i++)
for(j = 0; j < MAX_Y; j++)
if(base[i][j] == 2)
return;
2022-06-06 06:27:04 +00:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(random == 0)
{
base[4][9] = 2;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//<2F><><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if(random == 9)
{
base[3][10] = 2;
base[4][10] = 2;
2022-06-06 06:27:04 +00:00
base[3][9] = 2;
base[4][9] = 2;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>
unsigned char isIegal(char i, char j)
{
2022-06-06 09:10:00 +00:00
if(i >= 0 && i < MAX_X && j >= 0 && j < MAX_Y && base[i][j] != 1)
return 1;
return 0;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD>
void dropPiece()
{
char i, j, flag = 0;
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ񴥵<C7B7>
for(i = 0; i < MAX_X; i++)
{
for(j = 0; j < MAX_Y; j++)
{
if(flag == 1)
break;
if(base[i][j] == 2)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(flag == 0 && (base[i][j - 1] == 1 || j == 0))
{
flag = 1;
break;
}
}
}
if(flag == 1)
break;
}
//ת<><D7AA>Ƕ<EFBFBD><C7B6>
for(i = 0; i < MAX_X; i++)
{
for(j = 0; j < MAX_Y; j++)
{
if(base[i][j] == 2)
{
2022-06-06 06:27:04 +00:00
//<2F>ޱ<EFBFBD><DEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(flag == 0 && isIegal(i, j - 1))
{
base[i][j - 1] = 2;
base[i][j] = 0;
}
2022-06-06 06:27:04 +00:00
//<2F>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
else if(flag == 1)
2022-06-07 13:45:23 +00:00
{
score++;
base[i][j] = 1;
}
}
}
}
}
//<2F><><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>
2022-06-06 06:27:04 +00:00
void moveLeftPiece()
{
2022-06-06 06:27:04 +00:00
char i, j;
if(blockGameStatus == over)
return;
for(i = 0; i < MAX_X; i++)
for(j = 0; j < MAX_Y; j++)
2022-06-06 09:01:36 +00:00
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)
{
2022-06-06 06:27:04 +00:00
base[i - 1][j] = 2;
base[i][j] = 0;
}
}
2022-06-06 06:27:04 +00:00
void moveRightPiece()
2022-06-06 06:27:04 +00:00
{
char i, j;
if(blockGameStatus == over)
return;
2022-06-06 06:27:04 +00:00
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 )
2022-06-06 06:27:04 +00:00
{
base[i + 1][j] = 2;
base[i][j] = 0;
}
}
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void judgeBlock()
{
char i, j, k, h, count;
if(blockGameStatus == over)
return;
//<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
for(j = 0; j < MAX_Y; j++)
{
count = 0;
for(i = 0; i < MAX_X; i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(base[i][j] == 1)
{
count++;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(count == 8)
{
2022-06-07 13:45:23 +00:00
score = score + 10;
blockGameStatus = good;
for(k = 0; k < MAX_X; k++)
for(h = j ; h < MAX_Y - 1; h++)
base[k][h] = base[k][h + 1];
}
}
}
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
void blockGameOver()
{
2022-06-07 13:45:23 +00:00
char j, i;
if(blockGameStatus == over)
return;
for(j = 0; j < MAX_X; j++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
if(base[j][7] == 1)
{
blockGameStatus = over;
break;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(blockGameStatus == over)
{
2022-06-07 13:45:23 +00:00
//д<><D0B4><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>
if(addBest(score))
{
IapEraseSector(IAP_ADDRESS);
IapProgramByte(IAP_ADDRESS + 0, bestScore[0] >> 8);
IapProgramByte(IAP_ADDRESS + 1, bestScore[0] % 256);
IapProgramByte(IAP_ADDRESS + 2, bestScore[1] >> 8);
IapProgramByte(IAP_ADDRESS + 3, bestScore[1] % 256);
IapProgramByte(IAP_ADDRESS + 4, bestScore[2] >> 8);
IapProgramByte(IAP_ADDRESS + 5, bestScore[2] % 256);
IapProgramByte(IAP_ADDRESS + 6, bestScore[3] >> 8);
IapProgramByte(IAP_ADDRESS + 7, bestScore[3] % 256);
IapProgramByte(IAP_ADDRESS + 8, bestScore[4] >> 8);
IapProgramByte(IAP_ADDRESS + 9, bestScore[4] % 256);
IapProgramByte(IAP_ADDRESS + 10, bestScore[5] >> 8);
IapProgramByte(IAP_ADDRESS + 11, bestScore[5] % 256);
IapProgramByte(IAP_ADDRESS + 12, bestScore[6] >> 8);
IapProgramByte(IAP_ADDRESS + 13, bestScore[6] % 256);
IapProgramByte(IAP_ADDRESS + 14, bestScore[7] >> 8);
IapProgramByte(IAP_ADDRESS + 15, bestScore[7] % 256);
IapProgramByte(IAP_ADDRESS + 16, bestScore[8] >> 8);
IapProgramByte(IAP_ADDRESS + 17, bestScore[8] % 256);
IapProgramByte(IAP_ADDRESS + 18, bestScore[9] >> 8);
IapProgramByte(IAP_ADDRESS + 19, bestScore[9] % 256);
}
for(j = 0; j < MAX_Y; j++)
for(i = 0; i < MAX_X; i++)
2022-06-07 13:45:23 +00:00
{
//<2F>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>Ч<EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD><CFB2>Ч<EFBFBD><D0A7>
delayms(10);
base[i][j] = 1;
placeIMG_BLOCK(i, j);
}
}
}
unsigned int addBest(unsigned int s)
{
int i, j;
for(i = 0; i < 10; i++)
if(bestScore[i] < s)
{
for(j = 9; j > i; j--)
bestScore[j] = bestScore[j - 1];
bestScore[i] = s;
return 1;
}
return 0;
}
void saveBest()
{
unsigned int i;
IapEraseSector(IAP_ADDRESS);
delayms(20);
for(i = 0; i++; i < 10)
{
IapProgramByte(IAP_ADDRESS + 2 * i, bestScore[i] >> 8);
IapProgramByte(IAP_ADDRESS + 2 * i + 1, bestScore[i] - (bestScore[i] >> 4) << 8);
}
}
void readBest()
{
unsigned int i;
for(i = 0; i++; i < 10)
{
bestScore[i] = (unsigned int)IapReadByte(IAP_ADDRESS + 2 * i) << 8 + (unsigned int)IapReadByte(IAP_ADDRESS + 2 * i + 1);
}
2022-06-06 06:27:04 +00:00
}