|
发表于 2013-10-6 00:33:59
|
显示全部楼层
参照LZ的原理, 也写了一个 “MAX7219 8x8 LED" 贪吃蛇游戏...
- #include "LedControl.h"
- /*
- MAX7219 8x8 LED
- pin 12 is connected to the DataIn
- pin 11 is connected to the CLK
- pin 10 is connected to LOAD (CS)
- */
-
- LedControl lc=LedControl(12,11,10,1);
- int xValue; // JoyStick-Y
- int yValue; // JoyStick-X
- int SkValue; // JokStick-Click
- int Sxy[3][2]= {{2,4},{1,4},{0,4}}; //蛇身体坐标集合,一共3个点
- int speedS=8; //贪吃蛇的初始速度
- int FX,FY; //食物的坐标
- int SX,SY; //蛇头的坐标
- char KEY ='d'; // up, down, left, right
- int Speed =8;
-
- void setup() {
- /*
- The MAX72XX is in power-saving mode on startup,
- we have to do a wakeup call
- */
- lc.shutdown(0,false);
- /* Set the brightness to a medium values */
- lc.setIntensity(0,2);
- /* and clear the display */
- lc.clearDisplay(0);
- Serial.begin(9600);
- delay(5000);
- pinMode(9,INPUT);
- //循环绘制蛇的身体,3个点
- resetSnake();
- }
-
- void loop() {
- //获得 按键信息
- xValue = analogRead(A0); // JoyStick-Y
- yValue = analogRead(A1); // JoyStick-X
- SkValue = digitalRead(9); // JokStick-Click
-
- //获得的按键信息 发送串口
- Serial.print("Y : ");
- Serial.println(yValue);
- Serial.print("X : ");
- Serial.println(xValue);
- Serial.print("Sk : ");
- Serial.println(SkValue);
- //获得 按键信息
- if(yValue>700)
- {
- KEY='r';
- }
- if(yValue<300) {
- KEY='l';
- }
- if(xValue>700)
- {
- KEY='d';
- }
- if(xValue<300) {
- KEY='u';
- }
- if(SkValue ==0)
- {
- lc.clearDisplay(0);
- resetSnake();
- }
- drawSnake(LOW);
- if(KEY =='u') {
- SX =Sxy[0][0]-1; // up
- SY =Sxy[0][1];
- /* 根据按键来移动蛇的身体
- Sxy[2][0] = Sxy[1][0];
- Sxy[2][1] = Sxy[1][1];
- Sxy[1][0] = Sxy[0][0];
- Sxy[1][1] = Sxy[0][1];
- */
- for (int i=2; i>0; i--) {
- Sxy[i][0] = Sxy[i-1][0];
- Sxy[i][1] = Sxy[i-1][1];
- }
- Sxy[0][0] =SX;
- Sxy[0][1] =SY;
- }
- if(KEY =='d') {
- SX =Sxy[0][0]+1; // down
- SY =Sxy[0][1];
- for (int i=2; i>0; i--) {
- Sxy[i][0] = Sxy[i-1][0];
- Sxy[i][1] = Sxy[i-1][1];
- }
- Sxy[0][0] =SX;
- Sxy[0][1] =SY;
- }
- if(KEY =='r') {
- SX =Sxy[0][0];
- SY =Sxy[0][1]+1; // right
- for (int i=2; i>0; i--) {
- Sxy[i][0] = Sxy[i-1][0];
- Sxy[i][1] = Sxy[i-1][1];
- }
- Sxy[0][0] =SX;
- Sxy[0][1] =SY;
- }
- if(KEY =='l') {
- SX =Sxy[0][0];
- SY =Sxy[0][1]-1; // left
- for (int i=2; i>0; i--) {
- Sxy[i][0] = Sxy[i-1][0];
- Sxy[i][1] = Sxy[i-1][1];
- }
- Sxy[0][0] =SX;
- Sxy[0][1] =SY;
- }
- //判断是否超出边框,超出就跳转到GameOver
- if(SY<0 || SY>7 || SX<0 || SX>7) {
- gameover();
- resetSnake();
- }
- //判断是否吃到了食物~吃到就会加分和重新随机生成食物~
- if(Sxy[0][0]==FX && Sxy[0][1]==FY) {
- RANDOM();
- Speed --;
- if (Speed<0) {
- Speed = 0;
- }
- }
- drawSnake(HIGH);
- WAIT(Speed);
- }
-
- // 重置蛇的坐标
- void resetSnake() {
- int k=millis()%10 + 1;
- for(int i=0; i<k; i++) {
- RANDOM(); //获取一个随机食物坐标
- }
- for (int i=0; i<3; i++) {
- // Sxy[3][2]= {{2,4},{1,4},{0,4}};
- Sxy[i][0] =2-i;
- Sxy[i][1] =4;
- }
- KEY ='d';
- Speed = 8;
- WAIT(5);
- }
- // 绘制蛇的函数
- void drawSnake(boolean OnOff) {
- for (int i=0; i<3; i++) {
- lc.setLed(0,Sxy[i][0],Sxy[i][1],OnOff);
- }
- }
- //随机食物获取函数
- void RANDOM()
- {
- FX=random(0, 7);
- FY=random(0, 7);
- }
- //通过不断闪现食物来完成延迟,这样既可以做到精确延时,也可以让食物不断闪动
- void WAIT(int timeF)
- {
- for(int t=1;t<=timeF;t++) {
- lc.setLed(0,FX,FY,HIGH);
- delay(50);
- lc.setLed(0,FX,FY,LOW);
- delay(50);
- }
- }
- //GameOver函数,游戏结束
- void gameover()
- {
- for (int j=0; j<10; j++) {
- drawSnake(HIGH);
- delay(250);
- drawSnake(LOW);
- delay(150);
- }
- delay(5000);
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|