이 프로젝트 정보
이것은 인터넷에서 찾은 비디오 게임을 기반으로 한 프로젝트입니다. 이 프로젝트에는 캐릭터가 장애물을 뛰어 넘거나 충돌할 때 신호음을 내는 부저와 같은 많은 기능이 있습니다. 또한 비디오 게임 느낌을 주기 위해 조이스틱(버튼이 있어야 함)이 있습니다. 조이스틱의 버튼을 눌러 점프하기만 하면 되기 때문입니다. 이 비디오 게임은 당신이 추측한 것입니다! (한 남자가 달리고 장애물을 뛰어 넘고 피합니다.) 이 게임의 목적은 최대한 많은 점수를 얻는 것입니다(코스에 있고 장애물을 피하는 1초마다 1점).
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드"> 코드
<울> 코드
코드Arduino
#include #define PIN_BUTTON 2#define PIN_AUTOPLAY 1#define PIN_BUZZER 8#define PIN_READWRITE 10#define PIN_CONTRAST 12#define SPRITE_RUN1 1#define SPRITE_RUN2 2#define SPRITE_JU' // 사용 '.' # 머리에 대한 문자#define SPRITE_JUMP_LOWER 4#define SPRITE_TERRAIN_EMPTY ' ' // ' ' 문자를 사용합니다.#define SPRITE_TERRAIN_SOLID 5#define SPRITE_TERRAIN_SOLID_HORIZON_DEFINITE SPRITE_TERRAIN_SOLID_1화면의 위치 PODEfine HERRAIN_7#define_LEFT TERRAIN_EMPTY 0#define TERRAIN_LOWER_BLOCK 1#define TERRAIN_UPPER_BLOCK 2#define HERO_POSITION_OFF 0 // 영웅은 투명하지 않습니다.#define HERO_POSITION_RUN_LOWER_1 1 // 영웅은 아래쪽 행에서 실행 중입니다(포즈 1). / 점프 시작#define HERO_POSITION_JUMP_2 4 // 반올림#define HERO_POSITION_JUMP_3 5 // 상단 점프#define HERO_POSITION_JUMP_4 6 // 상단 점프#define HERO_POSITION_JUMP_5 7 // 점프 상단 HEROMP_6define 8 // 점프는 상단 행#define HERO_POSITION_JUMP_7 9 // 반쯤 내려감#define HERO_POSITION_JUMP_8 10 // 착지 예정#define HERO_POSITION_RUN_UPPER_1 11 // 영웅은 위쪽 행에서 실행 중입니다(포즈 1)#define HERO_POSITION_RUN_UPPER_2 12 // (포즈 2)LiquidCrystal lcd(11, 9, 6, 5, 4, 3);static char TerrainUpper[TERRAIN_WIDTH + 1];static char TerrainLower [TERRAIN_WIDTH + 1];static bool buttonPushed =false;void initializeGraphics(){ static byte graphics[] ={ // 위치 1 실행 B01100, B01100, B00000, B01110, B11100, B01100, B10010, B1 위치 실행 B01100, B01100, B00000, B01100, B01100, B01100, B01100, B01110, // 점프 B01100, B01100, B00000, B11110, B01101, B11111, B10000, B00000, // 점프 낮은 B11110, B01101, B11111, B10000, B00000, B00000 , B00000, B00000, // 접지 B11111, B11111, B11111, B11111, B11111, B11111, B11111, B10, B10, B0 B0101, // 접지 오른쪽 B00011, B00011, B000010, B000010 B11000, B11000, B11000, B11000, B11000, B11000, B11000, }; 정수 나; // 문자 0을 사용하여 건너뛰면 lcd.print()를 사용하여 // 여러 문자를 빠르게 그릴 수 있습니다. for (i =0; i <7; ++i) { lcd.createChar(i + 1, &graphics[i * 8]); } for (i =0; i 9999) ? 5 :(점수> 999) ? 4 :(점수> 99) ? 3 :(점수> 9) ? 2:1; // 장면 지형 그리기Upper[TERRAIN_WIDTH] ='\0'; 지형낮음[TERRAIN_WIDTH] ='\0'; 문자 온도 =지형상단[16자리]; TerrainUpper[16자리] ='\0'; lcd.setCursor(0,0); lcd.print(지형상단); TerrainUpper[16자리] =온도; lcd.setCursor(0,1); lcd.print(지형 하강); lcd.setCursor(16 - 숫자, 0); lcd.print(점수); TerrainUpper[HERO_HORIZONTAL_POSITION] =upperSave; TerrainLower[HERO_HORIZONTAL_POSITION] =lowerSave; return collide;}// 버튼 푸시를 인터럽트로 처리합니다. buttonPush() { buttonPushed =true;}void setup(){ pinMode(PIN_READWRITE, OUTPUT); 디지털 쓰기(PIN_READWRITE, 낮음); 핀모드(PIN_CONTRAST, 출력); 디지털 쓰기(PIN_CONTRAST, LOW); 핀모드(PIN_BUTTON, 입력); 디지털 쓰기(PIN_BUTTON, HIGH); 핀모드(PIN_AUTOPLAY, 출력); 디지털 쓰기(PIN_AUTOPLAY, 높음); pinMode(PIN_BUZZER,OUTPUT);//버저 핀을 출력으로 초기화 digitalWrite(PIN_BUZZER, LOW); // 디지털 핀 2는 인터럽트 0에 매핑됩니다. attachInterrupt(0/*PIN_BUTTON*/, buttonPush, FALLING); 초기화 그래픽(); lcd.begin(16, 2);}무효 루프(){ 정적 바이트 heroPos =HERO_POSITION_RUN_LOWER_1; 정적 바이트 newTerrainType =TERRAIN_EMPTY; 정적 바이트 newTerrainDuration =1; 정적 부울 재생 =false; 정적 부울 깜박임 =거짓; 정적 unsigned int 거리 =0; if (!playing) { drawHero((blink) ? HERO_POSITION_OFF :heroPos, TerrainUpper, TerrainLower, 거리>> 3); if (깜박임) { lcd.setCursor(0,0); lcd.print("시작을 누르세요"); } 지연(250); 깜박임 =!깜박임; if (buttonPushed) { initializeGraphics(); 영웅 위치 =HERO_POSITION_RUN_LOWER_1; 재생 =사실; 버튼푸시 =거짓; 거리 =0; } 반품; } // 지형을 왼쪽으로 이동 AdvanceTerrain(terrainLower, newTerrainType ==TERRAIN_LOWER_BLOCK ? SPRITE_TERRAIN_SOLID :SPRITE_TERRAIN_EMPTY); AdvanceTerrain(terrainUpper, newTerrainType ==TERRAIN_UPPER_BLOCK ? SPRITE_TERRAIN_SOLID :SPRITE_TERRAIN_EMPTY); // 오른쪽에 들어갈 새 지형을 만듭니다. if (--newTerrainDuration ==0) { if (newTerrainType ==TERRAIN_EMPTY) { newTerrainType =(random(3) ==0) ? TERRAIN_UPPER_BLOCK :TERRAIN_LOWER_BLOCK; newTerrainDuration =2 + random(10); } else { 새로운 지형 유형 =TERRAIN_EMPTY; newTerrainDuration =10 + random(10); } } if (buttonPushed) { if (heroPos <=HERO_POSITION_RUN_LOWER_2) heroPos =HERO_POSITION_JUMP_1; 버튼푸시 =거짓; 디지털 쓰기(PIN_BUZZER, 높음); } if (drawHero(heroPos, TerrainUpper, TerrainLower, 거리>> 3)) { 재생 =거짓; // 영웅이 무언가와 충돌했습니다. 너무 나빠. for (int i =0; i <=2; i++) { digitalWrite(PIN_BUZZER, HIGH); 지연(100); 디지털 쓰기(PIN_BUZZER, LOW); 지연(100); } } else { if (heroPos ==HERO_POSITION_RUN_LOWER_2 || heroPos ==HERO_POSITION_JUMP_8) { heroPos =HERO_POSITION_RUN_LOWER_1; } else if ((heroPos>=HERO_POSITION_JUMP_3 &&heroPos <=HERO_POSITION_JUMP_5) &&TerrainLower[HERO_HORIZONTAL_POSITION] !=SPRITE_TERRAIN_EMPTY) { heroPos =HERO_POSITION_RUN_UPPER_1 } else if (heroPos>=HERO_POSITION_RUN_UPPER_1 &&TerrainLower[HERO_HORIZONTAL_POSITION] ==SPRITE_TERRAIN_EMPTY) { heroPos =HERO_POSITION_JUMP_5; } else if (heroPos ==HERO_POSITION_RUN_UPPER_2) { heroPos =HERO_POSITION_RUN_UPPER_1; } else { ++heroPos; } ++거리; digitalWrite(PIN_AUTOPLAY, 지형낮음[HERO_HORIZONTAL_POSITION + 2] ==SPRITE_TERRAIN_EMPTY ? HIGH :LOW); } 지연(100); 디지털 쓰기(PIN_BUZZER,LOW);}
섹션> 회로도
표지 이미지에 모든 배선이 표시되지 않았으므로 모든 부품을 함께 연결하는 방법을 보여줍니다.