소개
Android Emulator 를 이용, 스터디장 현우님이 주신 예제를 통해 에뮤레이터에 익숙해진 후
gemini 를 이용해 간단한 "텍스트 변환봇" 과 "숫자 게임봇"을 만들었어요.
진행 방법
예제를 통해 Emulater 익숙해지기
실습을 위해 스터디장님이 공유해주신 실습코드를 그대로 사용했어요. 이 중에서 외부 API 연동없이 자바스크립트로만 구현이 가능한 01_에코봇, 02_시간인사봇, 03_계산기봇을 테스트했습니다.
에뮤레이터가 복사붙여넣기, 한글입력, 영어입력, 엔터 등의 입력방식등이 달랐어요. 스터디장님 말씀대로 한 3번 정도 테스트겸 해보니 쓰던것만 써서 금새 익숙해 질 수 있었어요.
텍스트 변환봇과 숫자 게임봇 만들어보기
외부 API 연동이나 데이터 저장없이 자바스크립트만의 기능으로 구현할 수 있는 봇 아이디어 중에
두가지를 Gemini 에게 코드를 부탁해서 만들었어요.
텍스트봇 코드
// 04_text_transformer_bot.js
var bot = BotManager.getCurrentBot();
bot.on("message", function(msg) {
var content = msg.content.trim(); // 메시지 앞뒤 공백 제거
// "대문자" 명령 처리
if (content.startsWith("대문자 ")) {
var textToTransform = content.substring(4).trim(); // "대문자 " 이후 텍스트 추출 및 앞뒤 공백 제거
if (textToTransform.length > 0) {
var transformedText = textToTransform.toUpperCase();
msg.reply("대문자 변환 결과: " + transformedText);
} else {
msg.reply("변환할 텍스트를 '대문자 [텍스트]' 형식으로 입력해주세요.");
}
}
// "소문자" 명령 처리
else if (content.startsWith("소문자 ")) {
var textToTransform = content.substring(4).trim();
if (textToTransform.length > 0) {
var transformedText = textToTransform.toLowerCase();
msg.reply("소문자 변환 결과: " + transformedText);
} else {
msg.reply("변환할 텍스트를 '소문자 [텍스트]' 형식으로 입력해주세요.");
}
}
// "뒤집기" 명령 처리
else if (content.startsWith("뒤집기 ")) {
var textToTransform = content.substring(4).trim();
if (textToTransform.length > 0) {
// 문자열을 배열로 분리 -> 배열을 뒤집기 -> 다시 문자열로 합치기
var transformedText = textToTransform.split('').reverse().join('');
msg.reply("텍스트 뒤집기 결과: " + transformedText);
} else {
msg.reply("변환할 텍스트를 '뒤집기 [텍스트]' 형식으로 입력해주세요.");
}
}
// "공백제거" 명령 처리
else if (content.startsWith("공백제거 ")) {
var textToTransform = content.substring(5).trim(); // "공백제거 " 이후 텍스트 추출
if (textToTransform.length > 0) {
// 모든 공백 문자(스페이스, 탭, 줄바꿈 등)를 제거
var transformedText = textToTransform.replace(/\s/g, '');
msg.reply("공백 제거 결과: " + transformedText);
} else {
msg.reply("변환할 텍스트를 '공백제거 [텍스트]' 형식으로 입력해주세요.");
}
}
// 아무 명령어도 해당하지 않을 경우
else if (content.length > 0) { // 비어있지 않은 메시지에만 응답 (선택 사항)
// msg.reply("텍스트 변환 봇입니다. '대문자', '소문자', '뒤집기', '공백제거' 중 하나의 명령어를 사용해주세요.");
// 불필요한 응답을 줄이기 위해 주석 처리하거나, 필요에 따라 추가하세요.
}
});숫자 게임 봇 코드
// 05_number_guessing_game_with_chances_bot.js
var bot = BotManager.getCurrentBot();
// 봇의 게임 상태를 저장할 객체를 bot 객체에 추가합니다.
// 이 방식은 봇 프로세스가 재시작되지 않는 한 상태를 유지합니다.
// 만약 봇이 메시지마다 완전히 새로 초기화된다면 이 방식은 작동하지 않을 수 있습니다.
// (일반적인 메신저 봇 플랫폼에서는 이 방식이 잘 작동하는 경우가 많습니다.)
if (!bot.gameState) {
bot.gameState = {
secretNumber: 0,
remainingChances: 0,
gameInProgress: false
};
}
bot.on("message", function(msg) {
var content = msg.content.trim();
var state = bot.gameState; // 현재 게임 상태를 편리하게 참조
// 1. 게임 시작 명령어 처리
if (content === "숫자게임 시작") {
// 게임 초기화
state.secretNumber = Math.floor(Math.random() * 100) + 1; // 1부터 100 사이의 무작위 숫자
state.remainingChances = 5; // 기회 5번
state.gameInProgress = true; // 게임 시작 상태로 변경
msg.reply("제가 1부터 100 사이의 숫자를 생각했습니다. 기회는 " + state.remainingChances + "번입니다. 맞춰보세요!");
// 테스트용으로 정답을 알려주는 줄은 실제 게임에서는 주석 처리하거나 삭제해야 합니다.
// msg.reply("테스트용: 정답은 " + state.secretNumber + "입니다.");
return; // 다른 로직 실행 방지
}
// 2. 게임이 진행 중일 때만 숫자 추측 처리
if (state.gameInProgress) {
var userGuess = parseInt(content); // 사용자의 메시지를 숫자로 변환
// 사용자가 유효한 숫자를 입력했는지 확인
if (!isNaN(userGuess) && userGuess >= 1 && userGuess <= 100) {
state.remainingChances--; // 기회 1회 감소
if (userGuess < state.secretNumber) {
msg.reply("더 높게! (남은 기회: " + state.remainingChances + "번)");
} else if (userGuess > state.secretNumber) {
msg.reply("더 낮게! (남은 기회: " + state.remainingChances + "번)");
} else { // 정답을 맞췄을 경우
msg.reply("정답입니다! 제가 생각한 숫자는 " + state.secretNumber + "였습니다. 축하합니다!");
state.gameInProgress = false; // 게임 종료
state.secretNumber = 0; // 정답 초기화
}
// 기회가 모두 소진되었는데 정답을 못 맞췄을 경우
if (state.remainingChances <= 0 && state.gameInProgress) { // 아직 게임 진행 중이라면 (정답을 못 맞췄다면)
msg.reply("아쉽지만 기회를 모두 소진했습니다! 정답은 " + state.secretNumber + "였습니다. 다시 시작하려면 '숫자게임 시작'이라고 입력해주세요.");
state.gameInProgress = false; // 게임 종료
state.secretNumber = 0; // 정답 초기화
}
} else {
// 게임 중인데 숫자가 아닌 다른 메시지를 보냈을 경우
msg.reply("게임이 진행 중입니다. 1부터 100 사이의 유효한 숫자를 입력해주세요. (남은 기회: " + state.remainingChances + "번)");
}
}
// 3. 게임이 진행 중이 아닐 때 숫자가 아닌 다른 메시지 처리
else if (content.length > 0) { // 비어있지 않은 메시지에만 반응
// 게임 시작 명령어가 아니거나, 게임이 진행 중이 아닐 때의 일반적인 안내
// msg.reply("숫자 맞히기 게임을 시작하려면 '숫자게임 시작'이라고 입력해주세요.");
}
});