相關(guān)商品
相關(guān)文章
- 【奧松新品】首款帶車輪Arduino控制板亮相——Arduino Robot
- 【奧松新品】Arduino極客愛:全新無線Linux板–Arduino Yun
- 【奧松新品】Arduino家族新寵兒——以ARM為核心的Arduino Due
- 【奧松新品】源自Sparkfun——MP3 Player Shield評測
- 【奧松新品】MEAS壓電式震動傳感器測評
- 【奧松新品】基于Arduino的觸摸式變色臺燈
- 【奧松新品】集成了Arduino控制器的Ethernet評測
- 【奧松新品】Simulator for Arduino 模擬器使用評測
- 【新書】《Arduino機器人制作指南》助你圓夢
- 【新書】《Arduino機器人權(quán)威指南》于欣龍譯著重磅發(fā)行
- 【新書】《愛上機器人:學(xué)Arduino玩轉(zhuǎn)機器人制作》
- 【新書】Arduino魔法書 實現(xiàn)夢想的工具和技術(shù)
- 【奧松新品】水蒸氣傳感器,打造屬于你的“晴雨表”
- 【奧松新品】小身體,大數(shù)據(jù)——模擬聲音傳感器
- 【奧松新品】Speaker發(fā)聲模塊——打造自己的音樂盒
- 【奧松新品】條形LED模塊——制作光線強度指示燈
- 【奧松新品】TEMT6000光敏傳感器——感光燈制作
- 【奧松新品】可調(diào)微型直流潛水泵
- 【新書】《Arduino制作手冊》于欣龍推薦
- 【新書】《Arduino 完全實戰(zhàn)》經(jīng)典之作,奧松創(chuàng)始人于欣龍推薦!
- 【好書推薦】《Arduino從基礎(chǔ)到實踐》手把手50個案例教你玩轉(zhuǎn)Arduino
- 【新訊快遞】Arduino UNO控制器的新小伙伴 小奧與你深扒Arduino UNO背后的秘密
- 【奧松新品】四位七段數(shù)碼管——制作時鐘
- 【產(chǎn)品測評】基于 ADXL345 三軸加速度計的角度測試儀
【產(chǎn)品測評】LCD12864 液晶搖桿擴展板之貪吃蛇游戲
編輯:neil2016-09-28 瀏覽次數(shù):1233
LCD 12864液晶搖桿擴展板采用全新12864G-0088液晶屏為主體顯示器件。此擴展板采用Arduino疊層板設(shè)計理念,可直接插接到Arduino UNO、Carduino UNO R3、Arduino mega2560、Arduino ADK控制器上使用,可以清晰顯示中文、英文、字符、圖片等;板上添加五向微型搖桿,方便實現(xiàn)人機互動;同時本板還具有5個模擬擴展接口和8個數(shù)字擴展接口;其中各數(shù)字接口均分別用黑色、紅色、黃色排針來區(qū)別電源地、電源正極和信號IO管腳;即方便操作又具有防呆的作用;擴展接口可連接各種傳感器模塊,如溫度濕度傳感器、光線傳感器、LED發(fā)光模塊等,是制作顯示互動作品不可獲缺的顯示器。
簡單的產(chǎn)品介紹之后,就該開始我們今天的貪吃蛇游戲制作了,相信應(yīng)該很多人都玩兒過這個游戲吧?
* 準備硬件
(1)PS2 游戲搖桿模塊 * 1個
(2)LCD12864 液晶擴展板 * 1個
(3)Carduino UNO R3 控制器 * 1個
(4)杜邦線 * 若干
(5)USB 數(shù)據(jù)線 * 1 條
* 硬件連接
如下圖所示將硬件連接在一起
接線說明:1、PS2 游戲搖桿模塊X連接A1(黃色針),Y連接A2(黃色針),B連接A3(黃色針),+ 連接到控制器模擬口電源正(紅色針),- 連接到控制器模擬口電源地(黑色針)
2、LCD12864 液晶擴展板直接可以插接到 Carduino UNO R3 控制器上,只要將引腳對應(yīng)好,就像下圖中所示,然后插進去就可以啦!插好之后擴展板和UNO之間沒有縫隙
* 示例代碼
#include "U8glib.h"
U8GLIB_MINI12864 u8g(5, 6, 2, 4, 3);
#define UP A1
#define LEFT A2
#define key A3
int box_x = 0;
int box_y = 0;
int box_x_length = 98;//x方向32 0-31
int box_y_length = 62;//y方向20 0-19
int snake_max_length = 100; //蛇身體最大長度
int snake_x[100];//蛇身x坐標
int snake_y[100];//蛇身y坐標
int snake_body_width = 3; //蛇身方塊寬度(正方形)
int food_x;//食物位置坐標x
int food_y;//食物位置坐標y
int snake_length = 3; //當前蛇身長度
unsigned int game_speed;//游戲速度 單位MS
void setup(void)
{
welcom();//歡迎界面
delay(2000);
chose_game();
}
//歡迎界面
void welcom()
{
u8g.firstPage();
do
{
u8g.setFont(u8g_font_gdr14r);
u8g.setPrintPos(0, 20);
u8g.print("Arduino");
u8g.setPrintPos(0, 35);
u8g.print(" GAME");
u8g.setFont(u8g_font_9x18);
u8g.setPrintPos(0, 55);
u8g.print("By:ALS ROBOT");
} while (u8g.nextPage());
}
//開始游戲
int chose_game()
{
int flag = 1;
int temp = 1;
Serial.println(analogRead(3));
while (flag)
{
int key = read_key();
u8g.firstPage();
do
{
u8g.setFont(u8g_font_9x18);
u8g.setPrintPos(5, 20);
u8g.print("Snake <");
} while (u8g.nextPage());
temp = 1;
if (analogRead(3) > 500)
{
return temp;
}
}
}
//讀取搖桿值
int read_key()
{
int key_temp;
if(analogRead(2) < 200) {
key_temp = 5;//UP;
return key_temp;
}
if(analogRead(2)> 800) {
key_temp = 6;//DOWN;
return key_temp;
}
if(analogRead(1) < 200) {
key_temp = 7;//LEFT;
return key_temp;
}
if(analogRead(1) > 800) {
key_temp = 8;//RIGHT;
return key_temp;
}
if (analogRead(3) == HIGH) {
key_temp = 9;//A;
return key_temp;
}
return 0;
}
void game_over()//游戲結(jié)束
{
snake_length=3;
snake_x[0] = 15; snake_y[0] = 15;//snake起始坐標
snake_x[1] = snake_x[0] - 1; snake_y[1] = snake_y[0];//snake起始坐標
snake_x[2] = snake_x[1] - 1; snake_y[2] = snake_y[1];//snake起始坐標
}
//貪吃蛇主函數(shù)
void snake()
{
int flag = 1; //標志
snake_x[0] = 15; snake_y[0] = 15;//snake起始坐標
snake_x[1] = snake_x[0] - 1; snake_y[1] = snake_y[0];//snake起始坐標
snake_x[2] = snake_x[1] - 1; snake_y[2] = snake_y[1];//snake起始坐標
int snake_dir=8;//初始方向 right
game_speed=30;
int food_flag=1;
Serial.println("snake!");
food();
while (flag)
{
snake_frame(500);
delay(game_speed);
switch(read_key())
{
case 5:
if(snake_dir!=6)
{
snake_dir=5;
break;
}
case 6:
if(snake_dir!=5)
{
snake_dir=6;
break;
}
case 7:
if(snake_dir!=8)
{
snake_dir=7;
break;
}
case 8:
if(snake_dir!=7)
{
snake_dir=8;
break;
}
default:break;
}
if(snake_eat_food(snake_dir)==1)
{
food();
if(snake_length<10){game_speed=150;}
if(snake_length<30&&snake_length>=10){game_speed=180;}
if(snake_length<50&&snake_length>=30){game_speed=200;}
if(snake_length>=50){game_speed=0;}
}
else
{
if(snake_knock_wall(snake_dir==1))
{
game_over();
flag=0;
}
else
{
if(snake_eat_body(snake_dir)==1)
{
game_over();
flag=0;
}
else
{
change_con(snake_dir);
}
}
}
}
}
//游戲主界面
void snake_frame(int s)
{
u8g.firstPage();
do
{
u8g.drawFrame(box_x, box_y, box_x_length, box_y_length);
u8g.setFont(u8g_font_5x8);
u8g.setPrintPos(box_x_length + 1, 12);
u8g.print("Score");
u8g.setPrintPos(box_x_length + 1, 22);
u8g.print((snake_length - 3) * 5);
u8g.setPrintPos(box_x_length + 1, 46);
u8g.print("Speed");
u8g.setPrintPos(box_x_length + 1, 56);
u8g.print(30-s);
u8g.drawFrame(food_x*snake_body_width+1, food_y*snake_body_width+1, snake_body_width, snake_body_width);//顯示食物
for (int i = 0; i < snake_length; i++)//顯示snake
{
if(i==0)
{
u8g.drawBox(snake_x[i]*snake_body_width+1, snake_y[i]*snake_body_width+1, snake_body_width, snake_body_width);
}
else
{
u8g.drawFrame(snake_x[i]*snake_body_width+1, snake_y[i]*snake_body_width+1, snake_body_width, snake_body_width);
}
}
} while (u8g.nextPage());
}
//食物隨機坐標生成函數(shù)
void food()
{
int flag = 1;
while (flag)
{
food_x = random(0,(box_x_length-2)/3);
food_y = random(0,(box_y_length-2)/3);
for (int i = 0; i < snake_length; i++)
{
if((food_x==snake_x[i])&&(food_y==snake_y[i]))
{
break;
}
flag=0;
}
}
}
//移動后坐標變換函數(shù)
void change_con(int DIR)
{
int temp_x[snake_length+2];
int temp_y[snake_length+2];
for(int i=0;i<snake_length-1;i++)//將舊坐標數(shù)據(jù)存放到temp數(shù)組 最后一位數(shù)據(jù)無效
{
temp_x[i]=snake_x[i];
temp_y[i]=snake_y[i];
}
switch(DIR)
{
case 8: {snake_x[0]+=1;break;}
case 7: {snake_x[0]-=1;break;}
case 5: {snake_y[0]-=1;break;}
case 6: {snake_y[0]+=1;break;}
}
for(int i=1;i<snake_length;i++)
{
snake_x[i]=temp_x[i-1];
snake_y[i]=temp_y[i-1];
}
}
//吃到食物后坐標變換
void change_pos()
{
int temp_x[snake_length+2];
int temp_y[snake_length+2];
for(int i=0;i<snake_length-1;i++)//將舊坐標數(shù)據(jù)存放到temp數(shù)組 最后一位數(shù)據(jù)無效
{
temp_x[i]=snake_x[i];
temp_y[i]=snake_y[i];
}
snake_x[0]=food_x;
snake_y[0]=food_y;
for(int i=1;i<snake_length;i++)
{
snake_x[i]=temp_x[i-1];
snake_y[i]=temp_y[i-1];
}
}
//判斷是否吃到食物 0-沒有吃到 1-吃到 2-無效
int snake_eat_food(int dir)
{
int x_temp=snake_x[0];
int y_temp=snake_y[0];
switch(dir)
{
case 5 :y_temp-=1;break;
case 6 :y_temp+=1;break;
case 7 :x_temp-=1;break;
case 8 :x_temp+=1;break;
}
if((x_temp==food_x)&&(y_temp==food_y))
{
snake_length+=1;
change_pos();
return 1;
}
else
{
return 0;
}
}
//判斷是否撞墻 0-沒有撞到 1-撞到 2-無效
int snake_knock_wall(int dir)
{
int x_temp=snake_x[0];
int y_temp=snake_y[0];
switch(dir)
{
case 5 :y_temp-=1;break;
case 6 :y_temp+=1;break;
case 7 :x_temp-=1;break;
case 8 :x_temp+=1;break;
}
if(x_temp<0||x_temp>31||y_temp<0||y_temp>19)
{
return 1;
}
else
{
return 0;
}
}
//判斷是否吃到自己 0-沒有吃到 1-吃到 2-無效
int snake_eat_body(int dir)
{
int x_temp=snake_x[0];
int y_temp=snake_y[0];
switch(dir)
{
case 5 :y_temp-=1;break;
case 6 :y_temp+=1;break;
case 7 :x_temp-=1;break;
case 8 :x_temp+=1;break;
}
for(int i=1;i<snake_length;i++)
{
if((snake_x[0]==snake_x[i])&&(snake_y[0]==snake_y[i]))
{
return 1;
}
}
return 0;
}
void loop(void)//主循環(huán)函數(shù)
{
while (1)
{
switch (chose_game())
{
case 1: snake(); break;
default:break;
}
}
}
注意此程序需要使用到庫文件,大家可以點擊此處,進入奧松機器人官方技術(shù)論壇,下載示例程序及庫文件。
* 程序效果
如圖所示,為程序上傳后 LCD12864 液晶擴展板顯示效果
開機畫面會停留 2 秒,然后按下 PS2 搖桿模塊的按鈕,就會進入貪吃蛇游戲,界面如下圖所示,快來體驗一下吧。
----------------------------------------------------------------------------------------------------------------
奧松機器人官網(wǎng):www.robotbase.cn
微信號:搜索公眾號“奧松機器人”
QQ群: 271230889(討論,解惑)
微博:@奧松機器人基地
----------------------------------------------------------------------------------------------------------------
溫馨提示:予人玫瑰,手留余香;如果你喜歡這篇文章,不妨轉(zhuǎn)發(fā)推薦給你身邊的朋友!
用戶評價
暫時還沒有任何用戶評論