?? main.c.bak
字號:
/*
本項目專門為本站的51 PIC AVR 多功能學習開發板而寫,僅供參考,請勿做商業用途,歡迎轉載但要保留本站信息
志博電子專注于8位單片機開發板設計和教學
讓人耳目一心的經濟又豪華型開發板
性價比最高
僅售378!
歡迎訪問我們的網站 www.elecmcu.com
*/
#include"reg52.h" //包含常用的特殊寄存器所在的地址 庫函數 KEIL 提供
#define uchar unsigned char //將常用的數據類型定義
#define uint unsigned int //將常用的數據類型定義
#define bmp_2 1 //定義黑白位圖為1位
#define bmp_16 4 //定義16位彩色位圖為4位
#define bmp_256 8 //定義256色彩色位圖為一個字節(8位)
extern void draw_bmp(uint x,uint y,uchar *p,uchar type);//聲明外部函數draw_bmp在別的文件已經定義過,在本文件中將要凋用到
extern void clean_rec(uint x,uint y,uint w,uint h,uchar color,uchar mode);//聲明外部函數draw_bmp在別的文件已經定義過,在本文件中將要凋用到
extern code uchar qq_ico[5000]; //聲明外部數組test_y_d在別的文件已經定義過,在本文件中將要凋用到 已經在FONT。H中定義過
extern code uchar test_y_z[1000];//聲明外部數組test_y_z在別的文件已經定義過,在本文件中將要凋用到 已經在FONT。H中定義過
extern code uchar test_y_w[8000];//聲明外部數組test_y_w在別的文件已經定義過,在本文件中將要凋用到 已經在FONT。H中定義過
extern code uchar face[6000];
extern code unsigned char els[16][2];//已經在FONT。H中定義過。定義一個16*16黑白點陣所對應的實體象素數據 為各種方快的基本元素
xdata char ext_els_temp[14][21]={0};//定義一個14*21 個字節也就是本游戲的行數和列數 是否有小方塊的中間交換數據 為堆滿一行 清全屏并將所有被清數據的行上所有數據下移一行
xdata uint score=0; //全局變量為目前的得分 分數 堆滿一行自動加一
xdata uchar ext_color=0x88; //方塊顏色
xdata char ext_els[14][21]={0}; //定義一個14*21 個字節也就是本游戲的行數和列數 是否有小方塊的實際數據 為堆滿一行 清全屏并將所有被清數據的行上所有數據下移一行
/*
{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,},
};
*/
//以上數據為對應本游戲中所有方塊的占用情況(調試游戲的各種情況中 測試時使用)雖然凌亂但為調試方便,不刪除。
xdata unsigned char ext_all[8000]; //定義本局游戲所對應的所有坐標點的象素數據 在清全屏 重畫全屏 中使用到
xdata unsigned char els_16_r[1000];//目前方塊4*4個小方塊所對應的象素 使用頻繁每次移動均調用
xdata unsigned char els_16_t[1000];//目前方塊4*4個小方塊所對應的 處理中間象素
xdata unsigned char els_type=1; //當前方塊4*4 小方塊的類型序號
xdata unsigned char els_next=0; //當前方塊4*4 小方塊的變形序號
xdata unsigned char cut_pix[4][4]; //當前方塊在全局背景中所覆蓋掉的背景4*4小方塊數據情況
xdata char abs_x=5; //剛出來的4*4方塊所在的X坐標
xdata char abs_y=0; //剛出來的4*4方塊所在的Y坐標
xdata down_lab=0; //一個標志在一個函數中使用,本來可以做為一個形式參數,函數體可根據本數據做不同的處理。但函數已經下完。為不做大的改動,無奈,做了個全局變量。
xdata uchar gameover=0; //游戲結束標志 結束后置1
extern void delay10ms(void); //一個軟件延遲小函數的聲名在IIC。C中有定義過
extern void display_char(uint x,uint y,uchar *charr,uchar back_color,uchar front_color);//自定義打印函數可以在電視上和PC上的指定行顯示一個長字符串
extern void display_dig(uint num,uint x,uint y,uchar f_color,uchar b_color);//在屏幕上的任意象素位置顯示一個 變量數據 0-65536
code uchar zifu[]="SCORE:";
code uchar qq[]="QQ:157773991"; //俺的QQ號所對應的字符串 在畫屏幕時使用
code uchar http[]="elecmcu.com"; //本站網址所對應的字符串 在畫屏幕時使用
code uchar mcu []="MCU:STC89C516"; //打印所使用的單片機型號
code uchar frq[]= "FRQ: 24 MHZ "; //打印單片機的工作時鐘
code uchar ram[]= "RAM: 32 KB "; //打印單片機使用的外部RAM
code uchar rom[]= "ROM: 64 KB "; //打印單片機使用的內部ROM
code uchar game_over_c[]="GAME OVER !";
code uchar els_p[7][4][4][4]= //聲明一個4維數組 用來存放俄羅斯方塊的各種類型的各種變形所對應的小方塊影射數據
{ //第一維為方塊類型 第二維為方塊的變形序列號 第三維行號 第4維列號
{
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0xff,0xff, //志志志志
},
{
0xff,0x00,0x00,0x00, //博口口口
0xff,0x00,0x00,0x00, //博口口口
0xff,0x00,0x00,0x00, //博口口口
0xff,0x00,0x00,0x00, //博口口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0xff,0xff, //電電電電
},
{
0xff,0x00,0x00,0x00, //子口口口
0xff,0x00,0x00,0x00, //子口口口
0xff,0x00,0x00,0x00, //子口口口
0xff,0x00,0x00,0x00, //子口口口
},
},
////////////////////////////////////////////////////000000000
{
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0x00,0xff,0x00,0x00, //口志口口
0xff,0xff,0xff,0x00, //志志志口
},
{
0x00,0x00,0x00,0x00, //口口口口
0xff,0x00,0x00,0x00, //博口口口
0xff,0xff,0x00,0x00, //博博口口
0xff,0x00,0x00,0x00, //博口口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0xff,0x00, //電電電口
0x00,0xff,0x00,0x00, //口電口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0xff,0x00,0x00, //口子口口
0xff,0xff,0x00,0x00, //子子口口
0x00,0xff,0x00,0x00, //口子口口
},
},
////////////////////////////////////////////////111111111111
{
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0x00,0x00, //志志口口
0xff,0xff,0x00,0x00, //志志口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0x00,0x00, //博博口口
0xff,0xff,0x00,0x00, //博博口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0x00,0x00, //電電口口
0xff,0xff,0x00,0x00, //電電口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0x00,0x00, //子子口口
0xff,0xff,0x00,0x00, //子子口口
},
},
/////////////////////////////////2222222222
{
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0xff,0xff,0x00, //口志志口
0x00,0xff,0x00,0x00, //口志口口
0xff,0xff,0x00,0x00, //志志口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0xff,0x00,0x00,0x00, //博口口口
0xff,0xff,0xff,0x00, //博博博口
0x00,0x00,0xff,0x00, //口口播口
},
{
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0x00,0x00, //電電口口
0x00,0xff,0x00,0x00, //口電口口
0x00,0xff,0xff,0x00, //口電電口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0xff,0x00, //口口子口
0xff,0xff,0xff,0x00, //子子子口
0xff,0x00,0x00,0x00, //子口口口
},
},
//////////////////////////333333333
{
{
0x00,0x00,0x00,0x00, //口口口口
0xff,0x00,0x00,0x00, //志口口口
0xff,0x00,0x00,0x00, //志口口口
0xff,0x00,0x00,0x00, //志口口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0xff,0x00, //博博博口
},
{
0x00,0x00,0x00,0x00, //口口口口
0xff,0x00,0x00,0x00, //電口口口
0xff,0x00,0x00,0x00, //電口口口
0xff,0x00,0x00,0x00, //電口口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //子口口口
0x00,0x00,0x00,0x00, //子口口口
0xff,0xff,0xff,0x00, //子口口口
},
},
/////////////////////////444444444444
{
{
0x00,0x00,0x00,0x00, //口口口口
0xff,0x00,0x00,0x00, //志口口口
0xff,0x00,0x00,0x00, //志口口口
0xff,0xff,0x00,0x00, //志志口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0xff,0x00, //博博博口
0xff,0x00,0x00,0x00, //博口口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0x00,0x00, //電電口口
0x00,0xff,0x00,0x00, //口電口口
0x00,0xff,0x00,0x00, //口電口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0xff,0x00, //口口子口
0xff,0xff,0xff,0x00, //子子子口
},
},
/////////////////////////555555555555555
{
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0xff,0x00, //志志志口
0xff,0x00,0xff,0x00, //志口志口
},
{
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0x00,0x00, //博博口口
0x00,0xff,0x00,0x00, //口博口口
0xff,0xff,0x00,0x00, //博博口口
},
{
0x00,0x00,0x00,0x00, //口口口口
0x00,0x00,0x00,0x00, //口口口口
0xff,0x00,0xff,0x00, //電口電口
0xff,0xff,0xff,0x00, //電電電口
},
{
0x00,0x00,0x00,0x00, //口口口口
0xff,0xff,0x00,0x00, //子子口口
0xff,0x00,0x00,0x00, //子口口口
0xff,0xff,0x00,0x00, //子子口口
},
},
/////////////////////////6666666
};
/********************************************************************
函 數 名:un_pix()
功 能: 將當前方塊和背景方塊結合成一個4*4方塊陣列
說 明:
調 用: down() right() left()
入口參數:無
返 回 值:無
設 計:志博51 AVR PIC 開發板 日 期:2007年11月13日
變 更 日 期:
變 更 備 注:
***********************************************************************/
void un_pix(void)
{
uchar a=0;
uchar b=0;
for(a=0;a<4;a++)
for(b=0;b<4;b++)
if((els_p[els_type][els_next][a][b]!=0)&&(cut_pix[a][b]==0))
cut_pix[a][b]=0xff; //將背景方塊加到當前方塊中,和背景溶為一體
}
/********************************************************************
函 數 名:cut_p()
功 能: 取得當前方塊覆蓋背景方塊情況
說 明:
調 用: down() right() left()
入口參數: 當前絕對坐標 X Y
返 回 值: 無
設 計: 志博51 AVR PIC 開發板 日 期:2007年11月13日
變 更 日 期:
變 更 備 注:
***********************************************************************/
void cut_p(char x,char y)
{
uchar a;
uchar b;
uchar c;
for(a=0;a<4;a++)
for(b=0;b<4;b++)
{
c=ext_els[x+a][y+b];
if((x+a)>13)
c=0x00;
cut_pix[b][a]=c;
}
}
/********************************************************************
函 數 名:make_els_temp()
功 能: 將方塊的占用映射形式(4*4)變為(64*64)實際象素BMP形式
說 明:
調 用: change()
入口參數:
返 回 值: 無
設 計: 志博51 AVR PIC 開發板 日 期:2007年11月13日
變 更 日 期:
變 更 備 注:
***********************************************************************/
void make_els_temp(void)//
{
uchar i=0;
uchar j=0;
uchar temp1=0;
uchar temp2=0;
uchar temp3=0;
uchar k=0;
uchar *p;
uint m=0;
p=els_16_r;
*p=0x00;
*(p+1)=64;
*(p+2)=0x00;
*(p+3)=64;
*(p+4)=ext_color;
*(p+5)=0xff;
p=p+6;
for(i=0;i<4;i++)
{
for(temp1=0;temp1<16;temp1++)
{
for(temp2=0;temp2<4;temp2++)
for(temp3=0;temp3<2;temp3++)
{
if(els_p[els_type][els_next][i][temp2])
//if(cut_pix[i][temp2])
*p=els[temp1][temp3];
else
*p=0x00;
p++;
}
}
}
}
/********************************************************************
函 數 名:cur_with()
功 能: 獲得當前方塊的有效寬度
說 明:
調 用: with()
入口參數:
返 回 值: 前方塊的有效寬度
設 計: 志博51 AVR PIC 開發板 日 期:2007年11月13日
變 更 日 期:
變 更 備 注:
***********************************************************************/
uchar cur_with(void)//
{
int a=0;
int b=0;
for(b=3;b>=0;b--)
for(a=3;a>=0;a--)
{
if(els_p[els_type][els_next][a][b])
return ((b+1));
}
}
uchar with(void)//根據當前方塊的位置取得將要畫方塊的實際寬度(防止跨界)
{
int a=0;
int b=0;
for(b=3;b>=0;b--)
for(a=3;a>=0;a--)
{
if(cut_pix[a][b])
{
if((abs_x+4)<14)
return 4;
return ((b+1));
}
if((a==0)&&(b==0)&&(down_lab))
{
down_lab=0;
return (cur_with());
}////不夠簡潔要重寫
else if((a==0)&&(b==0))
return 1;
}
}
void make_els_cut(void)//將方塊的占用映射形式(4*4)變為(64*64)實際象素BMP形式
{
uchar i=0;
uchar j=0;
uchar w=0;
uchar temp1=0;
uchar temp2=0;
uchar temp3=0;
uchar k=0;
uchar *p;
uint m=0;
w=with();
p=els_16_r;
*p=0x00;
*(p+1)=w*16;
*(p+2)=0x00;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -