双色光立方贪吃蛇遥控器:
玩家一
5:前进
8:后退
7:往左走
9:往右走
4:向上
6:向下
玩家二
0:前进
2:后退
1:往左走
3:往右走
NEXT:向上
+:向下
双击可以进行冲刺
PREV键重置游戏
游戏规则:
1. 边界可以碰撞,碰撞时会穿越到另一边。
2 不可以缠绕自己,吃到自己会导致失败。哪个颜色充满全屏,说明哪个颜色的蛇失败。
3. 通过吃食物来增加长度。
4. 吃到对方蛇会使对方长度减少。
5.芯片会根据音乐文件写入优盘的时间为他们自动排序,我设置的顺序是、 吃食物音乐 bgm、 失败音乐
然后初始化时直接播放(第一首会播放吃食物的音乐)下一曲
也就是bgm
然后需要触发吃食物音效时,控制芯片播放上一首
如果需要播放失败音乐,就控制芯片播放下一首
单片机源程序如下:
- #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)
|