为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

俄罗斯方块C语言程序代码

2017-09-17 27页 doc 54KB 66阅读

用户头像

is_496339

暂无简介

举报
俄罗斯方块C语言程序代码俄罗斯方块C语言程序代码 /********************************************************** *名称:推箱子游戏测试版V0.1 *编程:飞扬 *说明:采用YM12864R-3的液晶(ST7920)+62256的RAM+PT6122的遥控 *下一个版本增加音效,地图编辑功能,界面显示美化,撤销上一步! *主要是学习外扩展RAM才搞这个东东! **********************************************************/ #in...
俄罗斯方块C语言程序代码
俄罗斯方块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,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索