?? 44bmon.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 + -