아두이노 야구게임 프로젝트
페이지 정보
작성자 브랜든 작성일16-12-30 14:44 조회4,987회 댓글0건관련링크
본문
여러분들은 학교에서 게임을 하거나 했을 때,
어떤 게임을 주로 했나요?
컴퓨터 게임이 생각날 수도 있을 텐데요.
이번에는 질문을 조금 바꿔서,
컴퓨터를 사용하지 않는 게임중에는
어떤게 있나요?
눈치게임? 마피아? 보드게임? 초성게임?
종이와 펜만으로 하는 게임으로는
빙고(BINGO)? 오목?
여러가지가 머리속에서 생각이 날 꺼예요!
혹시 야구게임을 알고 있나요?
처음 듣는 분들도 계실 것 같은데요!
야구게임은 간단하게 말하자면 숫자 맞추기 게임입니다.
규칙은 어렵지 않습니다. (다만, 머리를 쓸뿐...)
처음 두 사람이 순서대로 숫자 4개를 적고 상대방이 보이지 않게 가립니다.
숫자 4개를 쓸 때는
1. 같은 숫자를 연속 또는 여러 번 쓸 수 없습니다.
2. 숫자는 0~9까지만 가능합니다.(일의자리 숫자만)
3. 처음자리가 0도 가능합니다.(이 부분은 지역마다 다를 수 있습니다.)
그 다음에 서로 번갈아가며 숫자 4글자를 추측해 맞춥니다.
이 때, 같은 자리에 같은 숫자가 있으면 스트라이크(Strike)
다른 자리에 같은 숫자가 있으면 볼(Ball)이 됩니다.
상대방은 그것을 거짓없이 알려줘야 합니다.
거짓말 하다가 들키면... 손목이...
모두 맞출 경우에는 4 스트라이크 또는 홈런(HOMERUN)이 됩니다.
부품 알아보기
LCD(16x2) 1개 / 푸쉬버튼 스위치 3개 / 220옴 저항 3개 / 10k 가변저항 / 다수개의 점퍼선 / 브레드보드
TIP! 안드로이드는 블루투스 HC-06을 이용해 정답을 미리 볼 수 있습니다.
제작과정
우선은 LCD와 가변저항, 점퍼선으로 배선을 해줍니다.
사진으로 찍어서 올리기에는 복잡해 보여서
을 참고해서 배선해주세요.
다음에는 풀다운저항을 통해 스위치 3개를 연결해 주시고,
맨 왼쪽 스위치는 디지털 10번핀,
중간 스위치는 디지털 9번핀,
오른쪽 스위치는 디지털 8번핀에 연결해주세요.
하드웨어는 끝났습니다.
이번에는 프로그래밍 코드를 알아볼까요?
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
LiquidCrystal lcd(12,11,5,4,3,2);
SoftwareSerial BTSerial(6,7);
long a,b,c,d;
int sw1 = 10; //sw1는 count
int sw2 = 9; //sw2는 next(옆으로 이동)
int sw3 = 8; //sw3는 비교
int count_A = -1;
int count_B = -1;
int count_C = -1;
int count_D = -1;
int next_out = 0;
int ball_c = 0;
int strike_c = 0;
int errorlist = 2;
int time = 3000;
int chance = 0;
void setup()
{
BTSerial.begin(115200); //블루투스 통신
Serial.begin(9600); //Serial 통신
lcd.begin(16,2);
randomSeed(analogRead(0)); //random함수 반드시 필요!
check(); //random으로 초기값 설정
pinMode(sw1,INPUT);
pinMode(sw2,INPUT);
pinMode(sw3,INPUT);
}
///////////////////////////////
void loop()
{
char speak;
if( BTSerial.available() )
{
speak = BTSerial.read();
if( speak == 'a' )
{
BTSerial.print(a);
BTSerial.print(b);
BTSerial.print(c);
BTSerial.println(d);
}
if( speak == 'c' )
{
BTSerial.print("Try = ");
BTSerial.println(chance);
}
} //블루투스 통신
int count = digitalRead(sw1);
int next = digitalRead(sw2);
int result = digitalRead(sw3);
if(count == HIGH)
{
if(next_out == 0)
{
count_A = count_A + 1;
lcd.print(count_A);
}
else if(next_out == 1)
{
count_B = count_B + 1;
lcd.print(count_B);
}
else if(next_out == 2)
{
count_C = count_C + 1;
lcd.print(count_C);
}
else
{
count_D = count_D + 1;
lcd.print(count_D);
}
}
//각 자리마다 따로 저장
if(next == HIGH)
next_out = next_out + 1;
checkB(); //a,b,c,d가 모두 달라야됨
checkC(); //sw2누를때마다 커서 설정
if(next_out == 3 && result == HIGH)
check_error();
if(errorlist == 0)
{
checkD(); //입력값과 정해준 값 비교(stike_c)
checkE(); //입력값과 정해준 값 비교(ball_c)
lcd.setCursor(0,1);
lcd.print(strike_c);
lcd.setCursor(1,1);
lcd.print("S");
lcd.setCursor (3,1);
lcd.print(ball_c);
lcd.setCursor(4,1);
lcd.print("B");
if(strike_c == 4)
{
lcd.setCursor(9,1);
lcd.print("HOMERUN"); //homerun 출력
}
else
{
lcd.setCursor(9,1);
lcd.print(" "); //homerun 초기화(=없음)
}
next_out = 0; //cursor 초기화
strike_c = 0; //strike 초기화
ball_c = 0; //ball 초기화
errorlist = 2; //errorlist 초기화
delay(time);
time = time + 500; //연속으로 도전 못하게 방지
chance = chance + 1;//도전횟수
}
else if(errorlist == 1)
{
lcd.setCursor(9,1);
lcd.print(" error");
delay(3000);
lcd.setCursor(11,1);
lcd.print(" ");
errorlist = 2; //errorlist 초기화(=없음)
}
lcd.cursor(); //커서위치확인
delay(300);
//Serial 확인창//
Serial.print("password:");
Serial.print(a);
Serial.print(b);
Serial.print(c);
Serial.print(d);
Serial.print(" time:");
Serial.println(time);
}
///////////////////////////////
void check()
{
do
{
a = random(0,10);
b = random(0,10);
c = random(0,10);
d = random(0,10);
}
while( a==b || a==c || a==d || b==c || b==d || c==d );
//do-while문은 최초 1회는 실행,거짓조건 출력
}//random으로 초기값 설정
///////////////////////////////
void checkB()
{
if(count_A == 9)
count_A = -1;
if(count_B == 9)
count_B = -1;
if(count_C == 9)
count_C = -1;
if(count_D == 9)
count_D = -1;
if(next_out == 4)
next_out = 0;
}//a,b,c,d가 모두 달라야됨
///////////////////////////////
void checkC()
{
if(next_out == 0)
lcd.setCursor(0,0);
else if(next_out == 1)
lcd.setCursor(4,0);
else if(next_out == 2)
lcd.setCursor(8,0);
else
lcd.setCursor(12,0);
}//sw2누를때마다 커서 설정
///////////////////////////////
void checkD()
{
if(a == count_A || a == 9 && count_A == -1)
strike_c = strike_c + 1;
if(b == count_B || b == 9 && count_B == -1)
strike_c = strike_c + 1;
if(c == count_C || c == 9 && count_C == -1)
strike_c = strike_c + 1;
if(d == count_D || d == 9 && count_D == -1)
strike_c = strike_c + 1;
}//입력값과 정해준 값 비교(stike_c)
///////////////////////////////
void checkE()
{
if(a == count_B || a == count_C || a == count_D)
ball_c = ball_c + 1;
if(b == count_A || b == count_C || b == count_D)
ball_c = ball_c + 1;
if(c == count_A || c == count_B || c == count_D)
ball_c = ball_c + 1;
if(d == count_A || d == count_B || d == count_C)
ball_c = ball_c + 1;
}//입력값과 정해준 값 비교(ball_c)
///////////////////////////////
void check_error()
{
if(count_A == count_B || count_A == count_C || count_A == count_D || count_B == count_C || count_B == count_D || count_C == count_D )
errorlist = 1;
else
errorlist = 0;
}
단순한 게임인 것 같지만
소스코드가 상당히 깁~~~~~~~~~~니다.
답을 비교를 할 때마다, 확인 후 기다려야 하는 시간이 증폭됩니다!
많이 확인해 볼수록 불편함을 겪게 됩니다.
블루투스(HC-06)을 통해 답을 미리 확인이 가능하고,
몇 번을 도전했는지(error포함) 알 수 있습니다.
USB를 끼우지 않고 들고 다니면서 답을 볼 수 있다는 장점이 있습니다.
물론, USB를 끼워서 시리얼 모니터로 답과 함께 증폭된 시간을 알 수 있습니다.
(주의. 시리얼 모니터 창을 켤(ON)경우 숫자가 다시 재배정 됩니다.)
동작 영상보기
<
휴대전화는 영상을 촬영하기 때문에 답을 보지 않고 직접 풀어보았습니다.
읽어주셔서 감사합니다.
댓글목록
등록된 댓글이 없습니다.
최신댓글