STM32+LCD实现简单的贪吃蛇小游戏

您所在的位置:网站首页 C51开发板简易游戏机 STM32+LCD实现简单的贪吃蛇小游戏

STM32+LCD实现简单的贪吃蛇小游戏

2024-07-11 20:21:48| 来源: 网络整理| 查看: 265

寒假放假回家,只能宅在家里,无聊之余,幸好带了一块开发板回来,以前做项目都是在网上找相似或者有关联的项目,把别人的代码拿过来,修改修改,拼拼凑凑出自己项目,既然无聊就自己动脑筋思考,自己动手写贪吃蛇的程序。至于制作贪吃蛇的思路嘛,就是贪吃蛇在行动过程中,只有头的位置发生了变化,所以只需要对头部坐标做特殊处理即可,而在吃到食物后头部坐标直接变为食物坐标就实现了贪吃蛇吃到食物后身长增加的效果。下面是视频效果:

STM32+LCD实现简单的贪吃蛇小游戏

因为自己开发板只有三个按键,所以不能当做上下左右,只有通过屏幕来控制贪吃蛇运动的方向。

视频录了之后又修改了一下代码,修复了吃不到边缘食物的问题,以及加上了碰到自己也游戏结束的规则。

下面是代码:`

snake.c

```c #include "snake.h" #include "lcd.h" #include "timer.h" #include "touch.h" #include "stdlib.h" #include "usart.h" Snake snake; extern u8 count; /* 初始化蛇 */ void snakeInit(){ TIM3_Int_Init(4999,7199); //初始化定时器 snake.length=3; //初始长度为3 snake.snakeX[0]=55; snake.snakeX[1]=55; snake.snakeX[2]=55; snake.snakeY[0]=55; snake.snakeY[1]=65; snake.snakeY[2]=75; snake.headX=snake.snakeX[0]; //记录下头部的位置 snake.headY=snake.snakeY[0]; //记录下头部的位置 snake.dir=1; //设置运动方向 snake.tpdir=1;//设置初始按键方向 snake.life=1; //1:蛇还活着;0:蛇死亡 generateFood();//生成食物 refresh(); //调用函数显示出蛇和食物的位置 } /* 每隔一秒将会执行一次,以此实现蛇的运动 */ void snakeGo(int direct){ u8 i; if(snake.life==1){ if(abs(direct)!=abs(snake.dir)){ //如果按下的方向不是和运动的方向相同或相反 snake.dir=direct; //将蛇运动的方向改变为按下的方向 }else{ direct=snake.dir; //蛇运动的方向仍是以前运动的方向 } switch(direct){ case 1: snake.headY-=10; //上:蛇的身体是有半径为5的圆组成,每运动一格的单位为10 break; case -1: snake.headY+=10; //下:蛇的身体是有半径为5的圆组成,每运动一格的单位为10 break; case -2: snake.headX-=10; //左:蛇的身体是有半径为5的圆组成,每运动一格的单位为10 break; case 2: snake.headX+=10; //右:蛇的身体是有半径为5的圆组成,每运动一格的单位为10 break; } if(snake.headX==snake.foodX&&snake.headY==snake.foodY){ //如果吃到了食物 snake.length++; //长度加1 for(i=1;i for(i=1;i snake.life=1; } else{ //触碰到墙壁游戏结束 dead(); } } /* 刷新屏幕上蛇和食物的位置 */ void refresh(){ if(snake.life==1){ u8 i; LCD_Fill(11,11,229,229,WHITE); for(i=0;i while(1){ tp_dev.scan(0); if(tp_dev.sta) //触摸屏被按下 { if(tp_dev.x snake.life=1; //死了之后点击重新开始 snakeInit(); } } } if(count==2){ //定时器设置的500ms的中断,1S运行一次蛇的运动函数 count=0; //重新计数 snakeGo(snake.tpdir); refresh(); } } } /* 判断随机产生的食物是否处于蛇体内 */ u8 isCover(u8 snakeX[],u8 snakeY[],u8 foodX,u8 foodY){ u8 i; for(i=0;i return 1; } } return 0; } /* 判断是否头部是否触碰到自己 */ u8 isNearSelf(){ u8 i; for(i=1;i return 0; } } return 1; } /* 产生随机的食物坐标 */ void generateFood(){ unsigned int ran=rand()%22+1; //因为贪吃蛇运动区域为10 snake.length=0; snake.snakeX[0]=0; snake.snakeX[1]=0; snake.snakeX[2]=0; snake.snakeY[0]=0; snake.snakeY[1]=0; snake.snakeY[2]=0; snake.headX=snake.snakeX[0]; snake.headY=snake.snakeY[0]; snake.dir=0; snake.life=0; LCD_ShowString(80,50,200,16,16,"You dead!!!"); LCD_Fill(90,150,150,180,BLUE); //点击此区域重新开始游戏 LCD_ShowString(92,160,200,16,16,"restart"); }

snake.h文件

#ifndef __SNAKE_H #define __SNAKE_H #include "sys.h" #include "stdlib.h" typedef struct { u8 life; u8 headX; u8 headY; u8 snakeX[300]; u8 snakeY[300]; u8 length; int dir; int tpdir; u8 foodX; u8 foodY; }Snake; void snakeInit(void); void snakeGo(int direct); void refresh(void); void GameStart(void); void generateFood(void); void dead(void); u8 isCover(u8 snakeX[],u8 snakeY[],u8 foodX,u8 foodY); u8 isNearSelf(void); #endif

这个算是界面布局吧,调用这个函数画出游戏的界面来

void Load_Drow_Dialog(void) { POINT_COLOR=BLUE;//设置字体为蓝色 LCD_DrawRectangle(10, 10, 230, 230); //画矩形 LCD_Fill(90,240,150,270,BLUE); //画出‘上’区域 LCD_Fill(10,260,70,290,BLUE); //画出‘左’区域 LCD_Fill(90,280,150,310,BLUE); //画出‘下’区域 LCD_Fill(170,260,230,290,BLUE); //画出‘右’区域 POINT_COLOR=RED;//设置画笔红色 }

在main文件中先调用initSnake()函数,然后调用GameStart()函数就可以开始游戏。 上面代码的注释已经写的很清楚,应该不需要详细每个函数的功能,值得一提的是取随机数机制,没有加上随机数种子,所以随机取出来的食物位置次序都是一样的。

鉴于找我要源码的人有点多,我上传到网盘上了,有需要的自行下载,源码的STM32芯片是STM32F103ZET6,LCD屏幕的驱动可能需要修改成自己屏幕适配的驱动。 链接:https://pan.baidu.com/s/1xOWsxzoCF_mTC_sCMb3rFw 提取码:osxj

本人菜鸟,个人能力有限,可能有不少没有考虑到的地方,思路仅凭参考



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