📄 bricks.c
字号:
/**********************************************************
* Russian Block v1.o
* programming and graphics by renshaohui
*
*
* 2002/07/12
**********************************************************/
#include <stdio.h>
#include <stdlib.h> //it is differ from template
#include <string.h>
#include <asixwin.h>
#include <asixapp.h>
#include <asixwin\asix_mn.h>
#include <asixwin\select.h>
#include <asixwin\asix_sb.h>
#include <asixwin\asix_lb.h>
#include <asixwin\disp.h>
#include <asixwin\asix_ed.h>
#include <asixwin\asix_key.h>
#include <resource\bitmap.h>
#include <resource\picture.h>
#define KEY_GAP LCD_HEIGHT/40
U8 MapBlock[10][20]; //map take care of it ,for it had been changed from map to MapBlock XXXXXX
U8 block[4][4]; //current block
U8 block_x, block_y; //location of the block
const U16 xPos = 5;
const U16 yPos = 30;
//const U8 xWidth = 100;
//const U8 yHeight = 200;
//const U8 sBricklen = 10;
const U16 xWidth = LCD_WIDTH/2;
const U16 yHeight = LCD_WIDTH;
const U16 sBricklen = LCD_WIDTH/20;
static U8 Speed;
U16 TimeNum;
U16 Score,Dels; //game score and number of rows deleted
U8 current_block;
U8 next_block; //next block to be put
char text[40]; //some text used for using textout
U8 IsChangeScore = 0;
U8 x_size, y_size; //size of the block
U8 MustClearScreen = 0;
static U8 QuitGame = 0;
//U32 scoreout;
struct HiScoreStruct {
int score;
char name[12];
}HiScore; //it may use in future,when the file sys ready
U16 start_level; //start from level selected under options
U16 start_blocks; //number of initial rows on the map
void GenerateNew(U32 hGC) ;
void DrawEmptyBrick(U32 hGC, int x,int y);
void InitGame(void);
extern void RussianBlock( void );
TASKDESCRIPTION RussianBlockTskDesp =
{"堆积木", ASIX_APP, 1, zi_jimu, 4096, 1, LCD_WIDTH, LCD_HEIGHT, RussianBlock, APP_PRI};
U8 Random(U8 x)
{
return rand() % x;
}
void ClearBlock(void)
{
U8 i,j;
for (i=0; i<4; i++)
for (j=0; j<4; j++)
block[i][j] = 0;
}
void GenerateBlock(int kind)
{
ClearBlock();
switch( kind )
{
case 1://反N的四种变形
block[1][0] = block[2][0] = block[0][1] = block[1][1] = 1;
break;
case 11:
block[0][0] = block[0][1] = block[1][1] = block[1][2] = 1;
break;
case 21:
block[1][0] = block[2][0] = block[0][1] = block[1][1] = 1;
break;
case 31:
block[0][0] = block[0][1] = block[1][1] = block[1][2] = 1;
break;
case 2: //正N的四种变形
block[0][0] = block[1][0] = block[1][1] = block[2][1] = 1;
break;
case 12:
block[1][0] = block[1][1] = block[0][1] = block[0][2] = 1;
break;
case 22:
block[0][0] = block[1][0] = block[1][1] = block[2][1] = 1;
break;
case 32:
block[1][0] = block[1][1] = block[0][1] = block[0][2] = 1;
break;
case 3://方块的四种变形
block[0][0] = block[0][1] = block[1][0] = block[1][1] = 1;
break;
case 13:
block[0][0] = block[0][1] = block[1][0] = block[1][1] = 1;
break;
case 23:
block[0][0] = block[0][1] = block[1][0] = block[1][1] = 1;
break;
case 33:
block[0][0] = block[0][1] = block[1][0] = block[1][1] = 1;
break;
case 4://T型的四种变形
block[1][0] = block[0][1] = block[1][1] = block[2][1] = 1;
break;
case 14:
block[0][0] = block[0][1] = block[0][2] = block[1][1] = 1;
break;
case 24:
block[0][0] = block[1][0] = block[2][0] = block[1][1] = 1;
break;
case 34:
block[0][1] = block[1][0] = block[1][1] = block[1][2] = 1;
break;
case 5://L型的四种变换
block[2][0] = block[0][1] = block[1][1] = block[2][1] = 1;
break;
case 15:
block[0][0] = block[0][1] = block[0][2] = block[1][2] = 1;
break;
case 25:
block[0][0] = block[1][0] = block[2][0] = block[0][1] = 1;
break;
case 35:
block[0][0] = block[1][0] = block[1][1] = block[1][2] = 1;
break;
case 6://反L型的变换
block[0][0] = block[0][1] = block[1][1] = block[2][1] = 1;
break;
case 16:
block[0][0] = block[1][0] = block[0][1] = block[0][2] = 1;
break;
case 26:
block[0][0] = block[1][0] = block[2][0] = block[2][1] = 1;
break;
case 36:
block[1][0] = block[1][1] = block[1][2] = block[0][2] = 1;
break;
case 7://长条型的四种变换
block[0][0] = block[1][0] = block[2][0] = block[3][0] = 1;
break;
case 17:
block[0][0] = block[0][1] = block[0][2] = block[0][3] = 1;
break;
case 27:
block[0][0] = block[1][0] = block[2][0] = block[3][0] = 1;
break;
case 37:
block[0][0] = block[0][1] = block[0][2] = block[0][3] = 1;
break;
default: // Error("Unknown element to be generated."); break;
break;
}
if ((kind == 7) || (kind == 27))
{x_size = 4; y_size = 1; }
else if ((kind == 17) || (kind == 37))
{x_size = 1; y_size = 4;}
else if (kind % 10 == 3)
{x_size = 2; y_size = 2; }
else if ((kind / 10 == 0) || (kind / 10 == 2))
{x_size = 3; y_size = 2;}
else if ((kind / 10 == 1) || (kind / 10 == 3))
{x_size = 2; y_size = 3;}
current_block = kind;
}
U8 CanPut(void) //iscanput 判断是否可以移动或放下
{
U8 i,j;
for ( i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
if (block[i][j] == 1)
{
if (block_x + i > 9)
return 0;
if (block_x + i < 0)
return 0;
if (block_y + j > 19)
return 0;
if (MapBlock[block_x+i][block_y+j] == 1)
return 0;//是以列为单位,一列有20个单位
}
}
}
return 1;
}
void DeleteRow()
{
int sum, i, j,k, del = 0;
for (i=19; i>=0; i--)
{ //共有20行,对20进行计算
sum = 0;
for (j=0; j<10; j++)
sum += MapBlock[j][i]; //判断是否一行满了
if (sum == 10)
{
MustClearScreen = 1;
//下移一行所有下移
for (j=i; j>=1; j--)
for (k=0; k<10; k++)
MapBlock[k][j] = MapBlock[k][j-1];
i += 1; //应该是i + = 1;XXXXXX
del++; //累计消去的行数
}
}
Dels += del; //计算消去的行数
if (del > 0)
{
Score += (100*del)+((del-1)*25)+(Dels/10)*25; //计算分值
IsChangeScore = 1;
}
Speed = 25-(Dels/10)*2; //速度提高
if (Speed < 2)
Speed = 2; //This is top level !
}
void RotateBlock(void) //旋转模块
{
U8 old_block = current_block;
current_block += 10;
if (current_block > 40) current_block -= 40;
GenerateBlock(current_block);
if (!CanPut())
{
current_block = old_block;
GenerateBlock(current_block);
}
}
void PutBlock(void)
{
U8 i,j;
for ( i=0; i<4; i++)
{
for ( j=0; j<4; j++)
{
if (block[i][j] == 1)
MapBlock[block_x+i][block_y+j] = block[i][j];
}
}
// if (soundOn) play_sample((SAMPLE*)graphics[MOVE_SOUND].dat, SoundVolume, 125, 1000, FALSE);
DeleteRow();
}
void DrawSmallBrick(U32 hGC, int x,int y)
{
ClearRec(hGC, GPC_BLACK, x, y, sBricklen-1, sBricklen-1, REPLACE_STYLE);
}
void ClearAllOnScreen(U32 hGC)
{
ClearRec(hGC, GPC_WHITE,xPos, yPos, xWidth-1, yHeight-1, REPLACE_STYLE);
}
void ClearLastBrick(U32 hGC)
{
//XXXXX
U16 i,j;
for ( i=0; i<4; i++)
for ( j=0; j<4; j++)
{
if (block[i][j] == 1)
{
DrawEmptyBrick(hGC,xPos+( block_x+i)*sBricklen,yPos+(block_y+j)*sBricklen);
}
}
}
void DrawEmptyBrick(U32 hGC, int x,int y)
{
ClearRec(hGC, GPC_WHITE, x, y, sBricklen, sBricklen, REPLACE_STYLE);//there is differ from the upper
}
void DrawMap(U32 hGC)
{// There still something to added such as
/*
sprintf(text, "%7d", score); //need added XXXXXXX
textout(screen, font, text, 570-text_length(font, text), 50, 15);
sprintf(text, "%7d", dels / 10);
textout(screen, font, text, 570-text_length(font, text), 65, 15);
*/
U8 i,j;
if (MustClearScreen == 1)
{
ClearAllOnScreen(hGC);
}
MustClearScreen = 0;
for ( i=0; i<10; i++)
for (j=0; j<20; j++)
{
if (MapBlock[i][j] == 1)
DrawSmallBrick(hGC,xPos+ i*sBricklen,yPos+j*sBricklen);
}
for ( i=0; i<4; i++)
for ( j=0; j<4; j++)
{
if (block[i][j] == 1)
{
DrawSmallBrick(hGC,xPos+( block_x+i)*sBricklen,yPos+(block_y+j)*sBricklen);
}
}
//sprintf(text, "%d", Score);
}
void NewGame(U32 hGC)
{
U16 i,j;
if (Score > HiScore.score)
HiScore.score = Score;
for ( i=0; i<20; i++)
for ( j=0; j<10; j++)
MapBlock[j][i] = 0; //清楚屏幕
Score = 0;
next_block = Random(7)+1; //随机选一个,而且+1是由于在BLOCK类型含7而不含0的缘故
GenerateNew(hGC); // XXXXXX????
DrawMap(hGC);
Dels = start_level*10;
Speed = 25-(Dels/10)*2; //XXXXX
// text_mode(0);
/* // need changed to add to project
sprintf(text, "Score:");
textout(screen, font, text, 365, 50, 15);
sprintf(text, "Level:");
textout(screen, font, text, 365, 65, 15);
sprintf(text, "High Score: ");
textout(screen, font, text, 365, 80, 15);
sprintf(text, "%7d", HiScore.score);
textout(screen, font, text, 570-text_length(font, text), 80, 15);
*/
for (i=0; i<start_blocks; i++) //new start block,new block map
{
for ( j=0; j<10; j++)
{
if (Random(2)) MapBlock[j][19-i] = 1;
}
}
TimeNum = 0;
sprintf(text, "%d", Score);
}
void ReSetGame(U32 hGC)
{
U16 i,j;
if (Score > HiScore.score)
HiScore.score = Score;
for ( i=0; i<20; i++)
for ( j=0; j<10; j++)
MapBlock[j][i] = 0; //清楚屏幕
Score = 0;
next_block = Random(7)+1; //随机选一个,而且+1是由于在BLOCK类型含7而不含0的缘故
// GenerateNew(hGC); // XXXXXX????
// DrawMap(hGC);
Dels = start_level*10;
Speed = 25-(Dels/10)*2; //XXXXX
// text_mode(0);
/* // need changed to add to project
sprintf(text, "Score:");
textout(screen, font, text, 365, 50, 15);
sprintf(text, "Level:");
textout(screen, font, text, 365, 65, 15);
sprintf(text, "High Score: ");
textout(screen, font, text, 365, 80, 15);
sprintf(text, "%7d", HiScore.score);
textout(screen, font, text, 570-text_length(font, text), 80, 15);
*/
for (i=0; i<start_blocks; i++) //new start block,new block map
{
for ( j=0; j<10; j++)
{
if (Random(2)) MapBlock[j][19-i] = 1;
}
}
TimeNum = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -