02 贪吃蛇

前言

呵呵 这是不知道 在哪里看到的 别人做的一个贪吃蛇 

因此 也把我 之前的 贪吃蛇 移植上来了 

当然 这个不过是为了 简单的入门了解, 呵呵 

然后 c++版本的贪吃蛇 需要先移植成 c 版本, 然后 再根据 单片机相关 设计调整

比如 led 点阵的输出, 比如 c99 语法的一些不兼容 

主控制程序

整体程序的结构如下, Test02Snake 是主控制程序, utils 是公共的东西 

snake 是贪吃蛇的相关实现 

Test02Snake.c


#include "utils.h"
#include "snake.h"/*** main related*/
long counter = 1;u8 gled_end[8] = {0x38,0x7C,0x7E,0x3F,0x3F,0x7E,0x7C,0x38};void main() {int i;u8 xList[8] = {1, 2, 3, 4, 6}, yList[8] = {1, 2, 3, 4, 7};u8 word[8];Snake snakeIns;Snake *snake = &snakeIns;// snake = snakeInit();snakeInit(snake);snake->init(snake);snake->setMap(snake);snake->createFood(snake);ledToggle(6);while (1) {//  		snake->print(snake);snake->running(snake, counter);if (snake->isOver(snake))break;delay_ms(5);counter++;}while(1) {lightTubeByInt(snake->grade);printLedWord(8, gled_end);}}

utils.h

#ifndef _utils_H
#define _utils_H#include "reg52.h"
#include "stdlib.h"typedef unsigned int u16;
typedef unsigned char u8;
typedef unsigned long u32;// led dot related 
sbit SHIFT_REG_INPUT = P3 ^6;
sbit STORE_REG_INPUT = P3 ^5;
sbit SERIAL_PORT_INPUT = P3 ^4;
#define LEDDZ_COL_PORT P0// tube related 
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
#define SMG_A_DP_PORT	P0// keyboard matrix related
#define KEY_MATRIX_PORT	P1/*** delay $delayIn10Us us* @param ten_us*/
void delay_10us(u16 ten_us);/*** delay $delayInMs ms* @param ms*/
void delay_ms(u16 ms);/*** control led[pos] on/off* @param pos* @param on*/
void ledCtl(u8 pos, u8 on);/*** toggle led[pos] on/off* @param pos* @param on*/
void ledToggle(u8 pos);/*** random number * @param seed* @param max* @param min*/
unsigned int randomInt(unsigned int seed, unsigned int max, unsigned int min);/*** printLedWord** @param wordLength* @param word*/
void printLedWord(int wordLength, u8 *word);/*** lightTube* @param word*/
void lightTube(u8 *word);/*** lightTubeByInt* @param word*/
void lightTubeByInt(u16 value);/*** lightTubeByIntNTimes* @param word*/
void lightTubeByIntSeconds(u16 value, u16 s);/*** keyboardMatrixFlipScan* @return*/
u8 keyboardMatrixFlipScan(void);#endif

utils.c

#include "utils.h"u8 gled_col[8] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe};u8 gsmg_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void hc595_write_data(u8 dat);void delay_10us(u16 ten_us) {while (ten_us--);
}void delay_ms(u16 ms) {u16 i, j;for (i = ms; i > 0; i--)for (j = 110; j > 0; j--);
}void ledCtl(u8 pos, u8 on) {if(on == 0) {P2 |= (1 << pos);return;}P2 &= (~(1 << pos));
}void ledToggle(u8 pos) {P2 ^= (1 << pos);
}unsigned int randomInt(unsigned int seed, unsigned int min, unsigned int max) {return rand() % (max + 1 - min) + min;
}void printLedWord(int wordLength, u8 *word) {u8 i;for (i = 0; i < wordLength; i++) {LEDDZ_COL_PORT = gled_col[i];hc595_write_data(word[i]);delay_10us(10);hc595_write_data(0x00);}
}void hc595_write_data(u8 dat) {u8 i = 0;for (i = 0; i < 8; i++) {SERIAL_PORT_INPUT = dat >> 7;dat <<= 1;SHIFT_REG_INPUT = 0;delay_10us(1);SHIFT_REG_INPUT = 1;delay_10us(1);}STORE_REG_INPUT = 1;delay_10us(1);STORE_REG_INPUT = 0;
}void lightTube(u8 *word) {u8 i=0;for(i=0;i<8;i++) {switch(i) {case 0: LSC=1;LSB=1;LSA=1;break;case 1: LSC=1;LSB=1;LSA=0;break;case 2: LSC=1;LSB=0;LSA=1;break;case 3: LSC=1;LSB=0;LSA=0;break;case 4: LSC=0;LSB=1;LSA=1;break;case 5: LSC=0;LSB=1;LSA=0;break;case 6: LSC=0;LSB=0;LSA=1;break;case 7: LSC=0;LSB=0;LSA=0;break;}SMG_A_DP_PORT = gsmg_code[word[i]];delay_10us(10);SMG_A_DP_PORT=0x00;}
}void lightTubeByInt(u16 value) {u16 i;u8 idx = 7;u8 word[8];for(i=0; i<8; i++) {word[i] = 0;}i = value;while(i > 0) {word[idx --] = i % 10;i = i / 10;}lightTube(word);
}void lightTubeByIntSeconds(u16 value, u16 s) {u16 i, j;for (i = s * 8; i > 0; i--)for (j = 110; j > 0; j--)lightTubeByInt(value);
}u8 keyboardMatrixFlipScan(void) {static u8 result = 0;KEY_MATRIX_PORT=0x0f;if(KEY_MATRIX_PORT!=0x0f) {delay_10us(1000);if(KEY_MATRIX_PORT!=0x0f) {KEY_MATRIX_PORT=0x0f;switch(KEY_MATRIX_PORT) {case 0x07: result=1;break;case 0x0b: result=2;break;case 0x0d: result=3;break;case 0x0e: result=4;break;}KEY_MATRIX_PORT=0xf0;switch(KEY_MATRIX_PORT) {case 0x70: result=result;break;case 0xb0: result=result+4;break;case 0xd0: result=result+8;break;case 0xe0: result=result+12;break;}while(KEY_MATRIX_PORT!=0xf0);}}elseresult=0;return result;
}

