弹砖块游戏机的分析与设计设计论文Word文档下载推荐.docx
《弹砖块游戏机的分析与设计设计论文Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《弹砖块游戏机的分析与设计设计论文Word文档下载推荐.docx(44页珍藏版)》请在冰点文库上搜索。
二、设计方案:
利用单片机最小板模块、加键盘模块和一个12864液晶既可以完成所需功能。
三、电路图:
四、相关程序设计:
程序设计包括四个方面:
液晶基础画点画线程序部分、游戏基础算法部分、键盘控制部分、其他显示部分。
主程序如下:
#include<
reg52.h>
#include<
MATH.H>
#defineucharunsignedchar
#defineuintunsignedint
sbitLCD_RS=P1^5;
sbitLCD_RW=P1^4;
sbitLCD_EN=P1^3;
sbitLCD_RES=P2^3;
sbitLCD_PSB=P2^7;
#definedataportP0
#defineset_incLCD_RS=0;
#defineset_dataLCD_RS=1;
#defineset_writeLCD_RW=0;
#defineset_readLCD_RW=1;
#defineset_enLCD_EN=1;
#defineclr_enLCD_EN=0;
ucharjx0,jy0,jx1,jy1,jy2,jx2;
//判断是否有图形接触的两个点的数值
//ucharbianxing;
//决定变形的数值
ucharjzx0,jzx1,jzx2,jyx0,jyx1,jyx2,jzy0,jzy1,jzy2,jyy0,jyy1,jyy2;
//用于横向判断,横向移位程序中使用
ucharxia;
//消影下坠的距离
ucharmo;
//消影的最后一行数
ucharkuaishu=0;
//表示消去的块数
ucharquan=0;
//表示全屏消去的次数
ucharball;
ucharlive=3;
ucharxb=0,si=0,jb=0;
//si=1表示没命玩了,jb是退出键脉冲检测数,键过于灵敏了
ucharxv,u=0,v=0,end=0;
//u为移动挡格的标志位,u==2时才移动一次,V同u,end为是否结束游戏
ucharyou=1,kai=0,sudu=50;
//,fu=0,sudu=26;
//fu为主界面箭头指示标志
//ucharv1=0,v2=0,v3=0,v4=0,v5=0,v6=0,v7=0,v8=0,v9=0,v10=0,v11=0,v12=0;
ucharrex,rey;
//碰撞点
ucharcodesuimage[]=//x:
y=24:
24字:
素
{0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFB,0xEF,0xDC,0xFB,0x6F,0x8C,0xFB,0x6F,0x08,0xFB,
0x6A,0x11,0xFB,0x62,0x33,0xFB,0x62,0x23,0xFB,0x63,0xA7,0xFB,0x69,0xB7,0xEB,0x69,
0x80,0xE0,0x04,0x80,0xE0,0x04,0x80,0xEB,0x64,0x3E,0xFB,0x60,0x36,0xFB,0x61,0x26,
0xFB,0x69,0x03,0xFB,0x69,0x13,0xFB,0x6D,0x99,0xFB,0x6D,0x98,0xFB,0x6D,0x9C,0xFB,
0xEF,0xBC,0xFF,0xEF,0xFD,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00};
ucharcodediimage[]=//x:
24,敵
{0xFF,0xFF,0xFF,0xFE,0xFF,0xFC,0xFE,0x0F,0xF8,0xFE,0x00,0x70,0xFE,0x00,0x01,0xFE,
0xFC,0x03,0xE6,0xFE,0x03,0xE0,0xF0,0x01,0xE0,0x10,0x78,0xFC,0x17,0xFC,0xFD,0x80,
0x00,0xFD,0xC0,0x00,0xFC,0x60,0x00,0xFC,0x0D,0x86,0xFC,0x0D,0x84,0xF1,0x80,0x34,
0xE1,0xE0,0x37,0xE5,0x80,0x07,0xED,0x0D,0x87,0xFD,0x2D,0x87,0xFD,0x60,0x00,0xFD,
0xE0,0x00,0xFD,0xE0,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00
};
ucharcodemiimage[]=//見
{0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0xFF,0xFF,0xF0,0xFF,0xFF,0xF0,0xF0,0x00,0x7E,0xF0,
0x00,0x7E,0xF0,0x00,0x7E,0xF7,0x77,0x7E,0xF7,0x77,0x00,0xF7,0x77,0x00,0xF7,0x77,
0x01,0xF7,0x77,0x7F,0xF7,0x77,0x7F,0xF7,0x77,0x1F,0xF7,0x77,0x07,0xF7,0x77,0x03,
0xF7,0x77,0x61,0xF0,0x00,0x78,0xF0,0x00,0x7C,0xF0,0x00,0x7C,0xFF,0xFF,0xFE,0xFF,
0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00
ucharcodekoimage[]=//事
{0xFF,0xFF,0xBF,0xFB,0xFF,0xBF,0xFB,0xFF,0xBF,0xFB,0xFC,0x03,0xFB,0x0C,0x03,0xFB,
0x0C,0x03,0xFB,0x0D,0xB7,0xFB,0x6D,0xB7,0xFB,0x6D,0xB7,0xFB,0x6D,0xB7,0xEB,0x6D,
0xB7,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xFB,0x6D,0xB6,0xFB,0x6D,0xB6,
0xFB,0x6D,0xB4,0xFB,0x6D,0xB7,0xFB,0x0D,0xB7,0xFB,0x0D,0xB7,0xFB,0x0D,0xB7,0xFB,
0xFD,0xB7,0xFB,0xFF,0xBF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00
ucharcodebaimage[]=//晴
{0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFB,0xEF,0xFF,0xFB,0x6C,0x00,0xFB,0x6C,0x00,0xFB,
0x6C,0x00,0xFB,0x6D,0xB6,0xE0,0x0D,0xB6,0xE0,0x0D,0xB7,0xE0,0x0D,0xB7,0xFB,0x6D,
0xB7,0xFB,0x6D,0xB7,0xFB,0x6C,0x00,0xFB,0x6C,0x00,0xFB,0x6C,0x00,0xF8,0x00,0x03,
0xF8,0x00,0x03,0xF8,0x00,0x03,0xFB,0xF7,0xEF,0xFB,0xF7,0xEF,0xF8,0x00,0x03,0xF8,
0x00,0x03,0xF8,0x00,0x03,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00
ucharcodeshiimage[]=//x:
y=16:
16字:
始
{0xFE,0x7F,0xFC,0x40,0xF0,0x00,0xD2,0xC0,0xCE,0xDD,0xC6,0xDD,0xE0,0x40,0xF8,0x00,
0xFC,0x00,0xF8,0x19,0xD8,0x01,0xC0,0xE3,0xC0,0x00,0xFC,0x04,0xFD,0xFE,0xFF,0xFF,
0x00,0x00,0x00,0x00};
ucharcodekaiimage[]=//x:
开
{0xFE,0x7F,0xCE,0x7F,0xCE,0x7F,0xEF,0x7F,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xEF,0x7F,
0xEF,0x7F,0xE0,0x1F,0xE0,0x03,0xE0,0x01,0xEF,0x78,0xEF,0x7C,0xEF,0x7E,0xFF,0x7F,
ucharcodenanimage[]=//x:
难
{0xF7,0xFD,0xE4,0x99,0xE4,0x99,0xE6,0xDD,0xC0,0x01,0x80,0x01,0x96,0xDD,0xC0,0x00,
0xC0,0x00,0xF8,0x00,0xE0,0x61,0xE0,0x01,0xF6,0x0F,0xF4,0x03,0xF4,0xF0,0xF7,0xFC,
ucharcodeduimage[]=//x:
度
{0xF6,0xFE,0xE4,0xFE,0xE4,0xFE,0xF2,0xDE,0xF0,0x0C,0xF0,0x40,0xC6,0x51,0xC6,0x59,
0xD0,0x00,0xF0,0x06,0xF6,0xDE,0xF6,0xDF,0xE0,0x03,0xE0,0x00,0xFF,0xF8,0xFF,0xFE,
0x88,0x71,0xDD,0x01};
ucharcodeshengimage[]=//x:
生
{0xFE,0xFE,0xFC,0xEC,0xFC,0xCC,0xFC,0xCC,0xFE,0xCE,0xEE,0xEE,0xE0,0x00,0xE0,0x00,
0xE0,0x00,0xF6,0xEE,0xF0,0xEE,0xF0,0x2E,0xF0,0x0E,0xFF,0x0E,0xFF,0xEE,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00};
ucharcodemingimage[]=//x:
命
{0xFE,0xFF,0xFE,0x7F,0xFE,0x01,0xFC,0x00,0xFC,0x00,0xF8,0xBD,0xF0,0x00,0xE0,0x00,
0xC6,0x81,0xC2,0x01,0xF0,0x01,0xF8,0x81,0xFC,0x01,0xFE,0x01,0xFF,0x3F,0xFF,0xBF,
ucharcodexinimage[]=//x:
y=8:
8字:
心形
{0xFF,0xDF,0xAF,0x77,0xBB,0x77,0xAF,0xDF};
voidint_INT0()//INT0初始化函数
{
//TCON=0X01;
//负边沿触发
IT0=1;
EX0=1;
//开INT0中断
EA=1;
//开总中断
}
voidint_INT1()//INT1初始化函数
//TCON=0X04;
IT1=1;
EX1=1;
//开INT01中断
voidint_timerT0()//T0初始化函数
TMOD=0X05;
//定时方式1,计数器模式C/T=1
ET0=1;
//开T0中断
TH0=(65536-1)/256;
TL0=(65536-1)%256;
TR0=1;
//开始计时
voiddelayms(uintums)
{
uinti,j;
for(i=ums;
i>
0;
i--)
for(j=110;
j>
j--);
}
voiddelay7us(uchart)
while(--t);
voidbusycheck()
dataport=0xff;
set_inc;
set_read;
set_en;
while((dataport&
0x80)==0x80);
clr_en;
//LCD_RS=0;
//LCD_RW=0;
voidsendcom(ucharcommand)//写命令
busycheck();
set_write;
//clr_en;
dataport=command;
//delayms
(1);
//LCD_RS=0;
//LCD_RW=0;
voidsenddata(uchardisplay)//送数据
set_data;
P0=display;
//delayms
(1);
ucharreaddata()//读数据
ucharredata;
redata=dataport;
delay7us(5);
returnredata;
//LCD_RS=0;
voidlcdclear()
sendcom(0x01);
delayms(15);
voidprinf(ucharx,uchary,bitcolor)//画点程序
ucharrow,lie,liebit;
uchardatah,datal;
x&
=0x7f;
y&
=0x3f;
lie=x/16;
//将点所在的16位区所在区号移入低四位
liebit=x%16;
//将所在区中的具体位置移入低四位
if(y<
32)
row=y;
else
row=y-32;
lie+=8;
sendcom(0x34);
sendcom(0x80+row);
sendcom(0x80+lie);
readdata();
datah=readdata();
datal=readdata();
if(liebit<
8)
if(color)
senddata(datah|(0x01<
<
(7-liebit)));
senddata(datal);
senddata(datah&
(~(0x01<
(7-liebit))));
senddata(datah);
senddata(datal|(0x01<
(15-liebit)));
senddata(datal&
(15-liebit))));
sendcom(0x36);
voidinit()//初始化程序
{
delayms(40);
//大于40MS的延时程序
LCD_PSB=1;
//设置为8BIT并口工作模式
delayms
(1);
//延时
LCD_RES=0;
//复位
LCD_RES=1;
//复位置高
delayms(10);
//Write_Cmd(0x30);
//选择基本指令集
//DelayUs2x(50);
//延时大于100us
sendcom(0x30);
//选择8bit数据流
delay7us(25);
//延时大于37us
sendcom(0x0c);
//开显示(无游标、不反白)
delay7us(50);
//清除显示,并且设定地址指针为00H
//延时大于10ms
sendcom(0x06);
//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动
voidLCD_Clear_GDRAM()//绘图区清除程序
uchari,j;
for(j=0;
j<
32;
j++)
sendcom(0x80+j);
sendcom(0x80);
//基本指令集,绘图关
for(i=0;
i<
i++)
{senddata(0x00);
}//写入0x00
voiddrawliney(ucharx0,ucharx1,uchary,bitcolor)//Y为一常值,X为一变量
uchartemp;
if(x0>
x1)
temp=x1;
x1=x0;
x0=temp;
}
for(;
x0<
=x1;
x0++)
{
prinf(x0,y,color);
}
voiddrawlinex(unsignedcharY0,unsignedcharY1,unsignedcharX,unsignedcharColor)
unsignedcharTemp;
if(Y0>
Y1)
Temp=Y1;
Y1=Y0;
Y0=Temp;
Y0<
=Y1;
Y0++)
prinf(X,Y0,Color);
voidkuai(ucharx,uchary)//此x,y代表该块的标志起点
drawlinex(y,y+14,x,1);
drawlinex(y,y+14,x+4,1);
drawliney(x,x+4,y,1);
drawliney(x,x+4,y+14,1);
ucharrekuai(ucharx,uchary)//对需要消去的块的标志数进行判断,此为碰到x轴线的情况
ucharnum;
if(x>
=1&
&
x<
=5)
if(y>
=2&
y<
=16)
num=1;
=17&
=31)
num=2;
=32&
=46)
num=3;
=47&
=62)
num=4;
elseif(x>
=6&
=10)
num=5;
num=6;
num=7;
num=8;
=11&
num=9;
num=10;
num=11;
num=12;
returnnum;
voidxiaokuai(ucharz)//消块程序,z为块的名称代数
ucharx,y,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12;
if(kuaishu==0)
v1=0;
v2=0;
v3=0;
v4=0;
v5=0;
v6=0;
v7=0;
v8=0;
v9=0;
v10=0;
v11=0;
v12=0;
switch(z)
case1:
x=1;
y=2;
v1=1;
break;
case2:
y=17;
v2=1;
case