- #include "U8glib.h"//引用U8G頭文件
- U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);//設置設備名稱:I2C-SSD1306-128*64(OLED)
- #define UP 5//定義方向鍵上
- #define DOWN 4//定義方向鍵下
- #define LEFT 3//定義方向鍵左
- #define RIGHT 2//定義方向鍵右
- #define A 8 //定義開始確定按鍵
- //PS2
- int JoyStick_X = A0; //定義PS2搖桿的X軸,ANALOG IN的A0
- int JoyStick_Y = A1; //定義PS2搖桿的Y軸,ANALOG IN的A1
- int JoyStick_Z = A2; //定義PS2搖桿的Z軸,ANALOG IN的A2
- /***********************************************/
- int box_x = 0;//定義變量
- int box_y = 0;//定義變量
- //int box_width = 2;
- 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;//設置游戲速度
- /***********************************************/
- void setup(void)
- {
-
- pinMode(JoyStick_X, INPUT);
- pinMode(JoyStick_Y, INPUT);
- pinMode(JoyStick_Z, INPUT);
- welcome();//歡迎界面
- delay(2500);
- chose_game();//選擇界面
- }
- /***********************************************/
- void welcome()
- {
- u8g.firstPage();//第一頁顯示
- do
- {
- u8g.setFont(u8g_font_gdr14r);//坐標函數
- u8g.setPrintPos(0, 20);
- u8g.print("Snake Game");
- u8g.setPrintPos(0, 38);
- u8g.print(" v2.0");
- u8g.setFont(u8g_font_9x18);
- u8g.setPrintPos(0, 55);
- u8g.print("Formatmemory");
- } while (u8g.nextPage());
- }
- /***********************************************/
- int chose_game()//對選擇界面進行定義
- {
- int flag = 1;
- int temp = 1;
- while (flag)
- {
- int key = read_key();
- if (key == UP)
- {
- u8g.firstPage();
- do
- {
- u8g.setFont(u8g_font_9x18);
- u8g.setPrintPos(5, 20);
- u8g.print("Snake <");
- u8g.setPrintPos(5, 40);
- u8g.print("Player");
- } while (u8g.nextPage());
- temp = 1;
- }
- if (key == DOWN)
- {
- u8g.firstPage();
- do
- {
- u8g.setFont(u8g_font_9x18);
- u8g.setPrintPos(5, 20);
- u8g.print("Snake");
- u8g.setPrintPos(5, 40);
- u8g.print("Player <");
- } while (u8g.nextPage());
- temp = 2;
- }
- if (key == A)
- {
- return temp;
- }
- }
- }
- /***********************************************/
- int read_key()//對按鍵進行定義
- {
- int key_temp;
- int x=analogRead(JoyStick_X);
- int y=analogRead(JoyStick_Y);
- int z=digitalRead(JoyStick_Z);
- if (x>850) {
- key_temp = DOWN;
- return key_temp;
- }
- if (x<250) {
- key_temp = UP;
- return key_temp;
- }
- if (y>850) {
- key_temp = LEFT;
- return key_temp;
- }
- if (y<250) {
- key_temp = RIGHT;
- return key_temp;
- }889888888888888I888888888888888888888888888888888888888888888888888888888888I8I88888888I8II
- if (z == HIGH) {
- key_temp = A;
- return key_temp;
- }
- return 0;
- }
- /***********************************************/
- void game_over()//對游戲結束進行定義
- {
- u8g.firstPage();
- do
- {
- u8g.setFont(u8g_font_gdr14r);
- u8g.setPrintPos(0, 40);
- u8g.print(" GAME OVER!");
- }
-
- while (u8g.nextPage());
- 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起始坐標
- }
- 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=RIGHT;//初始方向 right
- game_speed=30;
- int food_flag=1;
- Serial.println("snake!");
- food();
- while (flag)
- {
- snake_frame(game_speed);
- delay(game_speed);
- switch(read_key())
- {
- case UP:
- if(snake_dir!=DOWN)
- {
- snake_dir=UP;
- break;
- }
- case DOWN:
- if(snake_dir!=UP)
- {
- snake_dir=DOWN;
- break;
- }
- case LEFT:
- if(snake_dir!=RIGHT)
- {
- snake_dir=LEFT;
- break;
- }
- case RIGHT:
- if(snake_dir!=LEFT)
- {
- snake_dir=RIGHT;
- break;
- }
- default:break;
- }
- if(snake_eat_food(snake_dir)==1)
- {
- food();
- if(snake_length<10){game_speed=30;}
- if(snake_length<30&&snake_length>=10){game_speed=20;}
- if(snake_length<50&&snake_length>=30){game_speed=10;}
- 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());
- }
- 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;
- }
- }
- // Serial.print("food_x:");
- // Serial.print(food_x);
- // Serial.print(" food_y:");
- // Serial.println(food_y);
- }
- 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++)//將舊坐標數據存放到temp數組 最后一位數據無效
- {
- temp_x[i]=snake_x[i];
- temp_y[i]=snake_y[i];
- }
- switch(DIR)
- {
- case RIGHT: {snake_x[0]+=1;break;}
- case LEFT: {snake_x[0]-=1;break;}
- case UP: {snake_y[0]-=1;break;}
- case DOWN: {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++)//將舊坐標數據存放到temp數組 最后一位數據無效
- {
- 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 UP :y_temp-=1;break;
- case DOWN :y_temp+=1;break;
- case LEFT :x_temp-=1;break;
- case RIGHT :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 UP :y_temp-=1;break;
- case DOWN :y_temp+=1;break;
- case LEFT :x_temp-=1;break;
- case RIGHT :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 UP :y_temp-=1;break;
- case DOWN :y_temp+=1;break;
- case LEFT :x_temp-=1;break;
- case RIGHT :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;
- }
- /***********************************************/
- //使用說明(player)主函數
- void tetrs()
- {
- int flag = 1;
- while (flag)
- {
- u8g.firstPage();
- do
- {
- u8g.setFont(u8g_font_9x18);
- u8g.setPrintPos(1, 20);
- u8g.print("1.UP:chose1");
- u8g.setPrintPos(1, 35);
- u8g.print("2:start is:A");
- u8g.setPrintPos(1, 50);
- u8g.print("3.enjoy it");
-
- } while (u8g.nextPage());
- delay(1000);
- flag=0;
- }
- }
- /***********************************************/
- void loop(void)//主循環函數
- {
- while (1)
- {
- switch (chose_game())
- {
- case 1: snake(); break;
- case 2: tetrs(); break;
- default:break;
- }
- }
- }
復制代碼 |