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

📄 eluosi.h

📁 俄罗斯方块的MSP430F449系列的LCD以及点阵按键的代码.
💻 H
📖 第 1 页 / 共 2 页
字号:
#include "D:\MSP_H\12864lcd.h"

#define DRAW 	0x00
#define CLEAR	0x01

#define ESC	0x01
#define LEFT    0x07
#define RIGHT	0x09
#define UP	0x05
#define DOWN	0x08



void Pixel(BYTE xx,BYTE yy,BYTE PixelModel);         			/* 底层画点抽像层 */
void Box(BYTE Xbegin,BYTE Ybegin,BYTE Xend,BYTE Yend,BYTE BoxModel,BYTE FillType);	/* 底层矩形抽像层 */ 
 


/* 俄罗斯方块的画点函数,这样构造可以方便实现在不同硬件平台移植,
   此函数是以 4X4 个 DPJ_dot() 像素点为一个点。 */
           	
void ELS_dot(BYTE x, BYTE y, BYTE mode)/* 构造俄罗斯方块的画点函数 */
{
    BYTE dx, dy;

    if (x > -1 && x < 14					
	&& y > -1 && y < 20)					/* 不超出方块显示区域 */
    {
    	dx = x*4 + 4;						/* 抽象方块显示区域(6, 34, 57, 110) */
    	dy = y*4 + 32;

 	Box(dx, dy, dx+3, dy+3, mode);			/* 以 mode 方式画方块点 */
    }
}



typedef struct
{
    BYTE Category;			/* 类型,共7种 */
    BYTE Direction;			/* 朝的方向 */
    BYTE x0, y0, x1, y1;		/* 方块在方块区的位置,左下角 */
    BYTE max_x;				/* 方块能到达方块区的最左端 */		
    BYTE data[4][4], data2[4][4];	/* 方块数据 */
    
} ELSpiece;				/* 俄罗斯方块的有关信息结构 */


void Creat_piece(void);							/* 开辟一个方块 */
void Again_piece(void);							/* 再次放出方块 */
void Delete_piece(void);						/* 释放一个方块内存 */
BYTE Give_value(BYTE Category, BYTE Direction); /* 给方块赋值 */
void Play_piece(void);							/* 开始游戏 */
void Show_piece(void);							/* 显示方块 */
void Ocopy_board(BYTE Fstart);					/* 覆盖方块区 */
BYTE LR_boolean(BYTE LR);						/* 判断左右是否可移动 */
void drawmat(BYTE *mat,BYTE matsize,BYTE x,BYTE y,BYTE color);  /*显示点阵汉字*/
	

void Creat_piece()
{

    PIECE = (ELSpiece *)malloc(sizeof(ELSpiece));		/* 开辟空间 */

    Again_piece();						/* 赋值 */

    Give_value(PIECE->Category, PIECE->Direction);		/* 给方块赋初值 */   
}

void Again_piece()
{
    PIECE->Category = random(6);				/* 随机确定方块类型 */
    PIECE->Direction = random(3);				/* 随机确定方块初始方向 */
    PIECE->x0 = 4;
    PIECE->y0 = 3;
    PIECE->x1 = 4;						/* 初始化方块坐标 */
    PIECE->y1 = 3;

    Give_value(PIECE->Category, PIECE->Direction);	/* 给方块赋初值 */   
}

void Delete_piece()
{
    free(PIECE);
}



