推箱子游戏理念略过不提,之前用C写过一个控制台的,在这里(http://download.csdn.net/detail/l04205613/3653388),有兴趣可以看看,相信比下面的这一坨要好看的多……
如果你的keil告诉你说代码太长的话,那就看看这个,下面的这个,30M,整下来吧,应该能用
http://ishare.iask.sina.com.cn/f/15646302.html?retcode=0
只写了一关的,如果想要多关的话,需要再加地图,然后加一个选关按键,还有一个选关函数
电路图:
代码:
#include<reg52.h> #include<stdlib.h> #include<stdio.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit LCD_RS = P2^2; sbit LCD_RW = P2^1; sbit LCD_EN = P2^0; sbit LCD_cs1 = P2^4; sbit LCD_cs2 = P2^3; #define LCD_data P0 int cur_x,cur_y,X,dir[4][2]={-1,0,1,0,0,-1,0,1},where[3][2]={4,6,5,6,6,6}; sbit key_up = P3^0; sbit key_down = P3^1; sbit key_left = P3^2; sbit key_right = P3^3; uchar code tmp[]={//空格 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }; /* 0表示空格,1表示墙,2表示人,3表示箱子,4表示目的地 */ uchar code mat[8][8]={ 1,1,1,1,1,1,1,1, 1,1,1,1,0,2,1,1, 1,1,0,0,3,0,1,1, 1,1,0,1,0,1,1,1, 1,0,0,1,0,1,4,1, 1,0,1,0,0,3,4,1, 1,0,3,0,0,0,4,1, 1,1,1,1,1,1,1,1 }; uchar map[8][8]; uchar code Qiang[]={//方格,有间隙 0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff }; uchar code Ren[]={//人 0xff,0xff,0xe3,0xc5,0xb1,0xc5,0xe3,0xff }; uchar code Xiang[]={//箱子 0xff,0x42,0x24,0x18,0x18,0x24,0x42,0xff }; uchar code Mudi[]={//目的地 0xff,0xff,0xe7,0x81,0x81,0xe7,0xff,0xff }; uchar code Zifu[][8]={//字符表 0xFF,0xFD,0xF9,0x87,0xB3,0xFD,0xFD,0xFF, //Y 0xFF,0xFF,0xC3,0xBD,0xBD,0xC3,0xFF,0xFF, //O 0xFF,0xFF,0xC3,0xBF,0xBF,0xC3,0xFF,0xFF, //U 0xFF,0xF1,0xCF,0xF1,0xF5,0xC3,0xFD,0xFF, //W 0xFF,0xFF,0xFF,0x81,0xBD,0xFF,0xFF,0xFF, //I 0xFF,0x81,0xBB,0xF7,0xEF,0xC1,0xFD,0xFF, //N 0xFF,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0xFF, //! 0xF7,0xF7,0xF7,0x00,0x77,0xD7,0xEF,0x00, // 7 0xB5,0xB7,0xB6,0x01,0xB7,0xB7,0xB7,0xFF, 0xFD,0xBD,0x7E,0x80,0xFF,0xFF,0xFF,0x00, 0xBB,0xBB,0xBB,0x80,0xBB,0xBB,0xBB,0xFF, /*"推"*/ 0xEF,0x77,0x78,0x7D,0x09,0x75,0x7D,0xED, // 11 0x17,0xD8,0xDD,0xD9,0xC5,0x1D,0xFD,0xFF, 0xDF,0xEF,0xF3,0xFC,0x00,0xFD,0xF3,0xFF, 0x00,0xB6,0xB6,0xB6,0xB6,0x00,0xFF,0xFF, /*"箱"*/ 0xFF,0xFF,0xFD,0xFD,0xFD,0xFD,0xFD,0x1D, // 15 0xED,0xF5,0xF9,0xFD,0xFF,0x7F,0xFF,0xFF, 0xFE,0xFE,0xFE,0xFE,0xFE,0xBE,0x7E,0x80, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, /*"子"*/ 0xEF,0xF7,0xFB,0x2C,0xA9,0xA5,0xAD,0xA5, // 19 0x0B,0xAC,0xA9,0xA5,0x8D,0xFD,0xFD,0xFF, 0xFF,0xDF,0xDF,0xDC,0xED,0xED,0xF5,0xF9, 0x00,0xFD,0xFD,0xED,0xDD,0xE1,0xFF,0xFF, /*"第"*/ 0xFF,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, // 23 0x7F,0x7F,0x7F,0x7F,0x7F,0x3F,0x7F,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, /*"一"*/ 0xFF,0xEF,0xEF,0xEF,0xEE,0xE1,0xEB,0x0F, // 27 0xEF,0xE7,0xE8,0xED,0xE7,0xEF,0xFF,0xFF, 0xFE,0x7E,0xBE,0xDE,0xEE,0xF6,0xFA,0xFC, 0xFA,0xF6,0xCE,0x9E,0x3E,0xBE,0xFE,0xFF /*"关"*/ }; void delay_1ms(uchar x){ uchar i,j; for(j=0;j<x;j++) for(i=0;i<110;i++); } void write_command(uchar command){ LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; P0 = command; delay_1ms(2); LCD_EN = 1; //EN 由1 -- 0 完成 有效数据 的 锁存 delay_1ms(2); LCD_EN = 0; } void write_data(uchar fuck){ LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = fuck; delay_1ms(2); LCD_EN = 1; delay_1ms(2); LCD_EN = 0; } void lcd_post(int X,int Y){ write_command(0xb8+X); write_command(0x40+Y*8); } /* 0表示空格,1表示墙,2表示人,3表示箱子,4表示目的地 */ uchar judge(int x,int y,int id){ //id 表示方向数组的行标,0,1,2,3 分别表示上下左右 int xx,yy,xxx,yyy; xx=x+dir[id][0]; yy=y+dir[id][1]; if(map[xx][yy]==0 || map[xx][yy]==4)return 1; //1表示前面是 空格 或者 目的地,就是可以直接移动 else if(map[xx][yy]==1)return 0; //0表示无法移动 else if(map[xx][yy]==3){ xxx=xx+dir[id][0]; yyy=yy+dir[id][1]; if(map[xxx][yyy]==1 || map[xxx][yyy]==3)return 0; else if(map[xxx][yyy]==0 || map[xxx][yyy]==4)return 2; //2表示需要间接移动,先把前面的箱子移动一,再让人移动一 }return 0; } void lcd_init(){ uchar i,j; LCD_cs1 = 1; LCD_cs2 = 0; write_command(0x30); write_command(0x0c); write_command(0x01); cur_x=1; cur_y=5; X=3; for(i=0;i<8;i++){ for(j=0;j<8;j++)map[i][j]=mat[i][j]; } } void show_map(){ uchar i,j,k; LCD_cs1=0; LCD_cs2=1; for(i=0;i<8;i++){ for(j=0;j<8;j++){ lcd_post(i,j); if(map[i][j]==0) for(k=0;k<8;k++)write_data(tmp[k]); else if(map[i][j]==1) for(k=0;k<8;k++)write_data(Qiang[k]); else if(map[i][j]==2) for(k=0;k<8;k++)write_data(Ren[k]); else if(map[i][j]==3) for(k=0;k<8;k++)write_data(Xiang[k]); else if(map[i][j]==4) for(k=0;k<8;k++)write_data(Mudi[k]); } }delay_1ms(10); LCD_cs1=!LCD_cs1; LCD_cs2=!LCD_cs2; lcd_post(1,1); for(i=0;i<8;i++)write_data(Zifu[7][i]); lcd_post(1,2); for(i=0;i<8;i++)write_data(Zifu[8][i]); lcd_post(2,1); for(i=0;i<8;i++)write_data(Zifu[9][i]); lcd_post(2,2); for(i=0;i<8;i++)write_data(Zifu[10][i]); //推 lcd_post(1,3); for(i=0;i<8;i++)write_data(Zifu[11][i]); lcd_post(1,4); for(i=0;i<8;i++)write_data(Zifu[12][i]); lcd_post(2,3); for(i=0;i<8;i++)write_data(Zifu[13][i]); lcd_post(2,4); for(i=0;i<8;i++)write_data(Zifu[14][i]); //箱 lcd_post(1,5); for(i=0;i<8;i++)write_data(Zifu[15][i]); lcd_post(1,6); for(i=0;i<8;i++)write_data(Zifu[16][i]); lcd_post(2,5); for(i=0;i<8;i++)write_data(Zifu[17][i]); lcd_post(2,6); for(i=0;i<8;i++)write_data(Zifu[18][i]); //子 LCD_cs1=!LCD_cs1; LCD_cs2=!LCD_cs2; delay_1ms(100); } void fun(uchar key,uchar dirction){ uchar x,y,i; /* 0表示空格,1表示墙,2表示人,3表示箱子,4表示目的地 */ if(key==1){ lcd_post(cur_x,cur_y); if(mat[cur_x][cur_y]==4) for(i=0;i<8;i++)write_data(Mudi[i]); else for(i=0;i<8;i++)write_data(tmp[i]); map[cur_x][cur_y]=0; cur_x+=dir[dirction][0]; cur_y+=dir[dirction][1]; lcd_post(cur_x,cur_y); for(i=0;i<8;i++)write_data(Ren[i]); map[cur_x][cur_y]=2; } else if(key==2){ lcd_post(cur_x,cur_y); if(mat[cur_x][cur_y]==4) for(i=0;i<8;i++)write_data(Mudi[i]); else for(i=0;i<8;i++)write_data(tmp[i]); map[cur_x][cur_y]=0; cur_x+=dir[dirction][0]; cur_y+=dir[dirction][1]; lcd_post(cur_x,cur_y); for(i=0;i<8;i++)write_data(Ren[i]); map[cur_x][cur_y]=2; x=cur_x+dir[dirction][0]; y=cur_y+dir[dirction][1]; lcd_post(x,y); for(i=0;i<8;i++)write_data(Xiang[i]); map[x][y]=3; } } void main() { uchar i,num,index=6; lcd_init(); show_map(); while(1){ num=0; for(i=0;i<3;i++){ if(map[ where[i][0] ][ where[0][1] ]==3)num++; else break; } if(num==X)goto WIN; if(key_up==0){ delay_1ms(5); if(key_up==0){ index=judge(cur_x,cur_y,0); fun(index,0); }while(!key_up); } else if(key_down==0){ delay_1ms(5); if(key_down==0){ index=judge(cur_x,cur_y,1); fun(index,1); }while(!key_down); } else if(key_left==0){ delay_1ms(5); if(key_left==0){ index=judge(cur_x,cur_y,2); fun(index,2); }while(!key_left); } else if(key_right==0){ delay_1ms(5); if(key_right==0){ index=judge(cur_x,cur_y,3); fun(index,3); }while(!key_right); } } WIN: LCD_cs1=!LCD_cs1; LCD_cs2=!LCD_cs2; lcd_post(5,0); for(i=0;i<8;i++)write_data(Zifu[0][i]); lcd_post(5,1); for(i=0;i<8;i++)write_data(Zifu[1][i]); lcd_post(5,2); for(i=0;i<8;i++)write_data(Zifu[2][i]); lcd_post(5,4); for(i=0;i<8;i++)write_data(Zifu[3][i]); lcd_post(5,5); for(i=0;i<8;i++)write_data(Zifu[4][i]); lcd_post(5,6); for(i=0;i<8;i++)write_data(Zifu[5][i]); lcd_post(5,7); for(i=0;i<8;i++)write_data(Zifu[6][i]); delay_1ms(100); while(1); }