标题:
arduino按键版本贪吃蛇程序
[打印本页]
作者:
无痕1234
时间:
2018-1-23 13:07
标题:
arduino按键版本贪吃蛇程序
/*==============================================================================================================
* @function_name: 贪吃蛇
* @描述: MAX7219 8*8 点阵LED
* @作者: @逝水无痕@
* @日期: 2018-01-02
*----------------------------------------------------------------------------------------------------------------
* @修改人:
* @修改内容:
================================================================================================================*/
#include "LedControl.h" //点阵控制库
int SpeedS = 8; // 贪吃蛇的初始速度
int Socre; // 游戏得分
int Left; //定义五个按键,上下左右
int Right;
int Up;
int Down;
int Res; //游戏中用来加速,游戏结束用来重新开始游戏
int Enabled; // 重启游戏使能
int FX, FY; // 食物的坐标
int SX, SY; // 蛇头的坐标
int KEY, K; // 当前按键码和实际按键码
LedControl lc=LedControl(12,11,10,1); //初始化设备,引脚连接 (din,clk,cs,点阵个数)
char s[129] = {}; // 蛇身体坐标集合,一共64个点,二维坐标128个元素 其中0没有用到 故为129个元素
//字符的模
byte zero[8] = {0x18,0x24,0x42,0x42,0x42,0x42,0x24,0x18,}; //0
byte one[8] = {0x10,0x18,0x14,0x10,0x10,0x10,0x10,0x38,}; //1
byte two[8] = {0x18,0x24,0x20,0x20,0x10,0x08,0x04,0x3C,}; //2
byte three[8]= {0x18,0x24,0x20,0x38,0x38,0x20,0x24,0x18,}; //3
byte four[8] = {0x10,0x18,0x14,0x12,0x3E,0x10,0x10,0x10,}; //4
byte five[8] = {0x3C,0x04,0x0C,0x10,0x20,0x20,0x24,0x18,}; //5
byte six[8] = {0x1C,0x22,0x02,0x1E,0x22,0x22,0x22,0x1C,}; //6
byte seven[8]= {0x7E,0x20,0x10,0x08,0x08,0x08,0x08,0x08,}; //7
byte eight[8]= {0x18,0x24,0x24,0x24,0x18,0x24,0x24,0x18,}; //8
byte nine[8] = {0x18,0x24,0x24,0x24,0x38,0x10,0x08,0x04,}; //9
byte smile[8]= {0x3C,0x42,0xA5,0x81,0xA5,0x99,0x42,0x3C,}; //笑脸
byte neutral[8]= {0x3C,0x42,0xA5,0x81,0xBD,0x81,0x42,0x3C,}; //标准脸
/******************************************************************************************************************/
void setup()
{
//pinMode(zPin, INPUT);
RANDOM(); // 获取一个随机食物坐标
K = 0; // 初始化按键码,实际上就是行进方向 方向初始化为0 即在首次操作按键前 蛇不移动
s[1] = 2; // x3 初始化蛇的身体坐标
s[2] = 2; // y3
s[3] = 1; // x2
s[4] = 2; // y2
s[5] = 0; // x1
s[6] = 2; // y1
Socre = 0; // 游戏起始得分
//MAX7219的初始设置
lc.shutdown(0,false); //设置节电模式,设备号从0开始,false 不节电
lc.setIntensity(0,2); //设置亮度
lc.clearDisplay(0); //清屏
printByte(smile); //显示笑脸
delay(2000);
/*循环绘制蛇的身体,实际上就是3个点 */
for(int i = 1; i <= 6; i += 2) // 从蛇头开始绘制三个点 s[1], s[3], s[5]为x坐标 s[2], s[4], s[6]为y坐标 蛇身排序: {s[5],s[6]} {s[3],s[4]} {s[1],s[2]} (右侧为蛇头)
{
lc.setLed(0,s[i],s[i + 1],1); //(设备号 行 列 亮)
}
}
/*****************************************************随机食物获取函数 ***********************************************************************/
void RANDOM()
{
A:
FX = random(0, 7);
FY = random(0, 7);
for(int i = 1; i <= 6 + 2 * Socre; i+= 2) // 防止食物出现在蛇身上
{
if( FX == s[i] and FY == s[i + 1])
goto A;
}
}
/**************这个是延时函数,实际上通过不断闪现食物来完成延迟,这样既可以做到精确延时,也可以让食物不断闪动,来让大家不断的看到 ***************************/
void myDelay( int Time) // 在蛇移动的延时期间 我们要做一些事情 比如食物的闪烁和按键方向的读取
{
for(int t = 1; t <= Time; t++)
{
lc.setLed(0,FX,FY,1); //设备号 行 列 亮
delay(50);
lc.setLed(0,FX,FY,0); //设备号 行 列 亮
delay(50);
Button(); // 读取摇杆方向
}
}
// /***************************************************************************************************************************************************************************************************************/
void Button()
{
Up = digitalRead(2); //读取按键的值
Down = digitalRead(3);
Left = digitalRead(4);
Right= digitalRead(5);
Res = digitalRead(6);
if(Up == 0 && KEY != 5) // 这里是在比对按键方向是否和目前蛇的行进方向相反,如果相反就放弃按键
{
K = 8;
}
else if(Down == 0 && KEY != 8)
{
K = 5;
}
else if(Left == 0 && KEY != 6 && K != 0)
{ // 首次操作按键前 不能向左移动蛇
K = 4;
}
else if(Right == 0 && KEY != 4)
{
K = 6;
}
if(Res == LOW) // 当按下中央键后 速度变为 2 松开后 速度恢复到当前值
SpeedS = 2;
else
SpeedS = 8 - Socre / 5;
}
/************************************GameOver函数,显示游戏结束和得分 ******************************************************************************/
void gameover() // 一旦执行到Gameover 程序停止 需要按下重启键后以重启游戏
{
Enabled = 0;
while(Enabled == 0)
{
lc.clearDisplay(0); //清屏
printByte(neutral); //显示标准脸
delay(1000);
lc.clearDisplay(0); //清屏
printfSocre(Socre); //显示分数
delay(1000);
Res = digitalRead(6); //如果重启键按下,跳出循环,重启游戏
if(Res == 0)
{
Enabled=1;
}
}
lc.clearDisplay(0); //清屏
for(int i = 0; i < 129; i++)
{
s[i] = 0;
}
K = 0; // 重置方向
s[1] = 2;
s[2] = 2;
s[3] = 1;
s[4] = 2;
s[5] = 0;
s[6] = 2; // 重置蛇的坐标
Socre = 0; // 重置游戏得分
}
/********************************************主函数***************************************************************************************/
void loop()
{
KEY = K; // 蛇每移动一次 方向才能改变一次
lc.clearDisplay(0);
if(KEY == 8) // 蛇向上运动
{
for(int i = 6 + 2 * Socre; i > 3; i= i - 2)
{
s[i] = s[i - 2];
s[i - 1] = s[i - 3];
}
s[2] = s[2] - 1;
if(s[2] < 0) // 超出边框的从另一边继续出现
s[2] = 7;
}
else if(KEY == 5) // 蛇向下运动
{
for(int i = 6 + 2 * Socre; i > 3; i= i - 2)
{
s[i] = s[i - 2];
s[i - 1] = s[i - 3];
}
s[2] = s[2] + 1;
if(s[2] > 7) // 超出边框的从另一边继续出现
s[2] = 0;
}
else if(KEY == 4) // 蛇向左运动
{
for(int i = 6 + 2 * Socre; i > 3; i= i - 2)
{
s[i] = s[i - 2];
s[i - 1] = s[i - 3];
}
s[1] = s[1] - 1;
if(s[1] < 0) // 超出边框的从另一边继续出现
s[1] = 7;
}
else if(KEY == 6) // 蛇向右运动
{
for(int i = 6 + 2 * Socre; i > 3; i= i - 2)
{
s[i] = s[i - 2];
s[i - 1] = s[i - 3];
}
s[1] = s[1] + 1;
if(s[1] > 7) // 超出边框的从另一边继续出现
s[1] = 0;
}
// 根据按键来移动蛇的身体
for(int i = 1; i <= 6 + 2 * Socre; i+= 2) // 从蛇头开始绘制
{
lc.setLed(0,s[i],s[i + 1],1); //设备号 行 列 亮
}
myDelay(SpeedS); //()内为延时次数 延时一次为100ms 实测200ms速度很合适 故将加速时速度设置为 2
SX = s[1];
SY = s[2];
// 获取蛇头的坐标
for(int i = 3; i <= 6 + 2 * Socre; i+= 2)
{
if( SX == s[i] && SY == s[i + 1])
gameover();
}
// 判断蛇头是否碰到自己的身体,碰到就跳转到GameOver
if(SY == FY && SX == FX)
{
Socre ++;
RANDOM();
if( !(Socre % 5)) // 根据得分加快蛇的速度 每吃5个食物 速度快100ms
{
SpeedS --;
if(SpeedS < 2) // 速度下限为200ms 如果速度小于200ms 速度值仍为200ms
SpeedS = 2;
}
} // 判断是否吃到了食物~吃到了就会加分和重新随机生成食物~
}
//点阵显示函数
void printByte(byte character [])
{
int i = 0;
for(i=0;i<8;i++)
{
lc.setRow(0,i,character[i]);
}
}
/************************************显示分数子函数******************************************************/
void printfSocre(int socre)
{
int tens_place = socre/10;
int ones_place = socre%10;
switch(tens_place)
{
//case 0:printByte(zero);delay(1000); break; //十位不显示0
case 1:printByte(one); delay(1000); break;
case 2:printByte(two); delay(1000); break;
case 3:printByte(three);delay(1000); break;
case 4:printByte(four); delay(1000); break;
case 5:printByte(five); delay(1000); break;
case 6:printByte(six); delay(1000); break;
case 7:printByte(seven);delay(1000); break;
case 8:printByte(eight);delay(1000); break;
case 9:printByte(nine); delay(1000); break;
default:break;
}
switch(ones_place)
{
case 0:printByte(zero); delay(1000); break;
case 1:printByte(one); delay(1000); break;
case 2:printByte(two); delay(1000); break;
case 3:printByte(three);delay(1000); break;
case 4:printByte(four); delay(1000); break;
case 5:printByte(five); delay(1000); break;
case 6:printByte(six); delay(1000); break;
case 7:printByte(seven);delay(1000); break;
case 8:printByte(eight);delay(1000); break;
case 9:printByte(nine); delay(1000); break;
default:break;
}
}
复制代码
作者:
无痕1234
时间:
2018-1-23 13:12
说好的黒币呢,怎么没给我,想下载的
作者:
songxia8013
时间:
2018-12-23 21:29
这程序不全,没有头文件,也没图!感觉不怎么好啊!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1