BYTE Give_value(BYTE Category, BYTE Direction)
{
    BYTE i, j;

    switch(Category)						/* 方块在方块区的处理 */
    {
	case 1:
	    if ((Direction == 2 || Direction == 0) && (PIECE->x1 > 11))		/* 靠近边框 */
	    {
		return 0;
	    }

	    switch(Direction)
	    {
		case 0:								/* 3 -> 0 的转换 */
		    if (ELSboard[PIECE->y1][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1+2]
			|| ELSboard[PIECE->y1-1][PIECE->x1+2] || ELSboard[PIECE->y1][PIECE->x1+2])
		    {
			return 0;
		    }
		    break;

		case 1:								/* 0 -> 1 的转换 */
		    if (ELSboard[PIECE->y1-1][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1])
		    {
			return 0;
		    }
		    break;

		case 2:								/* 1 -> 2 的转换 */
		    if (ELSboard[PIECE->y1-2][PIECE->x1+1] || ELSboard[PIECE->y1-1][PIECE->x1+2]
			|| ELSboard[PIECE->y1][PIECE->x1+1])
		    {
			return 0;
		    }
		    break;

		case 3:								/* 2 -> 3 的转换 */
		    if (ELSboard[PIECE->y1-2][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1+1]
			|| ELSboard[PIECE->y1][PIECE->x1+2])
		    {
			return 0;
		    }
	    }
	    break;

	case 2:
	    if (Direction > 1)
	    {
		Direction -= 2;
	    }

	    if (Direction == 1 && PIECE->x1 > 11)
	    {
		return 0;
	    }
	
	    switch(Direction)
	    {
		case 0:								/* 1 -> 0 的转换 */
		    if (ELSboard[PIECE->y1-1][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1]
			|| ELSboard[PIECE->y1][PIECE->x1+2])
		    {
			return 0;
		    }
		    break;

		case 1:								/* 0 -> 1 的转换 */
		    if (ELSboard[PIECE->y1][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1+1]
			|| ELSboard[PIECE->y1-1][PIECE->x1+2])
		    {
			return 0;
		    }
		    break;
	    }
	    break;

	case 3:
	    if (Direction > 1)
	    {
		Direction -= 2;
	    }
	
	    if (Direction == 1 && PIECE->x1 > 11)
	    {
		return 0;
	    }

	    switch(Direction)
	    {
		case 0:								/* 1 -> 0 的转换 */
		    if (ELSboard[PIECE->y1][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1]
			|| ELSboard[PIECE->y1-2][PIECE->x1+1])
		    {
			return 0;
		    }
		    break;

		case 1:								/* 0 -> 1 的转换 */
		    if (ELSboard[PIECE->y1][PIECE->x1+1] || ELSboard[PIECE->y1-2][PIECE->x1+2]
			|| ELSboard[PIECE->y1-1][PIECE->x1+2] ||ELSboard[PIECE->y1][PIECE->x1+2])
		    {
			return 0;
		    }
		    break;
	    }	    
	    break;

  	case 4:
	    if (Direction > 1)
	    {
		Direction -= 2;
	    }

	    if (Direction == 1 && PIECE->x1 > 10)
	    {
		return 0;
	    }

	    switch(Direction)
	    {
		case 0:								/* 1 -> 0 的转换 */
		    if (ELSboard[PIECE->y1-3][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1]
			|| ELSboard[PIECE->y1-1][PIECE->x1+1])
		    {
			return 0;
		    }
		    break;

		case 1:								/* 0 -> 1 的转换 */
		    for (j = -1; j < 2; j++)
		    {
		    	for (i = 3; i > j; i--)
		    	{
			    if (ELSboard[PIECE->y1+i][PIECE->x1+1])
			    {
				return 0;
			    }
		    	} 
		    }
		    break;
	    }	    
	    break;

	case 5:
	    if ((Direction == 1 || Direction == 3) && (PIECE->x1 > 11))
	    {
		return 0;
	    }

	    switch(Direction)
	    {
		case 0:								/* 3 -> 0 的转换 */
		    if (ELSboard[PIECE->y1-2][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1+1]
			|| ELSboard[PIECE->y1][PIECE->x1+1] || ELSboard[PIECE->y1][PIECE->x1+2])
		    {
			return 0;
		    }
		    break;

		case 1:								/* 0 -> 1 的转换 */
		    if (ELSboard[PIECE->y1][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1+2]
			|| ELSboard[PIECE->y1-1][PIECE->x1+2] || ELSboard[PIECE->y1][PIECE->x1+2])
		    {
			return 0;
		    }
		    break;

		case 2:								/* 1 -> 2 的转换 */
		    if (ELSboard[PIECE->y1-1][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1])
		    {
			return 0;
		    }
		    break;

		case 3:								/* 2 -> 3 的转换 */
		    if (ELSboard[PIECE->y1-2][PIECE->x1+1] || ELSboard[PIECE->y1-1][PIECE->x1+1]
			|| ELSboard[PIECE->y1-1][PIECE->x1+2])
		    {
			return 0;
		    }
	    }
	    break;

  	case 6:
	    if ((Direction == 1 || Direction == 3) && (PIECE->x1 > 11))
	    {
		return 0;
	    }

	    switch(Direction)
	    {
		case 0:								/* 3 -> 0 的转换 */
		    if (ELSboard[PIECE->y1-2][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1+1])
		    {
			return 0;
		    }
		    break;

		case 1:								/* 0 -> 1 的转换 */
		    if (ELSboard[PIECE->y1-1][PIECE->x1+1] || ELSboard[PIECE->y1-1][PIECE->x1+2]
			|| ELSboard[PIECE->y1][PIECE->x1+2])
		    {
			return 0;
		    }
		    break;

		case 2:								/* 1 -> 2 的转换 */
		    if (ELSboard[PIECE->y1-2][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1+1]
			|| ELSboard[PIECE->y1][PIECE->x1] || ELSboard[PIECE->y1][PIECE->x1+1])
		    {
			return 0;
		    }
		    break;

		case 3:								/* 2 -> 3 的转换 */
		    if (ELSboard[PIECE->y1-1][PIECE->x1] || ELSboard[PIECE->y1-2][PIECE->x1+2]
			|| ELSboard[PIECE->y1-1][PIECE->x1+2] || ELSboard[PIECE->y1][PIECE->x1+2])
		    {
			return 0;
		    }
	    }
	    break;
    }

    PIECE->Direction = Direction;				/* 重新确定方块的方向 */

    for (i = 0; i < 4; i++)					/* 初试化方块数据,全为0 */
    {
	for (j = 0; j < 4; j++)
	{
	    PIECE->data[i][j] = 0;
	}
    }

    switch(Category)						/* 各方块赋值 */
    {
	case 0:							/* 正方块,一个方向 */
	    PIECE->data[2][0] = 1; PIECE->data[2][1] = 1;       /* 1, 1 */
	    PIECE->data[3][0] = 1; PIECE->data[3][1] = 1;	/* 1, 1 */
	    PIECE->max_x = 12;
	    break;

	case 1:							/* 4个方向 */						
	    switch(Direction)
	    {
		case 0:							/*    1    */
		    PIECE->data[2][1] = 1; PIECE->data[3][0] = 1;	/* 1, 1, 1 */
	    	    PIECE->data[3][1] = 1; PIECE->data[3][2] = 1;
		    PIECE->max_x = 11;
		    break;
		
		case 1:							/* 1    */
		    PIECE->data[1][0] = 1; PIECE->data[2][0] = 1;	/* 1, 1 */
	    	    PIECE->data[2][1] = 1; PIECE->data[3][0] = 1;	/* 1    */
		    PIECE->max_x = 12;
		    break;

		case 2:							/* 1, 1, 1 */
		    PIECE->data[2][0] = 1; PIECE->data[2][1] = 1;	/*    1    */
	    	    PIECE->data[2][2] = 1; PIECE->data[3][1] = 1;
		    PIECE->max_x = 11;	
		    break;

		case 3:							/*    1 */
		    PIECE->data[1][1] = 1; PIECE->data[2][0] = 1;	/* 1, 1 */
	    	    PIECE->data[2][1] = 1; PIECE->data[3][1] = 1;	/*    1 */
		    PIECE->max_x = 12;	
		    break;	
	    }
	    break;

     	case 2:							/* 2个方向 */						
	    switch(Direction)
	    {
		case 0:							/* 1    */
		    PIECE->data[1][0] = 1; PIECE->data[2][0] = 1;	/* 1, 1 */
	    	    PIECE->data[2][1] = 1; PIECE->data[3][1] = 1;	/*    1 */
		    PIECE->max_x = 12;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -