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

📄 mst705Ȧ

📁 MST705源代码
💻
📖 第 1 页 / 共 2 页
字号:

#define  _GAME_C_
#include <stdlib.h>
#include "types.h"
#include "board.h"
#include "global.h"
#include "keypaddef.h"
#include "menu.h"
#include "adjust.h"
#include "ms_reg.h"
#include "msosd.h"
#include "power.h"
#include "misc.h"
#include "autofunc.h"
#include "nvram.h"
#include "userpref.h"
#include "panel.h"
#include "mstar.h"
#include "ms_rwreg.h"
#include "adjust.h"
#include "mcu.h"
#include "menustr.h"
#include "msAce.h"
#include "menufunc.h"
#include "Game.h"
#include "keypad.h"
#include "menustr.h"
#include "debug.h"
#if GAME_ENABLE

/********************定义全局变量*****************************/
XDATA BYTE Game_gridMatrix[MaxColume][MaxLine];/*网格数组,0表示该格无方块,1则有运动方块,2则有静止方块*/
XDATA BYTE TempMatrix[3][3];
XDATA WORD Score;
/**************************定义每种方块的形状***********************************/
BYTE code Game_I_SHAPE1[3][3]=	{0,1,0,
							       0,1,0,
								0,1,0
							       }; //*
BYTE code Game_I_SHAPE2[3][3]={0,0,0,
							       1,1,1,
								0,0,0
							     };
BYTE code Game_O_SHAPE[3][3]= {0,0,0,
							       0,1,1,
								0,1,1
							     };
BYTE code Game_SO_SHAPE[3][3]= {0,0,0,
							       0,0,0,
								0,0,1
							       };
BYTE code Game_T_SHAPE1[3][3]={
								0,0,0,
								1,1,1,
							       0,1,0
							     };
BYTE code Game_T_SHAPE2[3][3]={0,1,0,
							       1,1,0,
								0,1,0
							     };
BYTE code Game_T_SHAPE3[3][3]={0,1,0,
							       1,1,1,
								0,0,0
							     };
BYTE code Game_T_SHAPE4[3][3]={0,1,0,
							       0,1,1,
								0,1,0
							     };
BYTE code Game_L_SHAPE1[3][3]={0,1,0,
							       0,1,0,
								0,1,1
							     };
BYTE code Game_L_SHAPE2[3][3]={0,0,0,
							       1,1,1,
								1,0,0
							     };
BYTE code Game_L_SHAPE3[3][3]={1,1,0,
							       0,1,0,
								0,1,0
							     };
BYTE code Game_L_SHAPE4[3][3]={0,0,1,
							       1,1,1,
								0,0,0
							     };
BYTE code Game_Z_SHAPE1[3][3]={1,0,0,
							       0,1,0,
								0,0,0
							     };
BYTE code Game_Z_SHAPE2[3][3]={0,1,0,
							       1,0,0,
								0,0,0
							     };
//=======================================================================
void Game_MenuExec(void)
{
 BYTE i,j;

    Osd_SetTextColor(CP_BlueColor, CP_TransparenceColor);
    for(i=0;i<=MaxColume+10;i++)
 		for(j=MinLine;j<MinLine+2;j++)
			Osd_DrawStr(i,j,"\x089");

    Osd_SetTextColor(CP_BlackColor, CP_TransparenceColor);
    for(i=0;i<=MaxColume;i++)
 		for(j=MinLine+2;j<MaxLine;j++)
			Osd_DrawStr(i,j,"\x089");

    Osd_SetTextColor(CP_YellowColor, CP_BlackColor);
     i=MinColume-1;
 		for(j=MinLine+2;j<MaxLine;j++)
			Osd_DrawStr(i,j,"\x08A");
     i=MaxColume;
 		for(j=MinLine+2;j<MaxLine;j++)
			Osd_DrawStr(i,j,"\x08A");

    Osd_SetTextColor(CP_GreenColor, CP_SeaBlueColor);
    Osd_DrawStr(MaxColume+1,MinLine+2,"  TETRIS  ");
    Osd_SetTextColor(CP_YellowColor, CP_SeaBlueColor);
    Osd_DrawStr(MaxColume+1,MaxLine-5,"CH    TURN");
    Osd_DrawStr(MaxColume+3,MaxLine-5,"\x08B");
    Osd_DrawStr(MaxColume+1,MaxLine-4,"CH    DOWN");
    Osd_DrawStr(MaxColume+3,MaxLine-4,"\x08C");
    Osd_DrawStr(MaxColume+1,MaxLine-3,"VOL-: LEFT");
    Osd_DrawStr(MaxColume+1,MaxLine-2,"VOL :RIGHT");
    Osd_DrawStr(MaxColume+4,MaxLine-2,"\x08D");
    Osd_DrawStr(MaxColume+1,MaxLine-1,"POWER:EXIT");

    Osd_SetTextColor(CP_PinkColor, CP_SeaBlueColor);
     for(i=MaxColume+1;i<MaxColume+11;i++)
 		for(j=MinLine+3;j<MinLine+7;j++)
			Osd_DrawStr(i,j,"\x089");

    Osd_SetTextColor(CP_RedColor, CP_PinkColor);
     Osd_DrawStr(MaxColume+4,MinLine+3,"NEXT");

    Osd_SetTextColor(CP_YellowColor, CP_RedColor);
     Osd_DrawStr(MaxColume+1,MaxLine-6,"SCORE     ");

   Game_draw_score();
}

void Game_draw_score(void)
{

BYTE GameNum0,GameNum1,GameNum2;
        if(Score>999)
			Score=999;

	GameNum0=Score/100;
	GameNum1=(Score%100)/10;
	GameNum2=Score%10;

	Osd_SetTextColor(CP_YellowColor, CP_RedColor);
	DrawNum(MaxColume+7,MaxLine-6,1,GameNum0);
	DrawNum(MaxColume+8,MaxLine-6,1,GameNum1);
	DrawNum(MaxColume+9,MaxLine-6,1,GameNum2);

}

void Game_draw_next(Gameblock drblock)
{
BYTE i,j;

      Game_get_matrix(drblock);

      Osd_SetTextColor(CP_RedColor, CP_PinkColor);

	   for(i=0;i<3;i++)
 		for(j=0;j<3;j++)
 		{
			Osd_DrawStr(MaxColume+4+i,MinLine+4+j,"\x088");
		}

      Osd_SetTextColor(drblock.color, CP_PinkColor);

	   for(i=0;i<3;i++)
 		for(j=0;j<3;j++)
 		{
 			if(TempMatrix[i][j]==1)
					Osd_DrawStr(MaxColume+4+i,MinLine+4+j,"\x087");
		}

}

void Game_restart(void)
{
BYTE i,j;

	    Osd_SetTextColor(CP_SeaBlueColor, CP_SeaBlueColor);
	    for(i=MinColume;i<MaxColume;i++)
 		for(j=MinLine+2;j<MaxLine;j++)
			Osd_DrawStr(i,j,"\x089");

	    Osd_SetTextColor(CP_YellowColor, CP_SeaBlueColor);
    	    Osd_DrawStr(MinColume-1,MaxLine-6,"Game Over");
}

void Game_copy_matrix(BYTE Copy[3][3], BYTE Result[3][3])
{
	BYTE i,j;

	    for(i=0;i<3;i++)
 		for(j=0;j<3;j++)
 		{
		Result[i][j]=Copy[i][j];
 		}
}


void Game_get_matrix(Gameblock nblock)
{
  switch(nblock.type)
  {
  case CP_Gameblock_I:
  	 if(nblock.shape==1)
	 	Game_copy_matrix(Game_I_SHAPE1,TempMatrix);
        if(nblock.shape==2)
		Game_copy_matrix(Game_I_SHAPE2,TempMatrix);
  break;

  case CP_Gameblock_O:
	 	Game_copy_matrix(Game_O_SHAPE,TempMatrix);
  break;

  case CP_Gameblock_SO:
		Game_copy_matrix(Game_SO_SHAPE,TempMatrix);
  break;

  case CP_Gameblock_T:
   	switch(nblock.shape)
      {
      	case(1):
		Game_copy_matrix(Game_T_SHAPE1,TempMatrix);
       break;
      case(2):
	 	Game_copy_matrix(Game_T_SHAPE2,TempMatrix);
	break;
       case(3):
	   	Game_copy_matrix(Game_T_SHAPE3,TempMatrix);
		break;
       case(4):
		Game_copy_matrix(Game_T_SHAPE4,TempMatrix);
		break;
	default:
  		break;
      }
      break;

  case CP_Gameblock_L:
   	switch(nblock.shape)
      {
      	case(1):
		Game_copy_matrix(Game_L_SHAPE1,TempMatrix);
       break;
      case(2):
	 	Game_copy_matrix(Game_L_SHAPE2,TempMatrix);
	break;
       case(3):
	   	Game_copy_matrix(Game_L_SHAPE3,TempMatrix);
		break;
       case(4):
		Game_copy_matrix(Game_L_SHAPE4,TempMatrix);
		break;
	default:
  		break;
      }
      break;

   case CP_Gameblock_Z:
  	 if(nblock.shape==1)
	 	Game_copy_matrix(Game_Z_SHAPE1,TempMatrix);
        if(nblock.shape==2)
		Game_copy_matrix(Game_Z_SHAPE2,TempMatrix);
  break;
  default:
  	break;
  }

}


