推箱子游戏(完整第一关)

2019-04-15 12:19发布

  #include #define uint unsigned int #define uchar unsigned char sbit rw=P2^0; sbit rs=P2^2; sbit en=P2^3; sbit cs1=P2^4; sbit cs2=P2^5; sbit bflag=P3^7; uchar n,renx,reny,i,flag=1,ff=0,f,aa,bb,cc,ax,bx,cx,j,k,m; sbit up=P1^0; sbit down=P1^2; sbit le=P1^1; sbit rig=P1^3; sbit res=P1^4; uchar temp[8][8]; uchar table[]; uchar code ttemp[8][8]={ 0,0,0,0,0,0,0,0, 0,2,1,0,2,2,0,0, 0,2,2,2,2,2,2,0, 0,0,0,0,2,2,2,0, 0,2,4,0,0,2,2,0, 0,2,2,3,2,2,2,0, 0,2,2,2,2,2,0,0, 0,0,0,0,0,0,0,0 }; // 设置地图 uchar code ren[]={ 0xff,0xff,0xe3,0xc5,0xb1,0xc5,0xe3,0xff }; //人 uchar code mudi[]={ 0xff,0xff,0xe7,0x81,0x81,0xe7,0xff,0xff }; //目的地 uchar code xiangzi[]={ 0xff,0xff,0xe7,0xdb,0xdb,0xe7,0xff,0xff }; //箱子 uchar code niu[]={ 0xef,0xe7,0xe9,0xeb,0x00,0xeb,0xef,0xff };//牛 uchar code chan[]={ 0x00,0x08,0x8b,0xce,0x78,0x08,0x00,0xf9,0xae,0xaa,0xf8,0xac,0xab,0xf8,0x00,0x00, 0x00,0x01,0x00,0x3f,0x00,0x02,0x02,0x02,0x02,0x02,0x3f,0x02,0x02,0x02,0x02,0x00 };//禅 void delayms(uint x) { uchar i; while(x--) { for(i=0;i<10;i++); } } void right() { cs1=1; cs2=0; } void left() { cs1=0; cs2=1; } void write_data(uchar dat) { rs=1; //写数据 rw=0; en=0; P3=dat; en=1; delayms(5); en=0; } void write_cmd(uchar cmd) { rs=0; //写指令 rw=0; en=0; P3=cmd; delayms(5); en=1; delayms(5); en=0; } void Linefirst(uchar c) { uchar i; i=c; c=i|0x40; write_cmd(c); delayms(5); } void pagetwo(uchar c) { uchar i; i=c; c=i|0xb9; write_cmd(c); } void Zfirst(uchar c) { uchar i; i=c; c=i|0xc0; write_cmd(c); delayms(5); } void Pagefirst(uchar c) { uchar i; i=c; c=i|0xb8; // Busy_12864(); write_cmd(c); delayms(5); } //设置显示位置 void lcd_pos(uchar x,uchar y,uchar z) { Linefirst(0x40+y*8); Pagefirst(0xb8+x); Zfirst(z); } //液晶的初始化 void lcd_init() { write_cmd(0x30); delayms(5); write_cmd(0x0c); delayms(5); write_cmd(0x01); delayms(5); } //人的初始化 void ren_init() { lcd_pos(renx,reny,0xff); //第二行,第四列的方块 for(k=0;k<8;k++) { write_data(ren[k]); } } //箱子的初始化 void xiangzi_init() { ax=0x68; bx=0xbc; cx=0xff;//箱子的初始位置 lcd_pos(ax,bx,cx); //第二行,第四列的方块 for(i=0;i<8;i++) { write_data(xiangzi[i]); } } //目的地初始化 void mudi_init() { lcd_pos(0x48,0xbc,0xff); for(i=0;i<8;i++) { write_data(mudi[i]); } } void disp(dis) { //ff,f均为标志位 lcd_pos(renx,reny,0xff);//擦除 for(k=0;k<8;k++) write_data(0xff); switch(dis) //判断按键的上下左右 { case 0: renx--;break; case 1: renx++;break; case 2: reny--;break; case 3: reny++;break; case 4: break; } if(ttemp[renx][reny]==2||ttemp[renx][reny]==1) { if(ttemp[renx][reny]!=0&&ttemp[renx][reny]!=3&&ttemp[renx][reny]!=4){ while(up==0&&f==1){ lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); } while(down==0&&f==1){ lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); } while(le==0&&f==1){ lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); } while(rig==0&&f==1){ lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); } if(ttemp[renx][reny]==0) //防止穿墙 { renx++; flag=0; } } } } void key() { ren_init(); if(up==0) { if(ttemp[renx-1][reny]!=0){ //判断是否能走 if(renx!=(ax+1)){ //判断不遇见箱子 U: lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(0xff); renx--; while(up==0) { lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); } } else if(ttemp[ax-1][bx]!=0&&reny==bx){ //判断是否遇见箱子和箱子是否能走 lcd_pos(ax,bx,0xff); //擦除箱子 for(k=0;k<8;k++) write_data(0xff); ax--; lcd_pos(renx,reny,0xff); //擦除小人 for(k=0;k<8;k++) write_data(0xff); renx--; while(up==0) { lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); lcd_pos(ax,bx,0xff); for(k=0;k<8;k++) write_data(xiangzi[k]); } } else if(ttemp[ax-1][bx]==0&&reny==bx&&renx==(ax+1)) { } else goto U; } } if(down==0) { if(ttemp[renx+1][reny]!=0){ //判断是否能走 if(renx!=(ax-1)){ //判断不能遇见箱子 D: lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(0xff); renx++; while(down==0) { lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); } } else if(ttemp[ax+1][bx]!=0&&reny==bx){ //判断是否遇见箱子和箱子是否能走 lcd_pos(ax,bx,0xff); //擦除箱子 for(k=0;k<8;k++) write_data(0xff); ax++; lcd_pos(renx,reny,0xff); //擦除小人 for(k=0;k<8;k++) write_data(0xff); renx++; while(down==0) { lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); lcd_pos(ax,bx,0xff); for(k=0;k<8;k++) write_data(xiangzi[k]); } } else if(ttemp[ax+1][bx]==0&&reny==bx&&renx==(ax-1)) { } else { goto D; } } } if(le==0) { if(ttemp[renx][reny-1]!=0){ //判断是否能走 if(reny!=(bx+1)){ //判断不能遇见箱子 L: lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(0xff); reny--; while(le==0) { lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); } } else if(ttemp[ax][bx-1]!=0&&renx==ax){ //判断是否遇见箱子和箱子是否能走 &&reny==(bx+1) lcd_pos(ax,bx,0xff); //擦除箱子 for(k=0;k<8;k++) write_data(0xff); bx--; lcd_pos(renx,reny,0xff); //擦除小人 for(k=0;k<8;k++) write_data(0xff); reny--; while(le==0) { lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); lcd_pos(ax,bx,0xff); for(k=0;k<8;k++) write_data(xiangzi[k]); } } else if(ttemp[ax][bx-1]==0&&renx==ax&&reny==(bx+1)) { } else { goto L; } } } if(rig==0) { if(ttemp[renx][reny+1]!=0){ //判断是否能走 if(reny!=(bx-1)){ //判断不能遇见箱子 R: lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(0xff); reny++; while(rig==0) { lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); } } else if(ttemp[ax][bx+1]!=0&&renx==ax){ //判断是否遇见箱子和箱子是否能走 &&reny==(bx+1) lcd_pos(ax,bx,0xff); //擦除箱子 for(k=0;k<8;k++) write_data(0xff); bx++; lcd_pos(renx,reny,0xff); //擦除小人 for(k=0;k<8;k++) write_data(0xff); reny++; while(rig==0) { lcd_pos(renx,reny,0xff); for(k=0;k<8;k++) write_data(ren[k]); lcd_pos(ax,bx,0xff); for(k=0;k<8;k++) write_data(xiangzi[k]); } } else if(ttemp[ax][bx+1]==0&&renx==ax&&reny==(bx-1)) { } else { goto R; } } } } void youxi_init() { right(); for(i=0;i<8;i++) { for(j=0;j<8;j++) { temp[i][j]=ttemp[i][j]; switch(temp[i][j]) { case 0:lcd_pos(i,j,0xff); for(k=0;k<8;k++) write_data(0); break; case 1:lcd_pos(i,j,0xff); renx=i;reny=j; //人的初始位置 for(k=0;k<8;k++) write_data(ren[k]); break; case 2:lcd_pos(i,j,0xff); for(k=0;k<8;k++) write_data(0xff); break; case 3:lcd_pos(i,j,0xff);//箱子的位置 ax=i;bx=j; for(k=0;k<8;k++) write_data(xiangzi[k]); break; case 4:lcd_pos(i,j,0xff); for(k=0;k<8;k++) write_data(mudi[k]); break; } } } } void win() { left(); while(1) { lcd_pos(0x68,0xbc,0xff); for(i=0;i<8;i++) //写一个牛字 { write_data(niu[i]); } } /* lcd_pos(0x58,0xbc,0xff); for(i=0;i<16;i++) { write_data(chan[i]); } lcd_pos(0x58,0xbd,0xff); for(i=16;i<32;i++) { write_data(chan[i]); }*/ } //第一关的人初始外置:(0x48,0xb9,0xff); //箱子的初始位置:(0x68,0xbc,0xff); //目的地位置:(0x48,0xbc,0xff) //主函数 void main() { right(); lcd_init(); youxi_init(); ren_init(); while(1) { key(); if(ttemp[ax][bx]==4) { win(); } } }