贪吃蛇的实现

snake.h 

#ifndef _snake_H
#define _snake_H#include "utils.h"typedef struct Node {int x;int y;
} Node;typedef struct Snake {struct Node *head;        struct Node *food;        int flag;        int grade;        int level;        int direction;void (*setMap)(struct Snake *snake);          int (*isOver)(struct Snake *snake);            void (*go)(struct Snake *snake);                void (*running)(struct Snake *snake, int counter);void (*isKeyPressed)(struct Snake *snake);void (*init)(struct Snake *snake);void (*addNode)(struct Snake *snake, int x, int y);            void (*moveTo)(struct Snake *snake, int direction);            void (*createFood)(struct Snake *snake);        int (*getFood)(struct Snake *snake);            int (*isFoodCover)(struct Snake *snake);        int (*isSuccess)(struct Snake *snake);        void (*print)(struct Snake *snake);            
} Snake;void snakeInit(struct Snake *snake);#endif

snake.c 

如下 就是 贪吃蛇的初始化, 生成食物, 运行, 等等 相关 


#include "snake.h"void position(int, int);struct Node *nodeInit(int, int y);void snakeInit(Snake *snake);void setMap(struct Snake *snake);int isOver(struct Snake *snake);void go(struct Snake *snake);void running(struct Snake *snake, int counter);void isKeyPressed(struct Snake *snake);void init(struct Snake *snake);void addNode(struct Snake *snake, int x, int y);void moveTo(struct Snake *snake, int direction);void createFood(struct Snake *snake);int getFood(struct Snake *snake);int isFoodCover(struct Snake *snake);int isSuccess(struct Snake *snake);void print(struct Snake *snake);int snakeHeadInitX = 2;
int snakeHeadInitY = 2;
int gameRangeXMax = 8;
int gameRangeYMax = 8;
int snakeNodeXOffset = 1;
int snakeNodeYOffset = 1;Node nodeList[100];
Node foodNodeIns;
Node *foodNode = &foodNodeIns;void snakeInit(struct Snake *snake) {// struct Snake *result = malloc(sizeof(struct Snake));
//    snake->head = nodeInit(snakeHeadInitX, snakeHeadInitY);snake->head = &nodeList[0];snake->level = 0;addNode(snake, snakeHeadInitX, snakeHeadInitY);snake->flag = 0;snake->direction = 2;snake->grade = 0;snake->setMap = setMap;snake->isOver = isOver;snake->go = go;snake->running = running;snake->isKeyPressed = isKeyPressed;snake->init = init;snake->addNode = addNode;snake->moveTo = moveTo;snake->createFood = createFood;snake->getFood = getFood;snake->isFoodCover = isFoodCover;snake->isSuccess = isSuccess;snake->print = print;
}void setMap(struct Snake *snake) {}void init(struct Snake *snake) {int i;struct Node *p = snake->head;for (i = 1; i <= 2; i++) {addNode(snake, p->x - (i * snakeNodeXOffset), p->y);}
}void addNode(struct Snake *snake, int x, int y) {nodeList[snake->level].x = x;nodeList[snake->level].y = y;snake->level ++;snake->grade = snake->grade + 5 * (snake->level + 1);
}void moveTo(struct Snake *snake, int direction) {u8 i;for(i = snake->level - 1; i > 0; i--) {nodeList[i].x = nodeList[i-1].x;nodeList[i].y = nodeList[i-1].y;}snake->direction = direction;if ((snake->direction + 2) % 2 == 1) {snake->head->y -= snake->direction;} else {snake->head->x += (snake->direction / 2);}
}int isOver(struct Snake *snake) {struct Node *head = snake->head;struct Node *p;u8 i;if (head->x >= (gameRangeXMax * snakeNodeXOffset) || head->x < 0|| head->y >= (gameRangeYMax * snakeNodeYOffset) || head->y < 0)return 1;for(i=2; i<snake->level; i++) {p = &nodeList[i];if (head->x == p->x && head->y == p->y) return 1;}if (snake->level >= 10) return 1;return 0;
}void createFood(struct Snake *snake) {do {foodNode->x = randomInt(0, 0, (gameRangeXMax-1) * snakeNodeXOffset);foodNode->y = randomInt(0, 0, (gameRangeYMax-1) * snakeNodeYOffset);} while (snake->isFoodCover(snake));
}int getFood(struct Snake *snake) {struct Node *head = snake->head;struct Node *p;if (head->x == foodNode->x && head->y == foodNode->y) {p = &nodeList[snake->level-1];addNode(snake, p->x, p->y);return 1;}return 0;
}int isFoodCover(struct Snake *snake) {u8 i;struct Node *p = snake->head;struct Node *food = foodNode;for(i=0; i<snake->level; i++) {p = &nodeList[i];if (food->x == p->x && food->y == p->y) return 1;}return 0;
}void go(struct Snake *snake) {struct Node *head = snake->head;struct Node *p;snake->moveTo(snake, snake->direction);snake->print(snake);
}long snakeTurnNextThreshold = 1;
int snakeMaxRowCount = 50;
int snakeCurrentRowIdx = 1;void running(struct Snake *snake, int counter) {struct Node *p;if (counter % snakeTurnNextThreshold == 0) {snakeCurrentRowIdx = (snakeCurrentRowIdx + 1) % snakeMaxRowCount;}snake->isKeyPressed(snake);if(snakeCurrentRowIdx > 0) {snake->print(snake);return ;}snake->print(snake);snake->go(snake);if (snake->getFood(snake)) {snake->createFood(snake);}}void isKeyPressed(struct Snake *snake) {u8 keyPressed = 0;keyPressed = keyboardMatrixFlipScan();// UPif (keyPressed == 2 && snake->direction != 1) snake->direction = -1;// LEFTelse if (keyPressed == 5 && snake->direction != 2) snake->direction = -2;// DOWNelse if (keyPressed == 6 && snake->direction != -1) snake->direction = 1;// RIGHTelse if (keyPressed == 7 && snake->direction != -2) snake->direction = 2;if (keyPressed == 16) {while (1) {keyPressed = keyboardMatrixFlipScan();snake->print(snake);if (keyPressed == 16) break;}}
}int isSuccess(struct Snake *snake) {if (snake->level >= 10) return 1;return 0;
}void print(struct Snake *snake) {struct Node *p;u8 word[8];u8 i;for(i=0; i<8; i++) {word[i] = 0;}for(i=0; i<snake->level; i++) {p = &nodeList[i];word[p->x] |= (1 << p->y);}p = foodNode;word[p->x] |= (1 << p->y);printLedWord(8, word);
}

实际效果如下图 

游戏结束效果如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12 c++版本的坦克大战

前言 呵呵 这大概是 大学里面的 c 贪吃蛇了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 坦克大战 #include<iostream> #include<windows.h> #include<conio.h> #include<ctime> #include…

Python编程的终极十大工具

Python一直以来都是程序员们的首选编程语言之一&#xff0c;其灵活性和功能强大的库使其成为解决各种问题的理想选择。在本文中&#xff0c;我们将介绍Python编程的终极十大工具&#xff0c;这些工具可以帮助您在各种领域取得成功&#xff0c;无论您是初学者还是经验丰富的开发…

【C++】C++的内存管理

目录 内存分布 动态内存管理 C语言的动态内存管理 C的动态内存管理 对内置类型操作 对自定义类型操作 new[]和delete[] 开空间的细节 探讨匹配问题 定位new表达式 内存分布 栈&#xff1a;存放非静态局部变量&#xff0c;函数参数&#xff0c;返回值等。栈是向下增长…

Vim学习笔记01~04

第01章&#xff1a; 遁入空门&#xff0c;模式当道 1.什么是vim Vim是一个高效的文本编辑工具&#xff0c;并且可以在编程开发过程中发挥越来越重要的作用。 事实上&#xff0c;有不少编程高手使用他们来进行代码的开发&#xff0c;并且对此赞不绝口。 2.本系列目的 但是让…

微信小程序按钮点击时的样式hover-class=“hover“

小程序的button组件很好用&#xff0c;按钮点击的时候会显示点击状态&#xff0c;默认的就是颜色加深 但是我们改变了button的背景色之后&#xff0c;就看不出点击效果了&#xff0c;解决起来也很简单 关键代码就是小程序的 hover-class 属性&#xff0c;需要注意的是&#xff…

代码随想录算法训练营Day8 | ● 344.反转字符串● 541. 反转字符串II● 54.替换数字● 151.翻转字符串里的单词● 55.右旋转字符串

&#xff08;记得重学&#xff09; ● 344.反转字符串 题目&#xff1a;编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一…

Qt [获取Dump] 使用WindowsAPI实现生成MiniDump文件

说明 客户现场的软件偶发崩溃是程序开发者&#xff0c;比较头疼的事情。如何更快速的定位到问题点和解决掉&#xff0c;是开发应该具备的基本能力。 Windows提供了一系列的API&#xff0c;可以记录软件崩溃前的堆栈信息。下面就实现一个生成Dump文件的程序实例。 主要代码 回…

计算机系列之输入输出、中断、总线、可靠性、操作系统、进程管理、同步互斥

9、输入输出-中断-总线-可靠性 1、输入输出技术、中断 1、内存与接口地址的编址方法&#xff08;了解概念即可&#xff09; 计算机系统中存在多种内存与接口地址的编址方法&#xff0c;常见的是下面两种&#xff1a;&#xff08;了解概念即可&#xff09; 1&#xff09;内存…

ai大模型应用开发

随着人工智能技术的飞速发展&#xff0c;AI大模型应用开发已成为一个日益重要的领域。本文将从专业角度深入探讨AI大模型的应用开发&#xff0c;并思考其未来的深度影响和逻辑性。 编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; ​【一、AI大模型的定义与特点…

ASP.NET Core 3 高级编程(第8版) 学习笔记 03

本篇介绍原书的第 18 章&#xff0c;为 19 章 Restful Service 编写基础代码。本章实现了如下内容&#xff1a; 1&#xff09;使用 Entity Framework Core 操作 Sql Server 数据库 2&#xff09;Entity Framework Core 数据库迁移和使用种子数据的方法 3&#xff09;使用中间件…

