단순한 보드 게임
보드 게임을 만들어 봅시다.
아래 그림의 말판에서 각 칸에 도착하면 점수를 더하거나 뺍니다.
출발 위치의 칸에 도착했을 때는 점수가 없습니다.
이동하는 칸 수는 키보드의 스페이스 키를 누르면 결정됩니다.
우선 키보드의 스페이스 키를 누르면 숫자 하나를 선택하도록 해봅시다.
int number; // 후보 숫자 1 ~ 3
int selection = 0; // 선택된 숫자
void setup() {
size(200, 240);
fill(0);
textSize(25);
}
void draw() {
background(255);
number = frameCount % 3 + 1; // 1 ~ 3까지 계속 바뀐다.
text(number, 30, 50); // 후보 숫자 표시
text("selected: " + selection, 30, 90); // 선택된 숫자 표시
}
void keyPressed() {
if(key == ' ') { // 스페이스 키를 누르면
selection = number; // 숫자를 선택한다.
}
}
아래 그림과 같이 각 칸을 0부터 9까지의 번호로 표시하였을 때 현재 위치에서 선택된 칸 수만큼 이동해 봅시다.
import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;
Hamster hamster;
int number; // 후보 숫자 1 ~ 3
int selection = 0; // 선택된 숫자
int position = 0; // 현재 위치
void setup() {
size(200, 240);
fill(0);
textSize(25);
hamster = Hamster.create(this);
}
// 한 칸 이동한다.
void move() {
hamster.boardForward();
++ position;
if(position > 9) {
position = 0;
}
}
void draw() {
background(255);
number = frameCount % 3 + 1; // 1 ~ 3까지 계속 바뀐다.
text(number, 30, 50); // 후보 숫자 표시
text("selected: " + selection, 30, 90); // 선택된 숫자 표시
text("position: " + position, 30, 130); // 현재 위치 표시
}
void keyPressed() {
if(key == ' ') { // 스페이스 키를 누르면
selection = number; // 숫자를 선택한다.
// 선택된 숫자만큼 이동한다.
for(int i = 0; i < selection; ++i) {
move();
}
}
}
코드를 실행해 보면 조금 이상한 부분이 있습니다.
햄스터 로봇이 이동하고 있는 동안에는 화면이 갱신되지 않고 이동이 완료되면 화면이 갱신됩니다.
햄스터 로봇이 이동하고 있는 동안 move() 함수에 머물러 있기 때문에
draw() 함수가 호출되지 않습니다.
다른 방법으로 해보도록 합시다.
import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;
Hamster hamster;
int number; // 후보 숫자 1 ~ 3
int selection = 0; // 선택된 숫자
int position = 0; // 현재 위치
void setup() {
size(200, 240);
fill(0);
textSize(25);
hamster = Hamster.create(this);
}
// 한 칸 이동한다.
void move() {
hamster.boardForward();
++ position;
if(position > 9) {
position = 0;
}
}
void draw() {
background(255);
number = frameCount % 3 + 1; // 1 ~ 3까지 계속 바뀐다.
text(number, 30, 50); // 후보 숫자 표시
text("selected: " + selection, 30, 90); // 선택된 숫자 표시
text("position: " + position, 30, 130); // 현재 위치 표시
}
void run() {
while(true) {
if(keyPressed && key == ' ') { // 스페이스 키를 누르면
selection = number; // 숫자를 선택한다.
// 선택된 숫자만큼 이동한다.
for(int i = 0; i < selection; ++i) {
move();
}
}
delay(20); // 너무 빨리 반복하지 않도록 한다.
}
}
프로세싱에서 제공하는 setup() 및 draw() 함수와
햄스터 로봇을 제어하기 위한 run() 함수는 다른 쓰레드에서 실행됩니다.
즉, draw() 함수와 run() 함수는 서로 독립적으로 실행됩니다.
따라서 햄스터 로봇이 이동하고 있는 동안 move() 함수에 머물러 있다고 하더라도
draw() 함수가 일정한 주기로 반복하여 호출됩니다.
이제 점수를 계산하여 코드를 완성하도록 합시다.
import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;
Hamster hamster;
int number; // 후보 숫자 1 ~ 3
int selection = 0; // 선택된 숫자
int position = 0; // 현재 위치
int score = 0; // 현재 점수
int[] points = { 0, 1, -1, 2, -2, 3, -3, 2, -2, 1 }; // 위치에 따른 점수
void setup() {
size(200, 240);
fill(0);
textSize(25);
hamster = Hamster.create(this);
}
// 한 칸 이동한다.
void move() {
hamster.boardForward();
++ position;
if(position > 9) {
position = 0;
}
}
void draw() {
background(255);
number = frameCount % 3 + 1; // 1 ~ 3까지 계속 바뀐다.
text(number, 30, 50); // 후보 숫자 표시
text("selected: " + selection, 30, 90); // 선택된 숫자 표시
text("position: " + position, 30, 130); // 현재 위치 표시
text("score: " + score, 30, 170); // 현재 점수 표시
}
void run() {
while(true) {
if(keyPressed && key == ' ') { // 스페이스 키를 누르면
selection = number; // 숫자를 선택한다.
// 선택된 숫자만큼 이동한다.
for(int i = 0; i < selection; ++i) {
move();
}
// 점수를 계산한다.
score += points[position]; // 이동한 위치의 점수를 더한다.
}
delay(20); // 너무 빨리 반복하지 않도록 한다.
}
}
모퉁이가 있는 보드 게임
이번에는 아래 그림과 같이 모퉁이에도 칸이 있습니다.
모퉁이는 회전해서 이동해야 합니다.
출발 위치의 칸에 도착했을 때는 1부터 3까지의 무작위 점수가 더해지도록 합시다.
우선 아래 그림과 같이 각 칸을 0부터 13까지의 번호로 표시하고 현재 위치에서 선택된 칸 수만큼 이동하도록 해봅시다.
move() 함수를 수정하여 모퉁이에서는 회전하도록 해야 합니다.
import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;
Hamster hamster;
int number; // 후보 숫자 1 ~ 3
int selection = 0; // 선택된 숫자
int position = 0; // 현재 위치
boolean started = false; // 출발한 이후인가?
void setup() {
size(200, 240);
fill(0);
textSize(25);
hamster = Hamster.create(this);
}
// 한 칸 이동한다.
// 위치가 모퉁이인 경우 왼쪽으로 회전한 후 앞으로 한 칸 이동
// 아니면 그냥 앞으로 한 칸 이동
void move() {
if(started) { // 처음 출발할 때는 왼쪽으로 회전하지 않게 한다.
switch(position) {
case 0:
case 4:
case 7:
case 11:
hamster.boardLeft();
break;
}
} else {
started = true; // 출발하였다.
}
hamster.boardForward();
++ position;
if(position > 13) {
position = 0;
}
}
void draw() {
background(255);
number = frameCount % 3 + 1; // 1 ~ 3까지 계속 바뀐다.
text(number, 30, 50); // 후보 숫자 표시
text("selected: " + selection, 30, 90); // 선택된 숫자 표시
text("position: " + position, 30, 130); // 현재 위치 표시
}
void run() {
while(true) {
if(keyPressed && key == ' ') { // 스페이스 키를 누르면
selection = number; // 숫자를 선택한다.
// 선택된 숫자만큼 이동한다.
for(int i = 0; i < selection; ++i) {
move();
}
}
delay(20); // 너무 빨리 반복하지 않도록 한다.
}
}
이제 점수를 계산하여 코드를 완성하도록 합시다.
출발 위치의 칸에 도착했을 때는 무작위의 점수가 더해져야 합니다.
import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;
Hamster hamster;
int number; // 후보 숫자 1 ~ 3
int selection = 0; // 선택된 숫자
int position = 0; // 현재 위치
boolean started = false; // 출발한 이후인가?
int score = 0; // 현재 점수
int[] points = { 0, 1, -1, 2, -2, 3, -3, 2, -2, 1, -1, 2, -2, 3 }; // 위치에 따른 점수
void setup() {
size(200, 240);
fill(0);
textSize(25);
hamster = Hamster.create(this);
}
// 한 칸 이동한다.
// 위치가 모퉁이인 경우 왼쪽으로 회전한 후 앞으로 한 칸 이동
// 아니면 그냥 앞으로 한 칸 이동
void move() {
if(started) { // 처음 출발할 때는 왼쪽으로 회전하지 않게 한다.
switch(position) {
case 0:
case 4:
case 7:
case 11:
hamster.boardLeft();
break;
}
} else {
started = true; // 출발하였다.
}
hamster.boardForward();
++ position;
if(position > 13) {
position = 0;
}
}
void draw() {
background(255);
number = frameCount % 3 + 1; // 1 ~ 3까지 계속 바뀐다.
text(number, 30, 50); // 후보 숫자 표시
text("selected: " + selection, 30, 90); // 선택된 숫자 표시
text("position: " + position, 30, 130); // 현재 위치 표시
text("score: " + score, 30, 170); // 현재 점수 표시
}
void run() {
while(true) {
if(keyPressed && key == ' ') { // 스페이스 키를 누르면
selection = number; // 숫자를 선택한다.
// 선택된 숫자만큼 이동한다.
for(int i = 0; i < selection; ++i) {
move();
}
// 점수를 계산한다.
if(position == 0) { // 출발 위치에 있으면
score += int(random(3)) + 1; // 1 ~ 3까지의 무작위 점수를 더한다.
} else {
score += points[position]; // 이동한 위치의 점수를 더한다.
}
}
delay(20); // 너무 빨리 반복하지 않도록 한다.
}
}
2인용 대전 게임
두 사람이 키보드의 스페이스 키를 번갈아 눌러서 누가 많은 점수를 얻는지 대전 게임을 만들어 봅시다.
점수를 따로 계산하면 됩니다.
import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;
Hamster hamster;
int number; // 후보 숫자 1 ~ 3
int selection = 0; // 선택된 숫자
int position = 0; // 현재 위치
boolean started = false; // 출발한 이후인가?
int user = 0; // 현재 누구의 차례인가? 0 또는 1
int[] scores = { 0, 0 }; // 두 사람의 현재 점수
int[] points = { 0, 1, -1, 2, -2, 3, -3, 2, -2, 1, -1, 2, -2, 3 }; // 위치에 따른 점수
void setup() {
size(200, 240);
fill(0);
textSize(25);
hamster = Hamster.create(this);
}
// 한 칸 이동한다.
// 위치가 모퉁이인 경우 왼쪽으로 회전한 후 앞으로 한 칸 이동
// 아니면 그냥 앞으로 한 칸 이동
void move() {
if(started) { // 처음 출발할 때는 왼쪽으로 회전하지 않게 한다.
switch(position) {
case 0:
case 4:
case 7:
case 11:
hamster.boardLeft();
break;
}
} else {
started = true; // 출발하였다.
}
hamster.boardForward();
++ position;
if(position > 13) {
position = 0;
}
}
void draw() {
background(255);
number = frameCount % 3 + 1; // 1 ~ 3까지 계속 바뀐다.
text(number + " for user " + (user + 1), 30, 50); // 후보 숫자와 누구 차례인지 표시
text("selected: " + selection, 30, 90); // 선택된 숫자 표시
text("position: " + position, 30, 130); // 현재 위치 표시
text("score 1: " + scores[0], 30, 170); // 첫 번째 사람의 현재 점수 표시
text("score 2: " + scores[1], 30, 210); // 두 번째 사람의 현재 점수 표시
}
void run() {
while(true) {
if(keyPressed && key == ' ') { // 스페이스 키를 누르면
selection = number; // 숫자를 선택한다.
// 선택된 숫자만큼 이동한다.
for(int i = 0; i < selection; ++i) {
move();
}
// 점수를 계산한다.
if(position == 0) { // 출발 위치에 있으면
scores[user] += int(random(3)) + 1; // 1 ~ 3까지의 무작위 점수를 더한다.
} else {
scores[user] += points[position]; // 이동한 위치의 점수를 더한다.
}
user = 1 - user; // 사람을 바꾼다. 0을 1로, 1을 0으로.
}
delay(20); // 너무 빨리 반복하지 않도록 한다.
}
}
갈림길 보드 게임
아래 그림과 같이 갈림길에 도착하면 다른 길로 이동할 수 있도록 해봅시다.
키보드의 키를 눌러 선택하게 할 수도 있지만 여기서는 무작위 수에 따라 선택되도록 합시다.
갈림길로 이동하는 것을 구분하기 위한 변수를 추가해도 되지만, 갈림길이 많아지면 경우의 수가 많아져서 복잡해집니다.
아래 그림과 같이 갈림길에 대한 번호를 추가하여 현재 위치 값으로 판단하는 것이 더 간단합니다.
import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;
Hamster hamster;
int number; // 후보 숫자 1 ~ 3
int selection = 0; // 선택된 숫자
int position = 0; // 현재 위치
boolean started = false; // 출발한 이후인가?
int user = 0; // 현재 누구의 차례인가? 0 또는 1
int[] scores = { 0, 0 }; // 두 사람의 현재 점수
int[] points = { 0, 1, -1, 2, -2, 3, -3, 2, -2, 1, -1, 2, -2, 3, 0, -1, 2, -2, 1, 1, -2, 2, -1 }; // 위치에 따른 점수
void setup() {
size(200, 240);
fill(0);
textSize(25);
hamster = Hamster.create(this);
}
// 한 칸 이동한다.
// 위치가 모퉁이인 경우 왼쪽으로 회전한 후 앞으로 한 칸 이동
// 아니면 그냥 앞으로 한 칸 이동
void move() {
if(started) { // 처음 출발할 때는 왼쪽으로 회전하지 않게 한다.
switch(position) {
case 0:
case 4:
case 7:
case 11:
case 15: // 15와 19는 갈림길로 진입하는 경우이므로 왼쪽으로 회전
case 19:
hamster.boardLeft();
break;
case 18: // 18은 다시 원래 길로 가야하므로 왼쪽으로 회전하고 위치를 9로 바꾼다.
hamster.boardLeft();
position = 9;
break;
case 22: // 22는 다시 원래 길로 가야하므로 왼쪽으로 회전하고 위치를 2로 바꾼다.
hamster.boardLeft();
position = 2;
break;
}
} else {
started = true; // 출발하였다.
}
hamster.boardForward();
++ position;
// 위치가 14일 때만 0으로 바꾼다.
if(position == 14) {
position = 0;
}
}
void draw() {
background(255);
number = frameCount % 3 + 1; // 1 ~ 3까지 계속 바뀐다.
text(number + " for user " + (user + 1), 30, 50); // 후보 숫자와 누구 차례인지 표시
text("selected: " + selection, 30, 90); // 선택된 숫자 표시
text("position: " + position, 30, 130); // 현재 위치 표시
text("score 1: " + scores[0], 30, 170); // 첫 번째 사람의 현재 점수 표시
text("score 2: " + scores[1], 30, 210); // 두 번째 사람의 현재 점수 표시
}
void run() {
while(true) {
if(keyPressed && key == ' ') { // 스페이스 키를 누르면
selection = number; // 숫자를 선택한다.
// 선택된 숫자만큼 이동한다.
for(int i = 0; i < selection; ++i) {
move();
}
// 2이나 9에 도착했으면 무작위 수에 따라 갈림길로 바꾼다.
if(position == 2 || position == 9) {
if(int(random(2)) == 0) {
if(position == 2) {
position = 15;
} else {
position = 19;
}
}
}
// 점수를 계산한다.
if(position == 0) { // 출발 위치에 있으면
scores[user] += int(random(3)) + 1; // 1 ~ 3까지의 무작위 점수를 더한다.
} else {
scores[user] += points[position]; // 이동한 위치의 점수를 더한다.
}
user = 1 - user; // 사람을 바꾼다. 0을 1로, 1을 0으로.
}
delay(20); // 너무 빨리 반복하지 않도록 한다.
}
}
목차
수업 자료 내려 받기
- 원본 그림 2017.01.16 버전 (34.7 MB)
햄스터 고급
- 행위 기반의 로봇 제어
- 경로 탐색
- 자리 바꾸기
Copyright 로봇SW교육원 All rights reserved.
어려운 일이 있으면 광운대학교 로봇학부 박광현 교수(
akaii@kw.ac.kr)에게 연락하세요.