C51平台加点阵屏可以贪吃蛇,程序实现如下,但还不够智能,只能看一步路,还是会出现把自己困死的情况,看提供一种思路,请大家能加以补充,提供更好的思路,感谢大家

单片机:STC89C52RC

点阵:8*8单色点阵

点阵驱动:

行:74HC595

列:P0口

主函数

#include "config.h"//*********主函数*************//
void main()
{initTimer0();  while(1)startSnake();
}

贪吃蛇源码

/*********************************************************************贪吃蛇源码snake.c
**********************************************************************/
#include "config.h"#define snake_fast 5//******与蛇相关的结构体定义*************//
static struct Food
{unsigned char x;   // 食物的横坐标unsigned char y;   // 食物的纵坐标
//  unsigned char yes;
}food;  // 食物结构体struct Snake
{char x[SNAKE_Max_Long];char y[SNAKE_Max_Long];unsigned char Long;      // 蛇的长度unsigned char Life;      // 蛇的生命
//  unsigned char Score;    // 蛇的分数,本例中没使用unsigned char Level;   // 蛇的等级unsigned char Dir;       // 蛇移动方向
}snake; // 蛇结构体struct VSnake
{char x[SNAKE_Max_Long];char y[SNAKE_Max_Long];unsigned char Long;      // 蛇的长度unsigned char Life;      // 蛇的生命
//  unsigned char Score;    // 蛇的分数,本例中没使用unsigned char Level;   // 蛇的等级unsigned char Dir;       // 蛇移动方向
}vsnake;    // 蛇结构体
//****************************************//enum Dir{up, down, left, right}; //方向枚举//***********变量声明***************//
unsigned char DispRAM[8]={0}; // 蛇坐标缓存
unsigned char tCount;
unsigned char keyValue=right;
unsigned char speedLevel=snake_fast;
extern uchar keyVal; // 来源于key.c
//**********************************//// 用此函数来产生食物最好使蛇的长度不要那么长,蛇越长,点越难找,递归越深
static void createFood()
{unsigned char i;food.x = rand()%WIDTH;food.y = rand()%LENGTH;for(i=0; i<snake.Long; i++){if(food.x==snake.x[i] && food.y==snake.y[i])createFood(); }
}//****************初始化蛇的位置等***********************//
static void initSnake()
{//********清除内存数据**********//unsigned char i;for(i=0; i<SNAKE_Max_Long; i++){snake.x[i]=-1;snake.y[i]=-1;}//********初始化蛇参数**********//snake.Long=2;    // 初始化蛇的长度为两节snake.Life=1; //初始化蛇活着snake.Dir=right;snake.x[1]=0;snake.y[1]=2;snake.x[0]=1;snake.y[0]=2;createFood();
}//********************刷新界面*******************//
static void drawSnake()
{unsigned char i=0;for(i=0; i<8; i++) DispRAM[i]=0;for(i=0; i<snake.Long; i++)DispRAM[snake.y[i]] |= 1<<snake.x[i];scanDisplay(DispRAM);drawPoint(food.x, food.y);
}char SnakeTryDead()
{char i;
//**********************蛇之dead***************************//// 限定蛇活动范围,超范围就deadif((vsnake.x[0]>(WIDTH-1)) || (vsnake.x[0]<0) || (vsnake.y[0]>(LENGTH-1)) || (vsnake.y[0]<0)){return 0;    }// 蛇自杀检测for(i=4; i<=vsnake.Long; i++){if(vsnake.x[i-1]==vsnake.x[0] && vsnake.y[i-1]==vsnake.y[0]){return 0;}}return 1;
}char SnakeAutuRun(char myDir)
{char i;char scal=1;vsnake.Dir = snake.Dir;vsnake.Long=snake.Long;for(i=0;i<=snake.Long;i++){vsnake.x[i]=snake.x[i];vsnake.y[i]=snake.y[i];}switch(myDir){case up:  if(vsnake.Dir != down) vsnake.Dir=up;         break;case down:    if(vsnake.Dir != up)       vsnake.Dir=down;   break;case left:    if(vsnake.Dir != right)    vsnake.Dir=left;   break;case right: if(vsnake.Dir != left)   vsnake.Dir=right;  break;default: break;}// 蛇身体坐标移动,蛇头方向坐标逐渐向蛇尾方向移动for(i=vsnake.Long; i>0; i--){    vsnake.y[i]=vsnake.y[i-1];vsnake.x[i]=vsnake.x[i-1];}// 重新获得蛇的头部位置switch(vsnake.Dir){ case up:    vsnake.y[0]-=1; break;case down:   vsnake.y[0]+=1; break;case left:  vsnake.x[0]-=1; break;case right: vsnake.x[0]+=1; break;default: break;}// 蛇吃到食物if(vsnake.x[0]==food.x && vsnake.y[0]==food.y){scal+=1;}if(SnakeTryDead()){return scal;}else{return 0;}}char SnakeGetApple()
{char step=0;char i=0;if(food.x>snake.x[0])step = 3;else if(food.x<snake.x[0])step = 2;if(food.y>snake.y[0])step = 1;else if(food.y<snake.y[0])step = 0;return step;
}//********************蛇运动坐标刷新*******************//
static void runSnake()
{unsigned char i;char step;step=SnakeGetApple();if(SnakeAutuRun(step))keyVal=step;else{for(i=0;i<4;i++){if(SnakeAutuRun(i))keyVal=i;}}changeDir(keyVal);// 蛇身体坐标移动,蛇头方向坐标逐渐向蛇尾方向移动for(i=snake.Long; i>0; i--){  snake.y[i]=snake.y[i-1];snake.x[i]=snake.x[i-1];}// 重新获得蛇的头部位置switch(snake.Dir){  case up:    snake.y[0]-=1; break;case down:    snake.y[0]+=1; break;case left:   snake.x[0]-=1; break;case right: snake.x[0]+=1; break;default: break;}// 蛇吃到食物if(snake.x[0]==food.x && snake.y[0]==food.y){snake.Long++;createFood();}}//*******************方向按键处理***********************//
static void changeDir(unsigned char key)
{// 方向按键的规则switch(key){case up: if(snake.Dir != down)  snake.Dir=up;      break;case down:    if(snake.Dir != up)        snake.Dir=down;    break;case left:    if(snake.Dir != right)     snake.Dir=left;    break;case right: if(snake.Dir != left)    snake.Dir=right;   break;default: break;}
}//********************启动贪吃蛇游戏(主函数)*********************//
void startSnake()
{uchar i=0;int j;initSnake();while(snake.Life){changeDir(keyValue);// 蛇运行的速度,由speedLevel决定if(tCount >= speedLevel){tCount=0;runSnake();}//**********************蛇之dead***************************//// 限定蛇活动范围,超范围就deadif((snake.x[0]>(WIDTH-1)) || (snake.x[0]<0) || (snake.y[0]>(LENGTH-1)) || (snake.y[0]<0)){for(j=0;j<1000;j++){drawSnake();}snake.Life=0;   snake.Level=1;speedLevel=snake_fast;keyVal=right;    }// 蛇自杀检测for(i=4; i<=snake.Long; i++){if(snake.x[i-1]==snake.x[0] && snake.y[i-1]==snake.y[0]){for(j=0;j<1000;j++){drawSnake();}delayMs(500); // 延一下时snake.Life=0;snake.Level=1;speedLevel=snake_fast;keyVal=right;    }}//***********************************************************//// 等级越高速度越快if(snake.Long >= SNAKE_Max_Long){for(j=0;j<100;j++){drawSnake();}initSnake();
//          speedLevel-=5;keyVal=right;           if(++snake.Level > 5){// 大神,你已经打爆机了,现在从头再来。。。snake.Level=1;speedLevel=snake_fast;                      }tCount=0;}drawSnake();}
}

贪吃蛇头文件

#ifndef __SNAKE_H
#define __SNAKE_H#define WIDTH 8
#define LENGTH 8
#define SNAKE_Max_Long 25   // 蛇最大长度static void createFood();
static void initSnake();
static void drawSnake();
static void runSnake();
static void changeDir(unsigned char key);
void startSnake();#endif

延时函数

#include "config.h"
/**************************************************************************
******  下面所有延时函数均从软件STC-ISP中获得,以12MHz晶振为时钟源
******  STC-ISP软件下载地址:WWW.STCMCU.COM
**************************************************************************///void delayUs(unsigned int i)
//{
//  while(i--)
//      _nop_();
//}void delay1Ms()      //@12.000MHz
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}void delayMs(unsigned int i)
{while(i--){delay1Ms();}
}

中断函数

#include "config.h"extern unsigned char tCount;    //来源于snake.c文件
extern unsigned char keyValue;  //来源于snake.c文件//******定时器0初始化*************//
void initTimer0()
{TMOD |= 0x01;TL0 = TIMER;TH0 = TIMER>>8;TR0 = 1;ET0 = 1;EA = 1;
}//******定时器0中断服务处理*************//
void timer0Handle() interrupt 1
{   // 20ms中断TL0 = TIMER;TH0 = TIMER>>8;keyValue=scanKey();tCount++;
}

显示函数

#include "8x8lattice.h"void hc595Write(unsigned char writeVal)
{unsigned char i;ST_CP=0;for(i=0; i<8; i++){SH_CP=0;DS=((writeVal<<i)&0x80)?1:0;SH_CP=1;}ST_CP=1;
}void hc238Write(unsigned char writeVal)
{switch(writeVal){case 0: P0=~(0x01);break;case 1: P0=~(0x02);break;case 2: P0=~(0x04);break;case 3: P0=~(0x08);break;case 4: P0=~(0x10);break;case 5: P0=~(0x20);break;case 6: P0=~(0x40);break;case 7: P0=~(0x80);break;default: P0=~(0x00); break;  }
}void drawPoint(unsigned char x, unsigned char y)
{hc238Write(y);hc595Write(0x00);hc595Write((1<<x));}void scanDisplay(unsigned char *pbuff)
{unsigned char i=0;hc595Write(0x00);for(i=0; i<8; i++){  hc238Write(i);hc595Write(pbuff[i]);hc595Write(0x00);}
}

显示函数头文件

#ifndef __8X8LATTICE_H
#define __8X8LATTICE_H
#include <reg52.h>
#include <intrins.h>
//=====hc595 引脚定义========
sbit DS = P3^4;
sbit SH_CP = P3^6;
sbit ST_CP = P3^5;//=====hc238 引脚定义========
//sbit hc238A = P2^0;
//sbit hc238B = P2^1;
//sbit hc238C = P2^2;
//sbit hc238EN = P2^6;void hc595Write(unsigned char writeVal);
void hc238Write(unsigned char writeVal);
void drawPoint(unsigned char x, unsigned char y);
void scanDisplay(unsigned char *pbuff);#endif

C51自动贪吃蛇程序相关推荐

  1. 【python教程入门学习】Python实现自动玩贪吃蛇程序

    这篇文章主要介绍了通过Python实现的简易的自动玩贪吃蛇游戏的小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学一学 实现效果 先看看效果 这比我手动的快多了,而且是单机的,自动玩没惹 ...

  2. c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

    求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束 /* 以下是主要的逻辑代码,还有些.c和.h就没发了 ...

  3. JAVA小程序:一个基于MVC框架的贪吃蛇程序

    学习JAVA也有一段时间了,之前看了翁恺老师的视频,跟着做了一个细胞自动机,粗浅地了解了一点MVC框架的知识,感觉获益匪浅.但是细胞自动机毕竟是跟着视频完成的,有很大程度上都是参考了视频里的代码,没有 ...

  4. 用python写一个贪吃蛇程序

    我可以为您提供一些有关如何使用Python编写贪吃蛇程序的指导.首先,您需要确定您的程序所需的功能,以及游戏的规则和特性.接下来,您可以编写代码来实现这些功能,并使用Python的图形库来绘制游戏界面 ...

  5. 模仿别人的简单贪吃蛇程序

    参考的别人的贪吃蛇程序,只做了少许的更改,惭愧.http://bbs.csdn.net/topics/350080780 #include <stdio.h> #include <s ...

  6. 代码全解:Python实现自动玩贪吃蛇程序

    录 实现效果 代码 实现效果 先看看效果 这比我手动的快多了,而且是单机的,自动玩没惹骂我,哈哈 ,多人游戏整个自动玩会被骂死~ 代码 没装软件的先安装一下软件,没装模块的安装一下pygame模块. ...

  7. html+JavaScript 实现贪吃蛇程序

    <!doctype html> <html> <head> <!-- 当前文档的字符集编码GBK,UTF-8,GB2312(GBK的子集)--> < ...

  8. 贪吃蛇程序(金沙滩51单片机)-启动篇-1(含演示GIF)

    点击获取工程源码 首先声明:本代码中不含中断程序(因为当时没学,后来觉得51过于落伍,故没有深学),以下的代码只是挑出其中主要的进行细讲,源码点击上方获取. 我们将启动贪吃蛇分为以下5个步骤: 1.初 ...

  9. 贪吃蛇程序不要白不要,一个赞就够了

    #include<stdio.h> #include<conio.h> #include<windows.h> #include<time.h> #de ...

  10. python贪吃蛇程序_Python 实现 贪吃蛇大作战 代码分享

    感觉游戏审核新政实施后,国内手游市场略冷清,是不是各家的新游戏都在排队等审核.媒体们除了之前竞相追捧<Pokemon Go>热闹了一把,似乎也听不到什么声音了.直到最近几天,突然听见好几人 ...

最新文章

  1. 应用程序服务器和Web服务器之间有什么区别?
  2. java深度优先迷宫生成_通过深度优先搜索产生的迷宫的Java代码
  3. 78、VLAN间路由配置实验之单臂路由
  4. 基于FPGA的IIR滤波器设计
  5. docker探索-docker安装运行tomcat(六)
  6. MariaDB:删除数据库报错:error: 'Error dropping database (can't rmdir './shiro', errno: 39)'
  7. 今天拜读了X先生的作品,深受其益
  8. 51单片机(STC15W408AS)映射printf函数 串口收发实现
  9. android studio生成jks,Android Studio生成keystore签名文件步骤讲解
  10. “7天”连锁酒店郑南雁
  11. Arcmap出了问题--显示“ArcGIS Initializing Application”
  12. 网易企业邮箱 服务器 端口,网易企业邮箱客户端——Thunderbird设置
  13. GFS —— 分布式文件系统
  14. 郭德纲相声里的插入广告
  15. UiBot If(如果条件成立)
  16. 线程竞争导致的EOFException解决 ---  一次线上问题解决流程
  17. 字节面试杂谈——计算机网络原理
  18. 复古拼贴_创建数码照片拼贴的最佳免费应用
  19. 解决ceph 100.000% pgs not active
  20. 3GPP R15 5GNR 协议概述

热门文章

  1. react 截取视频随意一帧裁剪图片存为base64格式
  2. 计算机二级VEP考试内容,2017计算机二级VEP知识点:报表设计与应用
  3. windows 安装使用luarocks
  4. [转]VS2013+简单稀疏光束调整库SSBA配置(64位编译)
  5. CIFAR10 代码分析详解——cifar10_train.py
  6. Altium Designer库文件与Protel 99SE库文件转化
  7. 【免费】雪糕刺客小程序,天价雪糕查询表,简单小程序框架
  8. 可编辑的电子海图系统功能拓展与应用
  9. 备战数学建模10-主成分分析模型与因子分析模型
  10. 机器码、序列号、认证码、注册码的生成算法(四)