?? main.c
字號:
/**********************************************************
*名稱:推箱子游戲V0.1 Beta 1 (以占用3515字節 EPROM空間)
*編程:飛揚
*說明:采用YM12864R液晶(ST7920)+62256+PT6122遙控+AT89S51
*下一個版本增加音效,地圖編輯功能,界面顯示美化,撤銷上一步!
*主要是學習外擴展RAM才搞這個東東! 我使用的是24MHz晶振
*關卡增加到20關
**********************************************************/
#include <at89x52.h>
#include "MAIN.H"
/****** 引腳定義 ******/
sbit Beep = P3^3; //音頻輸出腳
/****** 變量/數組定義 ******/
uchar code logotab[4][17]={
{" "},
{" V0.1 Beta 1 "},
{" 推箱子游戲 "},
{" 編程 飛揚 "}};
//存放遙控接收數據
uchar xdata KeyCoding[4]={0,0,0,0};
//關卡設置
uchar guanka = 0;
//用1024個字節存放動態繪圖數據,我叫它顯存數據
uchar xdata GamePic[1024] _at_ 0x0100; //這里使用了絕對地址
//空(用于清空圖形移動后的痕跡)編號0
uchar code kong[8]={0,0,0,0,0,0,0,0};
//墻壁(用來標識移動的范圍)編號1
uchar code qiang[8]={0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00};
//圓形(箱子要推到的地方)編號2
uchar code yuan[8]={0x3c,0x66,0xc3,0x81,0x81,0xc3,0x66,0x3c};
//箱子(推動的就是他)編號3
uchar code xiangzi[8]={0xff,0x81,0xbd,0xbd,0xbd,0xbd,0x81,0xff};
//娃娃臉(用于推動箱子)編號4
uchar code lian[8]={0x7e,0xff,0xdb,0xff,0xff,0xc3,0xe7,0x7e};
//十字形(箱子推到圓形位置后變為十字形)編號5
uchar code shizi[8]={0x3c,0x3c,0xff,0xff,0xff,0xff,0x3c,0x3c};
//用于計算圖形移動和放置的坐標
//實際存放的是GamePic數組的相應下標
uint code MoveData[64]={
0,1,2,3,4,5,6,7,
128,129,130,131,132,133,134,135,
256,257,258,259,260,261,262,263,
384,385,386,387,388,389,390,391,
512,513,514,515,516,517,518,519,
640,641,642,643,644,645,646,647,
768,769,770,771,772,773,774,775,
896,897,898,899,900,901,902,903
};
/*8X8的游戲地圖數據,同時根據圖形數據判斷娃娃臉是否可以移動,
*箱子是否可以推動,箱子推動的方向是否是墻和箱子,是則不
*能推動!箱子推到的地方是圓形則用十字形替換(將該位置數據換成5),
*推動十字形,則再恢復到箱子的形狀(在換成3).
*空(什么都不顯示)=0,墻=1,圓=2,箱子=3,臉=4,十字=5 */
uchar code GameMap[20][64]={
//第一關
{1,1,1,1,1,1,1,1,
1,0,0,0,1,2,0,1,
1,2,0,0,3,0,0,1,
1,1,3,1,1,0,0,1,
1,0,0,1,1,3,1,1,
1,0,0,4,0,0,0,1,
1,0,2,1,0,0,0,1,
1,1,1,1,1,1,1,1},
//第二關
{1,1,1,1,1,1,1,1,
1,0,0,0,1,0,0,1,
1,0,2,0,3,2,0,1,
1,1,3,1,1,0,0,1,
1,0,0,1,1,3,1,1,
1,0,0,4,0,2,0,1,
1,0,0,1,0,0,0,1,
1,1,1,1,1,1,1,1},
//第三關
{1,1,1,1,1,1,1,1,
1,0,0,0,1,0,0,1,
1,0,0,0,3,0,0,1,
1,0,3,1,1,0,0,1,
1,0,2,1,1,3,1,1,
1,0,2,4,0,0,0,1,
1,0,2,1,0,0,0,1,
1,1,1,1,1,1,1,1},
//第四關
{1,1,1,1,1,1,1,1,
1,0,0,0,1,0,0,1,
1,0,2,0,3,2,0,1,
1,1,3,1,1,0,0,1,
1,0,0,1,1,3,1,1,
1,0,2,4,0,0,0,1,
1,0,0,1,0,0,0,1,
1,1,1,1,1,1,1,1},
//第五關
{1,1,1,1,1,1,1,1,
1,0,0,0,1,0,0,1,
1,0,0,2,3,0,0,1,
1,1,3,1,1,0,0,1,
1,0,2,1,1,3,1,1,
1,0,0,4,2,0,0,1,
1,0,0,1,0,0,0,1,
1,1,1,1,1,1,1,1},
//6
{1,1,1,1,1,1,1,1,
1,0,0,0,1,0,0,1,
1,0,0,0,3,0,0,1,
1,1,5,1,1,0,0,1,
1,0,2,1,1,3,1,1,
1,0,2,4,0,0,0,1,
1,0,0,1,0,0,0,1,
1,1,1,1,1,1,1,1},
//7
{1,1,1,1,1,1,1,1,
1,1,0,1,1,0,2,1,
1,0,0,3,0,0,0,1,
1,4,3,3,0,0,0,1,
1,0,1,0,0,1,0,1,
1,0,1,1,1,1,0,1,
1,2,0,0,0,0,2,1,
1,1,1,1,1,1,1,1},
//8
{1,1,1,1,1,1,1,1,
1,0,0,1,0,0,0,1,
1,0,0,1,0,5,0,1,
1,0,0,1,0,2,1,1,
1,1,0,3,0,0,0,1,
1,0,3,0,0,2,0,1,
1,4,0,1,1,0,0,1,
1,1,1,1,1,1,1,1},
//9
{1,1,1,1,1,1,1,1,
1,1,4,0,1,1,1,1,
1,0,0,0,3,2,0,1,
1,0,0,1,0,0,0,1,
1,0,0,0,1,5,0,1,
1,1,0,3,0,0,0,1,
1,1,1,1,0,2,0,1,
1,1,1,1,1,1,1,1},
//10
{1,1,1,1,1,1,1,1,
1,2,0,1,1,1,1,1,
1,2,0,0,0,1,1,1,
1,0,1,3,0,0,0,1,
1,2,0,3,3,1,0,1,
1,1,0,0,0,0,0,1,
1,1,1,1,1,0,4,1,
1,1,1,1,1,1,1,1},
//11
{1,1,1,1,1,1,1,1,
1,1,0,0,0,1,1,1,
1,0,1,2,3,0,1,1,
1,0,2,4,0,0,1,1,
1,0,3,0,3,0,1,1,
1,1,0,0,0,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1},
//12
{1,1,1,1,1,1,1,1,
1,1,0,1,1,0,2,1,
1,0,3,0,3,3,0,1,
1,4,0,0,0,0,0,1,
1,0,1,0,0,1,0,1,
1,0,1,1,1,1,0,1,
1,2,0,0,0,0,2,1,
1,1,1,1,1,1,1,1},
//13
{1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,0,0,0,0,1,1,
1,1,2,1,1,3,0,1,
1,0,2,2,3,0,0,1,
1,0,0,1,3,0,0,1,
1,0,0,4,0,1,1,1,
1,1,1,1,1,1,1,1},
//14
{1,1,1,1,1,1,1,1,
1,1,1,0,0,1,1,1,
1,1,0,0,0,0,1,1,
1,0,2,0,2,3,1,1,
1,0,0,3,4,0,0,1,
1,1,1,1,5,1,0,1,
1,1,1,1,0,0,0,1,
1,1,1,1,1,1,1,1},
//15
{1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,0,2,0,5,0,1,
1,1,0,0,1,0,0,1,
1,1,4,3,5,0,0,1,
1,1,1,0,0,0,1,1,
1,1,1,0,0,0,1,1,
1,1,1,1,1,1,1,1},
//16
{1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,0,2,2,1,1,1,1,
1,0,3,0,0,0,0,1,
1,0,0,1,3,1,0,1,
1,0,4,0,2,3,0,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1},
//17
{1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,2,0,0,4,2,1,1,
1,0,0,3,1,0,1,1,
1,0,1,0,3,2,0,1,
1,0,0,0,3,1,0,1,
1,1,1,1,0,0,0,1,
1,1,1,1,1,1,1,1},
//18
{1,1,1,1,1,1,1,1,
1,2,0,2,1,1,1,1,
1,2,1,3,3,0,1,1,
1,0,0,0,4,0,1,1,
1,0,3,1,0,0,1,1,
1,1,0,0,0,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1},
//19
{1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,2,0,0,0,2,0,1,
1,0,1,0,1,0,0,1,
1,4,3,0,0,3,2,1,
1,1,1,1,1,0,3,1,
1,1,1,1,1,0,0,1,
1,1,1,1,1,1,1,1},
//20
{1,1,1,1,1,1,1,1,
1,0,0,1,1,1,1,1,
1,0,0,1,1,1,1,1,
1,0,2,5,0,0,0,1,
1,1,3,0,0,0,0,1,
1,1,0,1,3,1,1,1,
1,1,2,0,4,1,1,1,
1,1,1,1,1,1,1,1}
};
/*程序存儲器中的數據是只讀的!根據這個地圖刷新顯示.
用于復制程序存儲器中的當前地圖數據*/
uchar xdata Map[64];
/*用于存放圓形的坐標,最多5個圓.yuanPos[6]存放本關有幾個圓*/
uchar xdata yuanPos[6] = 0;
/**********************************************************
*函數名:CopyMap()
*功 能:用于復制程序存儲器中的當前地圖數據
*輸 入:入口參數為當前地圖編號
**********************************************************/
void CopyMap(uchar num)
{
uchar i;
for (i=0;i<64;i++) Map[i] = GameMap[num][i];
}
/**********************************************************
*函數名:WriteMemorizer()
*功 能:將圖形數據寫入顯存
*pos:要顯示圖形的位置,*p:指針指向要顯示的圖形
**********************************************************/
void WriteMemorizer(uchar pos,uchar *p)
{
uchar i;
uint zb;
zb = MoveData[pos]; //取顯存地址(顯示坐標)
for (i=0;i<8;i++)
{
GamePic[zb] = *p; //要顯示的圖形寫入顯存
p++; //下一個數據
zb+=16;//顯存的下一個地址(每個地址之間的差是16)
} //或者說是間隔是16.
}
/**********************************************************
*函數名:MapCreate()
*功 能:地圖生成程序
**********************************************************/
void MapCreate()
{
uchar i;
for (i=0;i<64;i++) //生成8X8的地圖
{
switch (Map[i])//獲得地圖上的圖形數據
{ //將圖形編號對應的數據寫入顯存
case 0:
WriteMemorizer(i,kong);//空
break;
case 1:
WriteMemorizer(i,qiang);//墻
break;
case 2:
WriteMemorizer(i,yuan);//圓
break;
case 3:
WriteMemorizer(i,xiangzi);//箱子
break;
case 4:
WriteMemorizer(i,lian);//臉
break;
case 5:
WriteMemorizer(i,shizi);//十字
break;
}
}
}
/**********************************************************
*函數名:GameDisplay()
*功 能:游戲圖形顯示程序(從左到右,從上到下)
* *point指向外部RAM存儲的128X64的圖片數據
**********************************************************/
void GameDisplay(uchar xdata *point)
{
uchar i,j;
LCDWriteCommand(0x34);//擴充指令集
LCDWriteCommand(0x36);//繪圖顯示開
for (i=0;i<32;i++) //寫上半屏(32行)
{
LCDWriteCommand(0x80+i);//Y地址寄存器
LCDWriteCommand(0x80); //X地址(LCM自動加1)
for (j=0;j<16;j++)//16x8列
{ //獲得GamePic的首地址
LCDWriteData(*point);//寫入一個字節圖形數據
point++; //指向下一個圖形字節
}
}
for (i=0;i<32;i++) //寫下半屏
{
LCDWriteCommand(0x80+i);//Y地址寄存器
LCDWriteCommand(0x88); //X地址(LCM自動加1)
for (j=0;j<16;j++)//
{
LCDWriteData(*point);//寫入一個字節圖形數據
point++;
}
}
}
/**********************************************************
*函數名:ReadPosition()
*功 能:讀得娃娃臉的當前坐標位置
*返 回:ReadPos
**********************************************************/
uchar ReadPosition()
{
uchar i;
uchar ReadPos; //定義變量存放娃娃臉的位置.
for (i=0;i<64;i++)//地圖數據是64個字節
{ //逐個比較找出娃娃臉
if(Map[i]==4) //娃娃臉的編號是4
{
ReadPos = i;//記錄娃娃臉的坐標
break; //找到娃娃臉就跳出循環
}
}
return (ReadPos); //返回娃娃臉當前位置
}
/**********************************************************
*函數名:Readyuan()
*功 能:讀得圓形的坐標位置(箱子移動目的地)
*在初次讀入當前地圖數據是,5(十字)也認為是圓,不然就出錯,
*推動十字形后就少一個圓了.
**********************************************************/
void Readyuan()
{
uchar i,j=0;
for (i=0;i<64;i++)//地圖數據是64個字節
{ //圓形的編號是2
if (Map[i]==2||Map[i]==5) //找出圓形的位置
{//在編地圖的時候也用十字形.
yuanPos[j] = i;//存放圓形的位置
j++; //計數圓形的個數
yuanPos[6] = j;//存放圓形的個數
}
}
}
/**********************************************************
*函數名:Refyuan()
*功 能:刷新顯示圓形(箱子移動目的地)
**********************************************************/
void Refyuan()
{
uchar i; //yuanPos[6] 存放著圓形的個數(3--5個)
for (i=0;i<yuanPos[6];i++)//根據圓的個數來判斷
{ //判斷圓形的坐標位置是否為0(空),是就顯示圓形
if(Map[yuanPos[i]]==0) Map[yuanPos[i]]=2;
}
}
/**********************************************************
*函數名:Next()
*功 能:進入下一關
**********************************************************/
void Next()
{ //圓形位置全變為十字形(5),說明推完了,過關
if (Map[yuanPos[0]]==5&&Map[yuanPos[1]]==5&&Map[yuanPos[2]]==5)
{//過關
guanka++; //進入下一關
if (guanka==20) guanka=0;//這里設置為20關
CopyMap(guanka);//復制地圖數據
MapCreate(); //地圖生成程序
GameDisplay(GamePic); //游戲界面顯示程序
Readyuan(); //復制當前關卡圓形坐標和個數
}
}
/**********************************************************
*函數名:UpMove()
*功 能:娃娃臉向上移動
*說 明:向上移動是-8 (8X8的數據間隔是8)
*空(什么都不顯示)=0,墻=1,圓=2,箱子=3,臉=4,十字=5
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -