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;无论您是初学者还是经验丰富的开发…

面试(四)

目录 1. 组长安排了一个不可能完成的任务&#xff0c;怎么拒绝&#xff1f; 2.讲一下Freertos的机器人 3. Freertos的中断 4. Freertos功能 5. 树莓派怎么识别二维码&#xff1f; 6. Linux脚本作用&#xff1f; 7. Modbus&#xff1f; 8. freertos的动态创建和静态创建…

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

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

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(五)、小结

本次实验&#xff08;一&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天大学】实验&#xff1a;时序逻辑设计——三色灯开关&#xff08;一&#xff09;、实验指导书 本次实验&#xff08;二&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天…

大语言模型——涌现能力

在现有文献中,大语言模型的涌现能力被非形式化定义为在小型模型中不存在但在大模型中出现的能力”,具体是指当模型扩展到一定规模时,模型的特定任务性能突然出现显著跃升的趋势,远超过随机水平。类比而言,这种性能涌现模式与物理学中的相变现象有一定程度的相似,但是仍然…

如何在Android应用中安全地使用SQLite数据库,并通过SQLCipher进行加密保护

Android内置SQLite轻量级关系型数据库,可以在Android应用中存储、检索和管理结构化数据。SQLite是一个无服务器的、零配置的、事务性的SQL数据库引擎,非常适合用于移动设备和桌面应用程序中。 SQLite特点: 「轻量级」:SQLite不需要单独的服务器进程或操作系统级别的配置。…

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…

C 语言实例 - 计算 int, float, double 和 char 字节大小

使用 sizeof 操作符计算int, float, double 和 char四种变量字节大小。 sizeof 是 C 语言的一种单目操作符&#xff0c;如C语言的其他操作符、–等&#xff0c;它并不是函数。 sizeof 操作符以字节形式给出了其操作数的存储大小。 #include <stdio.h>int main() {int …

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

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

让Springboot JpaAuditing 支持ZonedDateTime

我们项目需要支持国际化&#xff0c;那么日期时间就需要有时区了&#xff0c;否则我们在今天早上9点干的事&#xff0c;人家美国人看到的是明天的时间。所以我们在Auditable中的创建时间和更新时间我们都定义为ZonedDateTime. 然而在保存的时候却抛出如下错误&#xff1a; Cau…

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大模型的定义与特点…

Practice Exam: Oracle Cloud Infrastructure Generative AI Professional

Practice Exam: Oracle Cloud Infrastructure Generative AI Professional 1. In the simplified workflow for managing and querying vector data, what is the role of indexing?2. In which scenario is soft prompting appropriate compared to other training styles?3…

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;通配符…

【MHA】MySQL高可用MHA介绍8-常见错误以及解决

目录 MHA Node 未安装在 MySQL 服务器上 找不到主服务器的二进制日志 没有对二进制/中继日志授予读权限 使用多主复制&#xff08;不受支持&#xff09; 这些日志是 MHA Manager 在执行故障检测和故障切换过程中遇到的一些问题的记录。让我为您解释一下每个错误消息的含义&…