推箱子(proteus仿真)

推箱子游戏理念略过不提,之前用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);
}


  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值