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

📄 eluosi.h

📁 俄罗斯方块的MSP430F449系列的LCD以及点阵按键的代码.
💻 H
📖 第 1 页 / 共 2 页
字号:
		    break;
		
		case 1:							/*    1, 1 */
		    PIECE->data[2][1] = 1; PIECE->data[2][2] = 1;	/* 1, 1    */
	    	    PIECE->data[3][0] = 1; PIECE->data[3][1] = 1;
		    PIECE->max_x = 11;
		    break;
	    }
	    break;

	case 3:							/* 2个方向 */						
	    switch(Direction)
	    {
		case 0:							/*    1 */
		    PIECE->data[1][1] = 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 1:							/* 1, 1    */
		    PIECE->data[2][0] = 1; PIECE->data[2][1] = 1;	/*    1, 1 */
	    	    PIECE->data[3][1] = 1; PIECE->data[3][2] = 1;
		    PIECE->max_x = 11;
		    break;
	    }
	    break;

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

	case 5:								/* 4个方向 */						
	    switch(Direction)
	    {
		case 0:							/* 1, 1 */
		    PIECE->data[1][0] = 1; PIECE->data[1][1] = 1;	/*    1 */
	    	    PIECE->data[2][1] = 1; PIECE->data[3][1] = 1;	/*    1 */
		    PIECE->max_x = 12;
		    break;
		
		case 1:							/*       1 */
		    PIECE->data[2][2] = 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 2:							/* 1    */
		    PIECE->data[1][0] = 1; PIECE->data[2][0] = 1;	/* 1    */
	    	    PIECE->data[3][0] = 1; PIECE->data[3][1] = 1;	/* 1, 1 */
		    PIECE->max_x = 12;
		    break;

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

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

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

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

    return 1;
}

void Show_piece(void)
{
    BYTE i, j;

    for (i = 0; i < 4; i++)
    {
	for (j = 0; j < 4; j++)
	{
	    if (PIECE->data2[i][j] == 1)
	    {
	    	ELS_dot(PIECE->x0+j, PIECE->y0+i-3, CLEAR);
	    }
	}
    }

    for (i = 0; i < 4; i++)
    {
	for (j = 0; j < 4; j++)
	{
	    if (PIECE->data[i][j] == 1)
	    {
	    	ELS_dot(PIECE->x1+j, PIECE->y1+i-3, DRAW);
	    }
	    
	    PIECE->data2[i][j] = PIECE->data[i][j];
	}
    }

    PIECE->x0 = PIECE->x1;				/* 改变方块位置 */
    PIECE->y0 = PIECE->y1;
}

BYTE LR_boolean(BYTE LR)
{
    BYTE i, j, TF;
   
    TF = 1;

    if (LR == 0)				/* 判断左移 */
    {
	for (i = 0; i < 4; i++)
	{
	    for (j = 0; j < 2; j++)
	    {
	    	if (PIECE->data[i][j] && ELSboard[PIECE->y1+i-3][PIECE->x1+j-1])
	    	{
		    TF = 0;
		    goto OVER;
	    	}
	    }
	}
    }
    else					/* 判断右移 */
    {
	for (i = 0; i < 4; i++)
	{
	    for (j = 3; j > -1; j--)
	    {
		if (PIECE->data[i][j] && ELSboard[PIECE->y1+i-3][PIECE->x1+j+1])
		{
		    TF = 0;
		    goto OVER;
		}
	    }
	}
    }

    OVER:
    return TF;
}

void Ocopy_board(BYTE Fstart)
{
    BYTE i, j;

    for (i = Fstart; i > 3; i--)
    {
	for (j = 0; j < 14; j++)	
	{
	    ELSboard[i][j] = ELSboard[i-1][j];
	    
	    if (ELSboard[i][j])
	    {
		ELS_dot(j, i, DRAW);
	    }
	    else
	    {
		ELS_dot(j, i, CLEAR);
	    }
	}
    }
}


void Play_piece()
{
    BYTE i, j, EXIT, FULL;
    BYTE Del_key, Direc;

    EXIT = Direc = 0;
    
    while(!EXIT)
    {
	Show_piece();					/* 显示方块 */

    	for (i = 0; i < Delay_time; i++)		/* 分割延时,使键盘能实时响应。最好做成中断 */
	{
	    rest(1);					/* 延时 */

	    if (flag)
	    {	
		switch(readkey())			/* 获取按键盘 */
		{
		    case LEFT:
			if (PIECE->x1 > 0 && LR_boolean(0))
			{
			    PIECE->x1--;
			    Show_piece();
			}
			break;

		    case RIGHT:
			if (PIECE->x1 < PIECE->max_x && LR_boolean(1))
			{
			    PIECE->x1++;
			    Show_piece();
			}
			break;

		    case UP:
			Direc++;

			if (Direc > 3)
			{
			    Direc = 0;
			}
		
			if (Give_value(PIECE->Category, Direc))
			{	
			    Show_piece();
			}
			else
			{
			    Direc--;
			}

			break;

		   case DOWN:
			Delay_time /= 2;
			break;

		   case ESC:
			EXIT = 1;
			break;
		}
	    }
	}
	
	Delay_time = 500;

     	PIECE->y1++;					/* 向下移动 */


	/* 判断情况 */
	for (i = 0; i < 4; i++)
	{
	    for (j = 0; j < 4; j++)
	    {
		if (PIECE->data[i][j] && ELSboard[PIECE->y1+i-3][PIECE->x1+j])
		{
		    Del_key = 1;			/* 说明有可能填满 */
		    break;
		}
	    }
	}


	if (Del_key)
	{
	    if (PIECE->y1 == 4)
	    {
		goto OVER;
	    }

	    for (i = 0; i < 4; i++)			/* 填充方块区 */
	    {
		for (j = 0; j < 4; j++)
	    	{
		    if (PIECE->data[i][j])
		    {
			ELSboard[PIECE->y1+i-4][PIECE->x1+j] = 1;
		    }
		}
	    }
		
	    /* 删除添满楼层 */
	    for (i = PIECE->y1-1; i > 3; i--)
	    {
		FULL = 0;

		for (j = 0; j < 14; j++)
		{
		    if (ELSboard[i][j])
		    {
			FULL++;
			
			if (FULL == 14)
			{
			    Ocopy_board(i);
			    i++;
			}
		    }
		    else
		    {
			break;	
		    }
		}
	    }

	    Del_key = 0;
	    Again_piece();
	}
    }

    OVER: ;
}


void drawmat(BYTE *mat,BYTE matsize,BYTE x,BYTE y,BYTE color)
/*依次:字模指针、点阵大小、起始坐标(x,y)、颜色*/
{
  BYTE i, j, k, n;
  n = (matsize - 1) / 8 + 1;
  for(j = 0; j < matsize; j++)
    for(i = 0; i < n; i++)
      for(k = 0;k < 8; k++)
        if(mat[j * n + i] & (0x80 >> k))  /*测试为1的位则显示*/
          Pixel(x + i * 8 + k, y + j, color);
}


void main(void)
{
    install_keyboard();
    Box(0, 0, 63, 127, CLEAR);    	/* 清屏幕 */
    Box(2, 30, 61, 113, DRAW); 		/* 画方块区边框 */ 

    Creat_piece();


    Play_piece();				/* 开始游戏 */

    
    
    Delete_piece();				/* 销毁方块,退出游戏 */

    while(!get_click()) ;
}
END_OF_MAIN();

⌨️ 快捷键说明

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