void  Game_draw_block(Gameblock drblock)
{
BYTE i,j;

      Game_get_matrix(drblock);

      Osd_SetTextColor(drblock.color, CP_BlackColor);
	   for(i=0;i<3;i++)
 		for(j=0;j<3;j++)
 		{
 			if(TempMatrix[i][j]==1)
 				{
 			       if(drblock.y+j>MinLine+1)
				Osd_DrawStr(drblock.x+i,drblock.y+j,"\x087");
				Game_gridMatrix[drblock.x+i][drblock.y+j]=1;
 				}
		}

}



void Game_clear_block(Gameblock drblock)
{
BYTE i,j;

	Game_get_matrix(drblock);

	   for(i=0;i<3;i++)
 		for(j=0;j<3;j++)
 		{
 			if(TempMatrix[i][j]==1)
 				{
 				if(drblock.y+j>MinLine+1)
				Osd_DrawStr(drblock.x+i,drblock.y+j,"\x088");
			       Game_gridMatrix[drblock.x+i][drblock.y+j]=0;
 				}
		}

}

BOOL Game_check_top(Gameblock nblock)
{
BYTE i;
BOOL Flag_1=FALSE;

	for(i=1;i<MaxColume;i++)
		{
		if(Game_gridMatrix[i][nblock.y+2]==1)
			Flag_1=TRUE;
		}
	return Flag_1;
}



BOOL Game_check_lborder(Gameblock nblock)
{
BYTE i,j;
	       Game_get_matrix(nblock);
		for(j=0;j<3;j++)
 			for(i=0;i<3;i++)
 		{
 			if(TempMatrix[i][j]==1)
 				{
 				BOOL Flag_1=FALSE;

 				if((nblock.x+i-1<MinColume)||(Game_gridMatrix[nblock.x+i-1][nblock.y+j]==1))
					Flag_1=TRUE;
				if(Flag_1)
					return TRUE;
				else
					break;
 				}
 		}
  	return FALSE;
}

BOOL Game_check_rborder(Gameblock nblock)
{
BYTE i,j;
	       Game_get_matrix(nblock);
		for(j=0;j<3;j++)
 			for(i=2;i>=0;i--)
 		{
 			if(TempMatrix[i][j]==1)
 				{
 				BOOL Flag_1=FALSE;

 				if((nblock.x+i+1==MaxColume)||(Game_gridMatrix[nblock.x+i+1][nblock.y+j]==1))
					Flag_1=TRUE;
				if(Flag_1)
					return TRUE;
				else
					break;
 				}
 		}
  	return FALSE;
}

BOOL Game_check_bottom(Gameblock nblock)
{
BYTE i,j;
	       Game_get_matrix(nblock);
		for(i=0;i<3;i++)
 			for(j=2;j>=0;j--)
 		{
 			if(TempMatrix[i][j]==1)
 				{
 				BOOL Flag_1=FALSE;
				if(i>3||j>3) //yurian
					break;
 				if((nblock.y+j+1==MaxLine)||(Game_gridMatrix[nblock.x+i][nblock.y+j+1]==1))
					Flag_1=TRUE;
				if(Flag_1)
					return TRUE;
				else
					break;
 				}
 		}

		return FALSE;
}

BOOL Game_check_change(Gameblock nblock)
{

⌨️ 快捷键说明

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