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

📄 44bmon.c

📁 44boX下的俄罗斯方块,大家自己加载头文件再编译
💻 C
字号:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "option.h"
#include "def.h"
#include "44b.h"
#include "44blib.h"

#include "lcd.h"
#include "lcdlib.h"
#include "glib.h"
#include "Slib.h"

extern int Image$$RO$$Limit;
extern int Image$$RW$$Base;

#define 	DefaultX 5 
#define 	DefaultY 1 



TIME_STRUC SysTime;


int		 		Speed=0,ranum=0,gamestart=0; 
int 			CEr=0; 
char 			NewShape[2]; 
unsigned		PerOnce[4]; 
unsigned long 	TotalMark=0; 
unsigned int 	Erasered=0,ETimes=0; 
int 			NumOfLev[5]={0,0,0,0,0}; 
int 			TimeDelay[10]={10,8,7,6,5,4,3,2,1,1}; 
int CurrentShape,x=6,y=0,Status=0; 	

static unsigned int	counter=0; 
static unsigned int shape[7][4][4][4]={ 
{ 
	{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}}, 
	{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}}, 
	{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}}, 
	{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}}, 
}, 
{ 
	{{0,0,0,0},{1,1,1,1},{0,0,0,0},{0,0,0,0}}, 
	{{0,0,1,0},{0,0,1,0},{0,0,1,0},{0,0,1,0}}, 
	{{0,0,0,0},{1,1,1,1},{0,0,0,0},{0,0,0,0}}, 
	{{0,0,1,0},{0,0,1,0},{0,0,1,0},{0,0,1,0}}, 
}, 
{ 
	{{0,1,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}}, 
	{{0,1,0,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}}, 
	{{0,0,0,0},{1,1,1,0},{0,1,0,0},{0,0,0,0}}, 
	{{0,1,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}}, 
}, 
{ 
	{{1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}}, 
	{{0,0,0,0},{0,1,1,0},{1,1,0,0},{0,0,0,0}}, 
	{{1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}}, 
	{{0,0,0,0},{0,1,1,0},{1,1,0,0},{0,0,0,0}}, 
}, 
{ 
	{{0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}}, 
	{{0,0,0,0},{1,1,0,0},{0,1,1,0},{0,0,0,0}}, 
	{{0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}}, 
	{{0,0,0,0},{1,1,0,0},{0,1,1,0},{0,0,0,0}}, 
}, 
{ 
	{{1,0,0,0},{1,0,0,0},{1,1,0,0},{0,0,0,0}}, 
	{{0,0,0,0},{1,1,1,0},{1,0,0,0},{0,0,0,0}}, 
	{{1,1,0,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}}, 
	{{0,0,0,0},{0,0,1,0},{1,1,1,0},{0,0,0,0}}, 
}, 
{ 
	{{0,1,0,0},{0,1,0,0},{1,1,0,0},{0,0,0,0}}, 
	{{0,0,0,0},{1,0,0,0},{1,1,1,0},{0,0,0,0}}, 
	{{1,1,0,0},{1,0,0,0},{1,0,0,0},{0,0,0,0}}, 
	{{0,0,0,0},{1,1,1,0},{0,0,1,0},{0,0,0,0}}, 
}, 
}; 

unsigned back[28][14] ={
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
			{1,1,1,1,1,1,1,1,1,1,1,1,1,1}}; 
//*******************************************************
int randnum[70]={121,132,250,15,304,154,70,145,406,145,
		         145,143,20,121,131,78,18,98,19,50,
		         506,60,71,76,16,507,16,40,155,40,
		         30,132,30,40,551,80,81,90,30,31,
		         430,41,20,176,607,51,40,14,303,51,
		         143,430,340,14,65,165,57,156,570,571,
		         157,1567,50,570,17,560,51,460,451,50,
		         };
		    
 int  GoDown(int a,int b,int c,int d ) ;
void __irq Timer_Tick(void)
{	
         
    ++counter; 

	if((counter%=TimeDelay[Speed])==(TimeDelay[Speed]-1)) 

	{ 
	y=GoDown(x,y,CurrentShape,Status); 
	counter=0; 
	} 
	 rI_ISPC=BIT_TIMER3; 
  
}
void Timer_Init(void)
{

    rTCFG0=0x00000f00;	//dead zone=0,pre2=0,pre1=0xf,pre0=0
    rTCFG1=0x00001000;	//all interrupt,mux5=1/2,mux2=1/2,mux3=1/4,mux2=1/2,mux1=1/2,mux0=1/2
    
    rTCNTB3=0xc350;		//(1/(60MHz/4/15))*0xc350=50ms
    					//(1/(60MHz/4/15))*0x4320=20ms
    rTCMPB3=0x0;

    rTCON=0x0020000;	//update T3
    rTCON=0x0090000;	//T3=auto reload,start	
    
    rINTCON=0x5;    //Non-vectored,IRQ enable,FIQ disable 
    rINTMOD=0x0;    //All=IRQ mode
    
    pISR_TIMER3=(unsigned)Timer_Tick;
 
    rINTMSK=~(BIT_GLOBAL|BIT_TIMER3);	//start timer INT
}



//*******************************************************

void end() 
{ 
	int i,j;
	rINTMSK=BIT_GLOBAL;
	// rINTMSK=(BIT_GLOBAL|BIT_TIMER3);
	gamestart=0;
	for(i=0;i<27;i++) 
	{
	  for(j=1;j<13;j++) 
	  { 
	  back[i][j]=0;
	 	 
	  }
	}
	
	Slib_ClearScr();
	Slib_SetCursor(2,10);
	Slib_Printf("***GAME OVER!***");
	Slib_SetCursor(8,1);
	Slib_Printf("\n*******www.arm88.com制作********");
	Slib_Printf("\n***   俄罗斯方块    游戏    ****");
	Slib_Printf("\n*** 请按电脑上键盘来测试    ****");
	Slib_Printf("\n*** h往左 k往右 j变形 m往下 ****");
	Slib_Printf("\n********************************");
	 
	
} 
//*******************************************************

void DrawShape(int x,int y) 
{

	U8 i;

	for (i=0;i<4;i++)

	frameBuffer1[y*4+i][(unsigned char)(x/8)] |=(U32)(0x0f << (4*(7-(x%8))));

}

void DrawNull(int x,int y) 
{ 
	U8 i;
	for (i=0;i<4;i++)
	frameBuffer1[y*4+i][(unsigned char)(x/8)] &= ~((U32)(0x0f << (4*(7-(x%8)))));

		
} 
//*******************************************************
void show(int x,int y,int CurrentShape,int Status) 
{ 
 	int i,j,l,p;
 	rINTMSK=BIT_GLOBAL;
	for(i=0;i<27;i++) 
	{
	  for(j=1;j<13;j++) 
	  { 
	  if(back[i][j]==1) 
	  DrawShape(2+j,2+i); 
	  else 
	  DrawNull(2+j,2+i); 
	}
	}

	for( l=0;l<4;l++) 
	{
	  for( p=0;p<4;p++) 
	  { 

	
	  if(shape[CurrentShape][Status][p][l]==1) 
	  DrawShape(2+l+x,2+p+y); 
	  }

	} 
	rINTMSK=~(BIT_GLOBAL|BIT_TIMER3);	
} 
//*******************************************************
void DrawScore(void) 
{ 
	Slib_SetCursor(2,10);
	Slib_Printf("你的得分: %d  分",Erasered);
	Slib_SetCursor(3,10);
	Slib_Printf("现在速度: %d  级",Speed);

} 

void random(void)
{
	
	RtcGetTime(&SysTime);	
	srand( SysTime.sec);
	
}
//*******************************************************
int CreateNewShape() 
{ 
	ranum++;
	if(ranum==50)
	{
	ranum=0;
	random();
	}	
	NewShape[1]=rand()%7;
	return NewShape[1]; 
} 
//*******************************************************
int Possible(int x,int y,int CurrentShape,int Status) 
{ 
	int i,j;
	for( i=0;i<4;i++) 
	{ 
	for( j=0;j<4;j++) 
	{ 
	if(shape[CurrentShape][Status][i][j]+back[y+i][x+j]==2) 

	return 0; 
	} 
	} 
	return 1; 
} 
//*******************************************************
 int GoLeft(int x,int y,int CurrentShape,int Status) 
{ 
	if(Possible(x-1,y,CurrentShape,Status)) 
	{
	x--; 
	show(x,y,CurrentShape,Status); 
	
	}  
	 return x;
} 
//*******************************************************
int GoRight(int x,int y,int CurrentShape,int Status) 
{ 
	if(Possible(x+1,y,CurrentShape,Status)) 
	x++; 
	show(x,y,CurrentShape,Status); 
	 return x;
} 
//*******************************************************
 int  GoDown(int a,int b,int c,int d ) 
{ 
	int i,j,r,l,rr,ll;
	int AllAreOne=1,temp=0; 
	if(Possible(a,b+1,c,d)) 
	{ 
	b++; 
	show(a,b,c,d); 
	return b; 
	} 
	TotalMark+=3*c; 
	for( i=0;i<4;i++) 
	for( j=0;j<4;j++) 
	back[i+b][j+a]+=shape[c][d][i][j]; 
	for( r=1;r<27;r++) 
	{ 
	for( l=1;l<13;l++) 
	{ 
	if(back[r][l]==0) 
	AllAreOne=0; 
	} 
	if(AllAreOne==1) 
	{ 
	for( rr=r;rr>0;rr--) 
	for( ll=1;ll<13;ll++) 
	back[rr][ll]=back[rr-1][ll]; 
	Erasered++; 
	CEr++; 
	temp++; 
	
	} 
	AllAreOne=1; 
	} 
	
	CurrentShape=CreateNewShape(); 
	x=DefaultX;y=DefaultY;Status=0; 
	NumOfLev[temp]++; 
	TotalMark+=5*temp; 
	show(x,y,CurrentShape,Status); 
	counter=0; 
	if(!Possible(x,y,CurrentShape,Status)) 
	{ 
	
	end(); 
	} 
	if(CEr>=30) 
	{ 
	Speed=(Speed+1)%10; 
	CEr/=30; 
	} 

	return y; 
} 
int ChageShape(int x,int y,int CurrentShape,int Status) 
{ 
	if(Possible(x,y,CurrentShape,(Status+1)%4)) 
	{
	Status=(Status+1)%4; 
	show(x,y,CurrentShape,Status); 	 
	}
	return Status;
} 
//*******************************************************
 int  FastDown(int a,int b,int c,int d ) 
{ 
	
	int i,j,r,l,rr,ll;
	int AllAreOne=1,temp=0; 
	
	while(Possible(a,b+1,c,d)) 
	{ 
	b++; 	 
	} 
	show(a,b,c,d); 
	rINTMSK=BIT_GLOBAL;

	for( i=0;i<4;i++) 
	for( j=0;j<4;j++) 
	back[i+b][j+a]+=shape[c][d][i][j]; 
	for( r=1;r<27;r++) 
	{ 
	for( l=1;l<13;l++) 
	{ 
	if(back[r][l]==0) 
	AllAreOne=0; 
	} 
	if(AllAreOne==1) 
	{ 
	for( rr=r;rr>0;rr--) 
	for( ll=1;ll<13;ll++) 
	back[rr][ll]=back[rr-1][ll]; 
	Erasered++; 
	CEr++; 
	temp++; 
	
	} 
	AllAreOne=1; 
	DrawScore();
	} 
	
	CurrentShape=CreateNewShape(); 
	x=DefaultX;y=DefaultY;Status=0; 
	NumOfLev[temp]++; 	
	show(x,y,CurrentShape,Status);	 
	counter=0; 
	
	rINTMSK=~(BIT_GLOBAL|BIT_TIMER3);	
	if(!Possible(x,y,CurrentShape,Status)) 
	{ 
 	
	end(); 
	} 
	if(CEr>=30) 
	{ 
	Speed=(Speed+1)%10; 
	CEr/=30; 
	} 

	return y; 
} 
void DrawFace(void) 
{ 

	int i,j;
			
	for(i=0;i<28;i++) 
	{
	  for(j=0;j<14;j++) 
	  { 
	  if(back[i][j]==1) 
	  DrawShape(2+j,2+i); 
	  else 
	  DrawNull(2+j,2+i); 
	}
	}   

}
void WannaQuit(void) 
{ 

} 
//***************************************************************************



