當(dāng)前位置:首頁 > 工業(yè)控制 > 電路設(shè)計(jì)項(xiàng)目集錦
[導(dǎo)讀]用Arduino Nano和SSD1306 OLED與PCBX仿真構(gòu)建推盒游戲!創(chuàng)造有趣的互動體驗(yàn)。

用Arduino Nano和SSD1306 OLED與PCBX仿真構(gòu)建推盒游戲!創(chuàng)造有趣的互動體驗(yàn)。

介紹

Push Box Game基于Arduino Nano和SSD1306 OLED顯示屏,主要包括以下幾個部分:

在線仿真顯示

描述

Arduino Nano:

?作為游戲的控制單元,處理用戶輸入和游戲邏輯。

SSD1306 OLED顯示屏:

?用于顯示游戲界面,包括玩家、盒子、目標(biāo)位置和邊界。

按鈕:

?四個按鈕用于控制玩家的上下左右移動。

連接方法:

?SSD1306 OLED顯示屏通過I2C接口與Arduino Nano相連。

?四個按鈕連接到Arduino Nano的數(shù)字引腳上,每個按鈕都需要一個上拉電阻,以確保穩(wěn)定的信號讀取。

項(xiàng)目簡介:

該程序的主要功能和特點(diǎn)如下:

初始化(設(shè)置):

?設(shè)置串行通信。

?初始化OLED顯示屏并顯示游戲標(biāo)題。

?將按鈕引腳初始化為輸入上拉模式。

?調(diào)用initGame()函數(shù)來設(shè)置游戲的初始狀態(tài)。

游戲循環(huán)(循環(huán)):

?主游戲循環(huán),即持續(xù)讀取按鍵狀態(tài),更新游戲狀態(tài),并在游戲進(jìn)行期間重新繪制游戲地圖(gameRunning為真)。

初始化游戲:

?設(shè)置玩家的初始位置。

?隨機(jī)生成盒子和目標(biāo)的位置,確保它們距離邊界至少有10個像素(即兩個塊單元)。

繪制游戲地圖(drawMap):

?清除顯示并重新繪制游戲地圖,包括邊界、玩家、盒子和目標(biāo)位置。

讀取按鈕(readButtons):

?檢測按鈕狀態(tài),如果按鈕被按下,調(diào)用movePlayer()函數(shù)來移動播放器。

移動播放器(movePlayer):

?根據(jù)按鍵輸入更新玩家的位置。

?如果玩家移動到一個盒子的位置,嘗試推動盒子。

?檢查游戲是否獲勝。

檢查獲勝條件(checkWinCondition):

?如果所有方塊都在目標(biāo)位置,則顯示獲勝消息并重新開始游戲。

更新游戲(updateGame):

?可以在這里添加額外的游戲邏輯,如得分或關(guān)卡更改。

預(yù)防措施:

?確保所有連接正確,特別是I2C連接和按鈕的上拉電阻。

?在實(shí)際部署前測試每個組件,以確保它們正常工作。

?該程序使用隨機(jī)數(shù)來初始化盒子和目標(biāo)的位置,這可能導(dǎo)致一些游戲配置無法解決。您可能需要添加額外的邏輯來確保生成的布局是可解決的。

代碼

#include

#include

#include

#define SCREEN_WIDTH 128 // OLED display width, in pixels

#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)

// 初始化OLED顯示屏

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// 游戲地圖的尺寸(以方塊為單位)

#define MAP_WIDTH 16 // 地圖寬度,方塊數(shù)

#define MAP_HEIGHT 8 // 地圖高度,方塊數(shù)

// 玩家、箱子和目標(biāo)的位置

int playerX = 1;

int playerY = 1;

int boxX[2] = {2, 4};

int boxY[2] = {1, 3};

int targetX[2] = {3, 5}; // 兩個目標(biāo)位置

int targetY[2] = {1, 3};

bool gameRunning = true;

// 按鈕引腳

const int buttonUp = 2;

const int buttonDown = 3;

const int buttonLeft = 4;

const int buttonRight = 5;

void setup() {

Serial.begin(9600);

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x64

display.clearDisplay();

display.setTextSize(1);

display.setTextColor(WHITE);

display.setCursor(0, 0);

display.println("推箱子游戲");

display.display();

delay(2000); // 顯示初始化效果2秒

initGame();

// 初始化按鈕引腳為輸入上拉模式

pinMode(buttonUp, INPUT_PULLUP);

pinMode(buttonDown, INPUT_PULLUP);

pinMode(buttonLeft, INPUT_PULLUP);

pinMode(buttonRight, INPUT_PULLUP);

}

void loop() {

if (gameRunning) {

readButtons();

updateGame();

drawMap();

delay(100);

}

}

void initGame() {

// 初始化游戲狀態(tài)

playerX = 1;

playerY = 1;

boxX[0] = 2;

boxY[0] = 1;

boxX[1] = 4;

boxY[1] = 3;

gameRunning = true;

}

// 繪制游戲地圖

void drawMap() {

display.clearDisplay();

// 繪制游戲邊界框的線條

display.drawLine(0, 0, MAP_WIDTH * 5 - 1, 0, BLACK); // 上邊框

display.drawLine(0, 5 * MAP_HEIGHT - 1, MAP_WIDTH * 5 - 1, 5 * MAP_HEIGHT - 1, WHITE); // 下邊框

display.drawLine(0, 0, 0, 5 * MAP_HEIGHT - 1, WHITE); // 左邊框

display.drawLine(5 * MAP_WIDTH - 1, 0, 5 * MAP_WIDTH - 1, 5 * MAP_HEIGHT - 1, WHITE); // 右邊框

// 繪制玩家位置

display.drawRect(playerX * 5, playerY * 5, 5, 5, WHITE); // 玩家方塊尺寸:5x5

// 繪制箱子位置

for (int i = 0; i < 2; i++) {

display.fillRect(boxX[i] * 5, boxY[i] * 5, 5, 5, WHITE); // 箱子方塊尺寸:5x5

}

// 繪制目標(biāo)位置,使用黃色表示

for (int i = 0; i < 2; i++) {

display.drawRect(targetX[i] * 5, targetY[i] * 5, 5, 5, WHITE); // 目標(biāo)方塊尺寸:5x5,顏色:黃色(0xFFFF)

}

display.display();

}

// 按鈕讀取和消抖邏輯

void readButtons() {

static unsigned long lastDebounceTime = 0;

static unsigned long debounceDelay = 50;

unsigned long currentMillis = millis();

if (digitalRead(buttonUp) == LOW && (currentMillis - lastDebounceTime) > debounceDelay) {

lastDebounceTime = currentMillis;

movePlayer(0, -1);

}

if (digitalRead(buttonDown) == LOW && (currentMillis - lastDebounceTime) > debounceDelay) {

lastDebounceTime = currentMillis;

movePlayer(0, 1);

}

if (digitalRead(buttonLeft) == LOW && (currentMillis - lastDebounceTime) > debounceDelay) {

lastDebounceTime = currentMillis;

movePlayer(-1, 0);

}

if (digitalRead(buttonRight) == LOW && (currentMillis - lastDebounceTime) > debounceDelay) {

lastDebounceTime = currentMillis;

movePlayer(1, 0);

}

}

void movePlayer(int dx, int dy) {

// 玩家移動邏輯

int newX = playerX + dx;

int newY = playerY + dy;

// 檢查新位置是否在地圖范圍內(nèi)

if (newX >= 0 && newX < MAP_WIDTH && newY >= 0 && newY < MAP_HEIGHT) {

// 檢查新位置是否不是墻壁

if (!isWall(newX, newY)) {

// 檢查新位置是否是箱子

for (int i = 0; i < 2; i++) {

if (newX == boxX[i] && newY == boxY[i]) {

// 嘗試推動箱子

int boxNewX = boxX[i] + dx;

int boxNewY = boxY[i] + dy;

if (!isWall(boxNewX, boxNewY) && !isBox(boxNewX, boxNewY)) {

boxX[i] = boxNewX;

boxY[i] = boxNewY;

playerX = newX;

playerY = newY;

checkWinCondition();

return;

}

}

}

// 移動玩家

playerX = newX;

playerY = newY;

}

}

}

bool isWall(int x, int y) {

// 定義墻壁位置

return (x == 0 || x == MAP_WIDTH - 1) || (y == 0 || y == MAP_HEIGHT - 1);

}

bool isBox(int x, int y) {

// 檢查位置是否有箱子

for (int i = 0; i < 2; i++) {

if (x == boxX[i] && y == boxY[i]) {

return true;

}

}

return false;

}

void checkWinCondition() {

// 檢查所有箱子是否都在目標(biāo)位置

bool allBoxesAtTarget = true;

for (int i = 0; i < 2; i++) {

if (boxX[i] != targetX[i] || boxY[i] != targetY[i]) {

allBoxesAtTarget = false;

break;

}

}

if (allBoxesAtTarget) {

gameRunning = false;

display.clearDisplay();

display.setTextSize(1);

display.setTextColor(WHITE);

display.setCursor(0, 0);

display.println("Congratulations!!");

display.println("You win!");

display.display();

delay(300);

initGame(); // 重新開始游戲

}

}

void updateGame() {

// 游戲邏輯更新

}

本文編譯自hackster.io

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