Babylon.js 读取GLB模型元数据

如果你熟悉将 3D 资源导出到游戏引擎的过程&#xff0c;那么无疑也会熟悉 3D 资源的 PBR 和 GLB 导出过程。 这是我们之前概述的内容&#xff0c;也是我们交互式工作的所有资产准备的基石。 然而&#xff0c;从传统的管道意义上来说&#xff0c;能够用元数据标记网格有很多逻辑…

通配符HTTPS安全证书

众多类型的SSL证书&#xff0c;要说适用或者说省钱肯定是通配符了&#xff0c;因为谁都想一本SSL证书包括了整条域名&#xff0c;而且也不用一条一条单独管理。 通配符HTTPS安全证书&#xff0c;其实就是通配符SSL证书&#xff0c;SSL证书主流CA的参数都一样&#xff0c;通配符…

武汉星起航:亚马逊助力中国卖家扬帆出海,迎来跨境电商新机遇

2015年&#xff0c;亚马逊全球开店业务正式踏入中国这片充满活力和潜力的市场&#xff0c;此举不仅为中国卖家提供了前所未有的跨境电商新机遇&#xff0c;更为其发展出口业务、拓展全球市场、打造国际品牌铺设了一条坚实的道路。亚马逊作为国际版的电商购物平台&#xff0c;其…

Hadoop-Hive-Spark-离线环境搭建

一、版本描述 apache-hive-2.3.9-bin.tar.gz hadoop-2.7.0.tar.gz spark-2.4.0-bin-hadoop2.7.tgz 下载链接&#xff1a; https://archive.apache.org/dist/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz https://archive.apache.org/dist/hadoop/common/hadoop-2.7.…

vscode 创建代码模版

在vscode中快捷创建代码模版 1.在VSCode中&#xff0c;按下Ctrl Shift P&#xff08;Windows/Linux&#xff09;或Cmd Shift P&#xff08;Mac&#xff09;打开命令面板。 2.然后输入"Preferences: Configure User Snippets"并选择该选项。打开一个json文件用户…

IDEA中配置使用maven和配置maven的中央仓库

1 以汉化后的IDEA为例配置maven 打开idea选择文件 选择 设置 点击>构建.执行.部署 点击>构建工具 点击>Maven 其中Maven主路径 就是我们maven下载解压后的路径 可以通过边上的三个点选择你解压后的绝对路径&#xff0c;也可以直接把解压后的绝对路劲复制过来 以下…

回归预测 | Matlab实现SSA-ESN基于麻雀搜索算法优化回声状态网络的多输入单输出回归预测

回归预测 | Matlab实现SSA-ESN基于麻雀搜索算法优化回声状态网络的多输入单输出回归预测 目录 回归预测 | Matlab实现SSA-ESN基于麻雀搜索算法优化回声状态网络的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-ESN基于麻雀搜索算法…

物联网:从电信物联开发平台AIoT获取物联设备上报数据示例

设备接入到电信AIoT物联平台后&#xff0c;可以在平台上查询到设备上报的数据。 下面就以接入的NBIOT物联远传水表为例。 在产品中选择指定设备&#xff0c;在数据查看中可以看到此设备上报的数据。 示例中这组数据是base64位加密的&#xff0c;获取后还需要转换解密。 而我…

2024 IDM最新破解版及软件介绍

*IDM&#xff1a;信息时代的高效管理工具** 在快节奏的现代社会中&#xff0c;随着信息的爆炸式增长&#xff0c;如何高效、有序地管理信息成为每个人都需要面对的挑战。IDM&#xff0c;作为一种信息管理工具&#xff0c;正在逐渐受到人们的青睐。 IDM&#xff0c;全称Inform…

Linux--进程控制(1)

文章衔接&#xff1a; Linux--环境变量-CSDN博客 Linux--地址空间-CSDN博客 目录 1.进程创建 2.进程的终止 2.1想明白&#xff1a;终止是在做什么&#xff1f; 2.2进程终止的三种情况 2.3 进程如何终止 3.进程等待 &#xff08;wait/waitpid&#xff09; 1.进程创建 在li…