void Main(void)
{	

	unsigned c; 
  
    rSYSCFG = CACHECFG;
    Port_Init();
	ChangePllValue( 24, 3, 1 );		//晶振10MHz,修改系统主频为3.2倍频(32MHz)

   

    Uart_Select(0); 
    Uart_Init(0,57600);

    Delay(1000);
  
    /*******************************/
	Uart_Printf("\n\n*************************************************************************");
	Uart_Printf("\n* http://www.arm88.com");
	Uart_Printf("\n* Date: 2005-6-14"); 
	Uart_Printf("\n* MCLK=%dMHz",MCLK/1000000);  
	
	Uart_Printf("\n* RO_Limit=0x%8x",Image$$RO$$Limit);
	Uart_Printf("\n* RW_BASE =0x%8x",Image$$RW$$Base);
	Uart_Printf("\n********************************");
	Uart_Printf("\n**       俄罗斯方块 游戏      **");   
	Uart_Printf("\n**   请按电脑上的键盘来测试   **");
	Uart_Printf("\n*** h往左 k往右 j变形 m往下 ****");
	Lcd_Init(MODE_MONO);
	Slib_ClearScr();
	Slib_Init();
	Lcd_DispON();
     
	Slib_ClearScr();		 
	Slib_SetCursor(8,1);
	Slib_Printf("\n*******www.arm88.com制作********");
	Slib_Printf("\n***   俄罗斯方块    游戏    ****");
	Slib_Printf("\n*** 请按电脑上键盘来测试    ****");
	Slib_Printf("\n*** h往左 k往右 j变形 m往下 ****");
	Slib_Printf("\n********************************");
	
   

    gamestart=1;	
    RtcGetTime(&SysTime);	
	srand( SysTime.sec);
	
	
	DrawFace(); 

	CurrentShape=CreateNewShape(); 		
	show(x,y,CurrentShape,Status); 
	
	
	Timer_Init();
  
	while( gamestart) 
	{ 
		
	c= Uart_Getch();	
	switch(c) 
	{ 
		
	case 'm' :
				y=FastDown(x,y,CurrentShape,Status);
				break; 
	case 'h' :
				x=GoLeft(x,y,CurrentShape,Status);
				break; 
	case 'k' :
				x=GoRight(x,y,CurrentShape,Status);
				break; 
	case 'j' :
				Status=ChageShape(x,y,CurrentShape,Status);				
				break; 
	case 'u' :
				WannaQuit();
				break;
	default :   break;
	} 
	
	} 

while(1);	
}

//*****************************************************************************
int pIrqStart = 0;
int pIrqHandler = 0;
int pIrqFinish = 0;

⌨️ 快捷键说明

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