标题:
带红外遥控的双色光立方贪吃蛇单片机源程序
[打印本页]
作者:
叶魁
时间:
2017-12-20 19:20
标题:
带红外遥控的双色光立方贪吃蛇单片机源程序
双色光立方贪吃蛇遥控器:
0.png
(48.57 KB, 下载次数: 28)
下载附件
2017-12-21 02:41 上传
玩家一
5:前进
8:后退
7:往左走
9:往右走
4:向上
6:向下
玩家二
0:前进
2:后退
1:往左走
3:往右走
NEXT:向上
+:向下
双击可以进行冲刺
PREV键重置游戏
游戏规则:
1. 边界可以碰撞,碰撞时会穿越到另一边。
2 不可以缠绕自己,吃到自己会导致失败。哪个颜色充满全屏,说明哪个颜色的蛇失败。
3. 通过吃食物来增加长度。
4. 吃到对方蛇会使对方长度减少。
5.芯片会根据音乐文件写入优盘的时间为他们自动排序,我设置的顺序是、 吃食物音乐 bgm、 失败音乐
然后初始化时直接播放(第一首会播放吃食物的音乐)下一曲
也就是bgm
然后需要触发吃食物音效时,控制芯片播放上一首
如果需要播放失败音乐,就控制芯片播放下一首
0.png
(38.01 KB, 下载次数: 29)
下载附件
2017-12-21 02:41 上传
单片机源程序如下:
#include <STC12C5A60S2.H>
#include <intrins.h>
#include <stdio.h>
#include <stdlib.h>
#include <hc595.h>
#define MaxLength 20
/************************************************************************/
#define LENG 8
uchar xdata game [LENG][LENG][LENG];
uchar xdata grand[10]={1000,900,800,700,600,500,400,300,200,100};
int LEVEL1=9;
int finshflag=0;
int pauseflag=0;
void key2();
int rush=0;
int rush2=0;
uchar xdata display_r[8][8]={0}; //色光数组
uchar xdata display_b[8][8]={0};
uchar currentColor = 1;
uchar layerBuffer = 0x01;
sbit GG=P3^4;
sbit RR=P3^5;
sbit BB=P3^6;
sbit k4=P0^7;
sbit k2=P0^5;
uchar layer = 0;
int reset=0;
uchar data irtime=0;
uchar startflag;//开始标志
uchar data irdata[33];//数据一共33位加上引导码
uchar bitnum;
uchar irreceok;//接收一帧数据完成
uchar ircode[4];//4个字节的数据
uchar irprosok;//处理完成
void drawPoint(int x, int y, int z,int color);
void food();
void delete_tail();
void delete_tail2();
int food_x,food_y,food_z;
enum points{UP , DOWN , LEFT , RIGHT,FORTH,BACK};
enum points point = RIGHT;
enum points2{UP2 , DOWN2 , LEFT2 , RIGHT2,FORTH2,BACK2};
enum points2 point2 = LEFT2;
typedef struct Snake{
uchar x[MaxLength]; //蛇身节点的横坐标
uchar y[MaxLength]; //蛇身节点的纵坐标
uchar z[MaxLength]; //蛇节点
uchar length;//蛇长度
}Snake;
xdata Snake snake={{0},{0},{0},0};
xdata Snake snake2={{0},{0},{0},0};
void delay2(uint t) //延时
{
int i;
while(t--)
for(i=0;i<5;i++);
}
void init(){ //游戏初始化
int i, k,j;
for(i = 0 ; i < LENG ; i++){
for(j = 0 ; j < LENG ; j++){
for(k = 0 ; k < LENG ; k++){
game[i][j][k] = 0;
}
}
}
for(i=0;i<20;i++){
snake.x[i] =0;
snake.y[i] =0;
snake.z[i] =0;
snake2.x[i]=0;
snake2.y[i]=0;
snake2.z[i]=0;
}
snake.length=0;
snake2.length=0;
}
void eaten(int x,int y,int z,int n){ //蛇被吃函数设置
int i ;
k2=0;
delay2(10000);
k2=1;
if(n==1){
for(i=0;snake.x[i]!=x&&snake.y[i]!=y&&snake.z[i]!=z;i++);
i++;
for(i;i>0;i--)delete_tail();
}
if(n==2){
for(i=0;snake2.x[i]!=x&&snake2.y[i]!=y&&snake2.z[i]!=z;i++);
i++;
for(i;i>0;i--)delete_tail2();
}
}
void finsh(int n){ //游戏结束函数设置
int i,j,k;
for(i = 0 ; i < LENG ; i++){
for(j = 0 ; j < LENG ; j++){
for(k = 0 ; k < LENG ; k++){
if(game[i][j][k] == 0){
game[i][j][k] =n;
}
}
}
}
}
void add_head(int a, int b, int c){ //蛇1增加头
if(game[a][b][c]==1){
k4=0;
delay2(10000);
k4=1;
finshflag=1;
finsh(1);
}
if(game[a][b][c]==2){
eaten(a,b,c,2);
}
game[a][b][c]=1;
snake.x[snake.length]=a;
snake.y[snake.length]=b;
snake.z[snake.length]=c;
snake.length++;//节点个数加1
}//添加点至头部使蛇看起来在向前走
void add_head2(int a, int b, int c){ //蛇2增加头
if(game[a][b][c]==1){
eaten(a,b,c,1);
}
if(game[a][b][c]==2){
k4=0;
delay2(10000);
k4=1;
finshflag=1;
finsh(2);
}
game[a][b][c]=2;
snake2.x[snake2.length]=a;
snake2.y[snake2.length]=b;
snake2.z[snake2.length]=c;
snake2.length++; //节点个数加1
}
void delete_tail(){ //蛇一
int i;
game[snake.x[0]][snake.y[0]][snake.z[0]]=0;
for(i=0;i<snake.length;i++) //依次向尾部方向移动蛇各个节点的坐标
{
snake.x[i]=snake.x[i+1];
snake.y[i]=snake.y[i+1];
snake.z[i]=snake.z[i+1];
}
snake.length--;
}//删除尾部使蛇看起来在向前走
void delete_tail2(){ //蛇二
int i;
game[snake2.x[0]][snake2.y[0]][snake2.z[0]]=0;
for(i=0;i<snake2.length;i++) //依次向尾部方向移动蛇各个节点的坐标
{
snake2.x[i]=snake2.x[i+1];
snake2.y[i]=snake2.y[i+1];
snake2.z[i]=snake2.z[i+1];
}
snake2.length--;
}
void food(){
do{
food_x = rand()%7+1;//使得随机数在1到8的范围
food_y = rand()%7+1;
food_z = rand()%7+1;
}while(game[food_x][food_y][food_z] == 1||game[food_x][food_y][food_z] == 2);
game[food_x][food_y][food_z] = 3;
}//随机的食物
/*
void renew(){
int times=0;
current = head->next->next;
while(current->next != NULL){
current = current->next;
times++;
}
while(times--){
current = current->prior;
current->next = NULL;
free(current->next);
}
}
*/
void delay(int t)
{
int tt;
while(t--)
for(tt=0;tt<10;tt++);
}
void move(){ //使蛇自动朝当前方向前进,控制蛇1
if(!pauseflag&&!finshflag){
int a = snake.x[snake.length-1];
int b = snake.y[snake.length-1];
int c = snake.z[snake.length-1];
switch(point){
case UP: {
c++;
if(c>7)c=0;
break; }
case DOWN: {
c--;
if(c<0)c=7;
break; }
case RIGHT: {
a++;
if(a>7)a=0;
break;
}
case LEFT: {
a--;
if(a<0)a=7;
break;
}
case FORTH: {
b++;
if(b>7)b=0;
break;
}
case BACK: {
b--;
if(b<0)b=7;
break;
}
}
if(a == food_x && b == food_y&&c == food_z){
k2=0;
delay2(10000);
k2=1;
add_head(a,b,c);
food();
return;
}//吃到食物了
add_head(a,b,c);
delete_tail();
}
}
void move2(){ //使蛇自动朝当前方向前进,控制蛇2
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
双色光立方贪吃蛇程序.zip
(1.64 MB, 下载次数: 43)
2017-12-20 19:20 上传
点击文件名下载附件
双色光立方贪吃蛇程序
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1