⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bricks.c

📁 一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********************************************************
 *  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 + -