묵찌빠 게임
- 사람과 컴퓨터의 이름을 입력받고 시작한다.
- 게임에서 주도권을 가진 선수를 오너(owner)라고 하며, 사람이 먼저 오너가 된다.
- 사람은 사용자로부터 묵,찌,빠 중 하나를 입력받는다. 잘못된 입력이 들어오면 다시 입력받는다. 컴퓨터는 묵,찌,빠 중에서 랜덤하게 한 개를 선택하고 "결정하였습니다."를 출력한다.
- 사람이 오너인 경우 컴퓨터가 낸 것과 비교하여 같으면 사람이 승자가 되고 프로그램은 종료한다. 컴퓨터가 오너인 경우도 마찬가지이다. 승자가 결정되면 프로그램은 종료한다.
- 사람과 컴퓨터가 낸 것이 달라 승자가 없는 경우, 가위 바위 보 규칙에 따라 이긴 사람이 오너가 된다.
- 사람과 컴퓨터의 공통 행동을 Player 추상 클래스로 만들고 사람은 Human, 컴퓨터는 Computer 클래스를 만들고 이들은 Player를 상속받는 구조로 작성하라.
시행착오 1
import java.util.Scanner;
class Human extends Player {
public Human(String name) {
super(name);
this.name=name;
}
@Override
public String next() {
// TODO Auto-generated method stub
return null;
}
}
class Computer extends Player {
public Computer(String name) {
super(name);
this.name=name;
}
@Override
public String next() {
// TODO Auto-generated method stub
return null;
}
}
abstract class Player {
protected String bet[]= {"묵","찌","빠"};
protected String name;
protected String lastBet=null;
protected Player(String name) {
this.name=name;
}
public String getName() {
return name;
}
public String getBet() {
return lastBet;
}
abstract public String next();
}
class Game {
Player players[]=new Player[2];
public boolean winnerCheck(String humanBet, String computerBet,String owner) {
if(humanBet.equals(computerBet)) {
System.out.println(owner+"가 이겼습니다.");
System.out.println("게임을 종료합니다.");
return false;
}
else {
if((humanBet.equals("묵")&&computerBet.equals("빠"))||(humanBet.equals("찌")&&computerBet.equals("묵"))||(humanBet.equals("빠")&&computerBet.equals("찌"))) {
owner=players[1].name;
System.out.println("오너가 "+owner+"로 변경되었습니다.");
}
else {
owner=players[0].name;
System.out.println();
}
return true;
}
}
public void run() {
Scanner scanner=new Scanner(System.in);
System.out.println("***** 묵찌빠 게임을 시작합니다. *****");
System.out.print("선수이름 입력 >>");
players[0]=new Human(scanner.next());
System.out.print("컴퓨터이름 입력 >>");
players[1]=new Computer(scanner.next());
String owner=players[0].name;
System.out.println("2명의 선수를 생성 완료하였습니다.");
System.out.println();
String humanBet;
String computerBet;
do {
System.out.print(players[0].name+">>");
humanBet=scanner.next();
System.out.println("AI>> 결정하였습니다.");
int randomIndex=(int)(Math.random()*2+0);
computerBet=players[1].bet[randomIndex];
System.out.println(players[0].name+" : "+humanBet+", "+players[1].name+" : "+computerBet);
}while(winnerCheck(humanBet,computerBet,owner));
}
}
public class MGPapp {
public static void main(String[] args) {
new Game().run();
}
}
조건에 주어진 추상 클래스인 Player을 일단 똑같이 작성하고 시작했는데, lastbet와 getName(),getBet(), next()메소드를 어떻게 활용할지 모르겠어서 직접 생각하면서 필요한 필드와 메서드를 작성하여 프로그램 실행에는 일단 성공하였다. 승자가 결정나기 전까지 계속 반복할수있도록 하는데는 성공했지만, 여러번 시행해본결과 아직 다음과 같은 문제점이 있다.
- 오너가 제대로 변경되지않는다.
- 오너에 따라 bet을 결정하는 순서가 바뀌지않음
- 묵,찌,빠 외의 다른것을 입력한경우 예외처리를 하는 기능을 포함하지 않음
- public 추상클래스와 문제 그대로의 사용을 안함(이건 추후 문제)
일단 1.오너가 제대로 변경되지 않는 문제는 아마 winnerCheck()메소드가 call-by-value를 하기 때문인거같아서 call-by-reference를 이용하여 수정할수있도록 메소드 자체를 수정해야할듯하다.
2.오너에 따른 순서 문제는 구조적으로 반복문을 수정해야하므로 일단 구동만 된다면 1.문제를 해결하고난후에 살펴봐야할듯 하다.
3. 예외처리 문장은 기능을 포함하여 입력받을시에 조건문을 추가하면 될듯하다.
일단 3가지를 우선적으로 수정해본 결과는 다음과 같다.
시행착오 2
정답
import java.util.Scanner;
class Human extends Player {
private Scanner scanner = new Scanner(System.in);
public Human(String name) {
super(name);
}
@Override
public String next() {
System.out.print(name + ">> ");
lastBet = scanner.next();
return lastBet;
}
}
class Computer extends Player {
public Computer(String name) {
super(name);
}
@Override
public String next() {
int randomIndex = (int) (Math.random() * 3);
lastBet = bet[randomIndex];
System.out.println("AI>> " + lastBet);
return lastBet;
}
}
abstract class Player {
protected String bet[] = {"묵", "찌", "빠"};
protected String name;
protected String lastBet = null;
protected Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String getBet() {
return lastBet;
}
abstract public String next();
}
class Game {
Player players[] = new Player[2];
private String owner;
public boolean winnerCheck(String humanBet, String computerBet) {
if (humanBet.equals(computerBet)) {
System.out.println(owner + "가 이겼습니다.");
System.out.println("게임을 종료합니다.");
return false;
} else {
if ((humanBet.equals("묵") && computerBet.equals("빠")) ||
(humanBet.equals("찌") && computerBet.equals("묵")) ||
(humanBet.equals("빠") && computerBet.equals("찌"))) {
owner = players[1].name;
System.out.println("오너가 " + owner + "로 변경되었습니다.");
} else {
owner = players[0].name;
System.out.println("오너가 " + owner + "로 변경되었습니다.");
}
return true;
}
}
public void run() {
Scanner scanner = new Scanner(System.in);
System.out.println("***** 묵찌빠 게임을 시작합니다. *****");
System.out.print("선수이름 입력 >> ");
players[0] = new Human(scanner.next());
System.out.print("컴퓨터이름 입력 >> ");
players[1] = new Computer(scanner.next());
owner = players[0].name;
System.out.println("2명의 선수를 생성 완료하였습니다.");
System.out.println();
String humanBet;
String computerBet;
do {
humanBet = players[0].next();
computerBet = players[1].next();
System.out.println(players[0].name + " : " + humanBet + ", " + players[1].name + " : " + computerBet);
} while (winnerCheck(humanBet, computerBet));
}
}
public class MGPapp {
public static void main(String[] args) {
new Game().run();
}
}
'JAVA' 카테고리의 다른 글
컬렉션 (1) | 2024.09.24 |
---|---|
Chapter 05 실습 문제 (0) | 2024.08.19 |
Chapter 04 실습 문제 (0) | 2024.08.16 |
클래스와 객체 활용 예제 (0) | 2024.08.16 |
@Override (0) | 2024.08.15 |