俄罗斯方块C语言程序代码俄罗斯方块C语言程序代码
/********************************************************** *名称:推箱子游戏测试版V0.1
*编程:飞扬
*说明:采用YM12864R-3的液晶(ST7920)+62256的RAM+PT6122的遥控
*下一个版本增加音效,地图编辑功能,界面显示美化,撤销上一步!
*主要是学习外扩展RAM才搞这个东东!
**********************************************************/ #in...
俄罗斯方块C语言程序代码
/********************************************************** *名称:推箱子游戏测试版V0.1
*编程:飞扬
*说明:采用YM12864R-3的液晶(ST7920)+62256的RAM+PT6122的遥控
*下一个版本增加音效,地图编辑功能,界面显示美化,撤销上一步!
*主要是学习外扩展RAM才搞这个东东!
**********************************************************/ #include
#include "MAIN.H"
/****** 引脚定义 ******/
sbit Beep = P3^3; //音频输出脚
/****** 变量/数组定义 ******/
//定义数组,存放接收到的数据
uchar KeyCoding[4]={0,0,0,0};
//关卡设置
uchar guanka = 0;
//用1024个字节存放动态绘图数据,我叫它显存数据
uchar xdata GamePic[1024];
//十字形(箱子推到圆形位置后变为十字形)
uchar code shizi[8]={0x3c,0x3c,0xff,0xff,0xff,0xff,0x3c,0x3c};
//圆形(箱子要推到的地方)
uchar code yuan[8]={0x3c,0x66,0xc3,0x81,0x81,0xc3,0x66,0x3c};
//箱子(推动的就是他)
uchar code xiangzi[8]={0xff,0x81,0xbd,0xbd,0xbd,0xbd,0x81,0xff};
//娃娃脸(用于推动箱子)
uchar code lian[8]={0x7e,0xff,0xdb,0xff,0xff,0xc3,0xe7,0x7e};
//墙壁
uchar code qiang[8]={0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00};
//空(用于清空图形移动后的痕迹)
uchar code kong[8]={0,0,0,0,0,0,0,0};
//用于计算图形移动和放置的坐标
//实际存放的是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[10][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,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}, //7
{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}, //8
{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}, //9
{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},
//10
{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}
};
//因为程序存储器中的的是只读的!
//用于复制程序存储器中的当前地图数据
uchar idata 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 j;
j = MoveData[pos]; //取显存地址(显示坐标)
for (i=0;i<8;i++)
{
GamePic[j] = *p; //要显示的图形写入显存
p++; //下一个数据
j+=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()
*功 能:游戏图形显示程序(从左到右,从上到下) **********************************************************/
void GameDisplay()
{
uchar i,j;
uint k=0; //对显存清计数器清0
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列
{
LCDWriteData(GamePic[k]);//写入一个字节图形数据
k++; //指向下一个图形字节
}
}
for (i=0;i<32;i++) //写下半屏
{
LCDWriteCommand(0x80+i);//Y地址寄存器
LCDWriteCommand(0x88); //X地址(LCM自动加1)
for (j=0;j<16;j++)//
{
LCDWriteData(GamePic[k]);
k++;
}
}
}
/**********************************************************
*函数名:ReadPosition()
*功 能:读得娃娃脸的当前坐标位置
*返 回:ReadPos
**********************************************************/
uchar ReadPosition() {
uchar i;
uchar ReadPos; //定义变量存放娃娃脸的位置.
for (i=0;i<64;i++)
{
if(Map[i]==4)
{
ReadPos = i; //记录娃娃脸的坐标
break; //找到位置跳出循环
}
}
return (ReadPos); //返回娃娃脸当前位置
}
/**********************************************************
*函数名:Readyuan()
*功 能:读得圆形的坐标位置(箱子移动目的地)
**********************************************************/
void Readyuan()
{
uchar i,j=0;
for (i=0;i<64;i++)
{
if (Map[i]==2) //找出圆形的位置
{
yuanPos[j] = i; //存放圆的位置
j++;
yuanPos[6] = j;//存放有几个圆
}
}
}
/**********************************************************
*函数名:Refyuan()
*功 能:刷新显示圆形(箱子移动目的地)
**********************************************************/
void Refyuan()
{
uchar i;
for (i=0;i0;j--)
for (i=100;i>0;i--);
}
/**********************************************************
*函数名:Sound()
*功 能:音效子程序
**********************************************************/
void Sound()
{
uchar k;
for (k=40;k>0;k--)
{
Beep=~Beep;
Delay400us();
}
}
/**********************************************************
*函数名:IR()
*功 能:外中断遥控解码程序
**********************************************************/
void IR() interrupt 0
{
uchar i,k;
EA = 0; //关外中断0
if (P3_2==0) //P3.2低电平继续
{
for (i=8;i>0;i--) //循环检测10次,低电平引导信号干扰检测(9ms)
{
Delay400us(); //延时438us
if (P3_2==1) //低电平引导信号出现高电平就跳出
{
EA = 1; //开外中断
return;
}
}
while(P3_2==0); //等待高电平引导信号到了.
for (i=8;i>0;i--) //循环检测10次,高电平引导信号干扰检测(4.5ms)
{
Delay400us();
if (P3_2==0) //高电平引导信号出现低电平就跳出
{
EA = 1; //开外中断
return;
}
}
while(P3_2==1); //等待高电平引导信号结束.
//接收4个字节的数据
for (k=0;k<4;k++)
{
for (i=8;i>0;i--) //8位数据
{
while(P3_2==0); //等待第一个地址码的高电平到了.(保证判断每位数据
的起点一致)
Delay400us();
Delay400us(); //延时0.876ms去判断P3.2的状态(0.56ms<延时时间
<1.125ms)
KeyCoding[k]>>= 1; //右移1位
if(P3_2==1) //仍是1,最高位写入1,0跳过
KeyCoding[k]|= 0x80;
while(P3_2==1); //等待高电平结束
}
}
//比较地址码和地址反码,不同解码错误退出
if (KeyCoding[0]!=~KeyCoding[1]&&KeyCoding[2]!=~KeyCoding[3])
{
EA = 1; //开外中断
return;
}
}
switch (KeyCoding[2])
{//按键判断
case 0x51: //确定键
guanka++;
if (guanka==10) guanka=0;
CopyMap(guanka); //复制地图数据
MapCreate(); //地图生成程序
GameDisplay();//游戏界面显示程序
Readyuan();//
KeyCoding[2] = 0;
Sound(); //解码成功声音提示.
break;
case 0x06: //向上键
UpMove();
KeyCoding[2] = 0;
Sound(); //解码成功声音提示.
break;
case 0x44: //向下键
DownMove();
KeyCoding[2] = 0;
Sound(); //解码成功声音提示.
break;
case 0x47: //向左键
LeftMove();
KeyCoding[2] = 0;
Sound(); //解码成功声音提示.
break;
case 0x40: //向右键
RightMove();
KeyCoding[2] = 0;
Sound(); //解码成功声音提示.
break;
case 0x02: //第一次按进入设置,第二次退出设置状态
KeyCoding[2] = 0;
Sound(); //解码成功声音提示.
break;
case 0x07: //系统设定键
KeyCoding[2] = 0;
Sound(); //解码成功声音提示.
break;
}
EA = 1; //开外中断
}
/**********************************************************
*函数名:Init(void)
*功能:初始化
**********************************************************/
void Init()
{
EA = 1; //开总中断
IT0 = 1; //外中断0边沿触发
EX0 = 1; //开外中断0
}
/**********************************************************
*函数名:main (void) *功能:主函数
**********************************************************/
void main (void) {
uint i;
Delay400us();//等待电源稳定
Init(); //
LCDInit(); //液晶初始化程序
for (i=0;i<1024;i++)
{
GamePic[i] = 0; //外部RAM清0
}
CopyMap(0); //复制地图数据
MapCreate(); //地图生成程序
GameDisplay();//游戏界面显示程序
Readyuan(); //读得圆形的坐标位置
while(1);
}
本文档为【俄罗斯方块C语言程序代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。