BASIC4MCU | 질문게시판 | 장애물 회피 게임
페이지 정보
작성자 헬창 작성일2023-05-20 18:00 조회455회 댓글1건첨부파일
본문
저희는 장애물 회피게임을 설계중입니다. 코드에서 dino로 지정한 캐릭터"-"를 사용자가 스위치를 통해서 조정하여 왼쪽으로부터 오는 장애물을 피하는 게임입니다.
sw1을 두번 누르면 fnd 첫번째 칸에 캐릭터(-)가 생성되고 이를 위아래로 이동시킬 수 있고, fnd 오른쪽 첫번째칸에서부터 장애물이 생성되어서 한칸씩 건너와서 위치가 다르면 장애물이 피해지고, 같으면 게임이 종료되도록 만들고 싶은데 캐릭터와 장애물 동시에 디스플레이 되지 않아서 고생중입니다. 한마디로 장애물이 생성되면 더이상 캐릭터가 fnd에 디스플레이 되지 않습니다. 며칠 동안 고민하다가 여쭤봅니다. 어떻게 해야 캐릭터와 장애물을 fnd에 동시에 띄울수 있을까요?
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <stdlib.h>
#define SWITCH1 PINE4
#define SWITCH2 PINE5
unsigned fnd_sel[4] = {0x08,0x04,0x02,0x01};
unsigned dino_move[3] = {0b00000001,0b01000000,0b00001000};
volatile unsigned dino_state = 0b01000000;
unsigned obstacle_position[3] = {0b00000001,0b01000000,0b00001000};
volatile int game_state = 0;
unsigned obstacle_move[1] = {0x01};
ISR(INT4_vect) {
if (game_state == 0) {
game_state = 1;
}
else if (game_state == 1) {
game_state = 2;
}
}
ISR(INT5_vect) {
if (dino_state==dino_move[1]) {
dino_state = dino_move[2];
}
else if (dino_state==dino_move[2] ) {
dino_state = dino_move[0];
}
else if (dino_state==dino_move[0] ) {
dino_state = dino_move[1];
}
PORTC = dino_state;
_delay_ms(50);//인터럽트 반응속도
}
void setup_interrupts() {
DDRE &= ~(1 << SWITCH1); // SW1 입력으로 설정
DDRE &= ~(1 << SWITCH2);
PORTE |= (1 << SWITCH1); // Pull-up 사용
PORTE |= (1 << SWITCH2);
EICRB |= (1 << ISC40) | (1 << ISC41) | (1 << ISC50) | (1 << ISC51); // INT4를 하강 엣지에서 인터럽트 발생 설정
EIMSK |= (1 << INT4) |(1 << INT5); // INT4 인터럽트 활성화
sei(); // 전역 인터럽트 활성화
}
void setup_fnd() {
DDRC = 0xFF; // FND 데이터 핀을 출력으로 설정
DDRG = 0x0F; // FND 선택 핀을 출력으로 설정
}
int main() {
setup_interrupts();
setup_fnd();
srand(100);
int obstacle = rand()%3;
while (1) {
if(game_state == 0)
{
PORTC = 0x0f;
PORTG = 0x00;
}
else if (game_state == 1) {
PORTC = 0xff;
PORTG = 0xff;
_delay_ms(500);
PORTC = 0x0f;
PORTG = 0x00;
_delay_ms(500);
}
else if (game_state == 2)
{int i;
PORTG = 0x08; // 위치
PORTC = dino_state; // 숫자
_delay_ms(5000); //공룡 유지 시간, 공룡 fnd 안꺼지게 유지되는 시간
for(i=3;i>0;i--)
{
PORTG = fnd_sel[i];
PORTC = obstacle_position[obstacle];
_delay_ms(500);
}
}
}
댓글 1
조회수 455master님의 댓글
master 작성일
뭐가 장애물이고 뭐가 캐릭터인지 모르겠지만
메인문의 딜레이 등의 영향을 받지않고 구동하려면 타이머 인터럽트를 공부해서
타이머 인터럽트 안에서 구동하면 됩니다.