推箱子(proteus仿真)

来源:互联网 发布:linux 服务启动命令 编辑:程序博客网 时间:2024/05/16 08:53

推箱子游戏理念略过不提,之前用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 charsbit 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 P0int 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,//Y0xFF,0xFF,0xC3,0xBD,0xBD,0xC3,0xFF,0xFF,//O0xFF,0xFF,0xC3,0xBF,0xBF,0xC3,0xFF,0xFF,//U0xFF,0xF1,0xCF,0xF1,0xF5,0xC3,0xFD,0xFF,//W0xFF,0xFF,0xFF,0x81,0xBD,0xFF,0xFF,0xFF,//I0xFF,0x81,0xBB,0xF7,0xEF,0xC1,0xFD,0xFF,//N0xFF,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0xFF,//!0xF7,0xF7,0xF7,0x00,0x77,0xD7,0xEF,0x00,// 70xB5,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,// 110x17,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,// 150xED,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,// 190x0B,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,// 230x7F,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,// 270xEF,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);}


原创粉丝点击