본문 바로가기

JAVA/UI

가위바위보 게임 프로그램

**가위 바위 보를 0,1,2 숫자로 나타내어 

컴퓨터와 게임했을 때 이기고 지고 비길때의 규칙을 찾아내는 것이 관건

 

**게임 패키지 따로 생성 후 작성

 

 

Main

package main;

import view.MainView;

public class mainClass {
	public static void main(String[] args) {
		
		new MainView();
	}
}

view

JFrame으로 상속, 액션 리스너 상속 (그냥 label은 한글깨짐 발생, swing계열은 한글깨짐 없음(JLabel))

 

label이 많이 필요하므로 배열로 생성
JLabel label[];
button[]도 배열. list로 잡아도 되나 추가삭제할 필요업으므로 일반 배열

 

frontlabel셋팅-> 게임제목 설정(?승?패?무)

 

label 배열길이 5,
{사용자이름, 컴퓨터이름, 사용자 결과, 승패 출력, 컴퓨터 결과}

 

button  배열길이 3
{가위, 바위, 보}
for문은로 각 버튼을 변수에 입력받아 위치셋팅

package view;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

import game.gbbGame;

public class MainView extends JFrame implements ActionListener {

	JLabel frontLabel;
	JLabel label[];
	JButton button[];
	
	gbbGame game = new gbbGame();
	
	public MainView() {
		super("가위 바위 보");
		
		setLayout(null);
				
		frontLabel = new JLabel("? 승 ? 패 ? 무");
		frontLabel.setBounds(70, 50, 500, 30);
		frontLabel.setBackground(Color.yellow);
		frontLabel.setHorizontalAlignment(JLabel.CENTER);
		frontLabel.setOpaque(true);
		add(frontLabel);
		
		label = new JLabel[5];
		
		label[0] = new JLabel("Player");
		label[0].setBounds(70, 100, 150, 30);
		label[0].setBackground(Color.darkGray);
		label[0].setOpaque(true);
		label[0].setHorizontalAlignment(JLabel.CENTER);
		label[0].setForeground(Color.white);
		add(label[0]);	
		
		label[1] = new JLabel("Com");
		label[1].setBounds(420, 100, 150, 30);
		label[1].setBackground(Color.darkGray);
		label[1].setOpaque(true);
		label[1].setHorizontalAlignment(JLabel.CENTER);
		label[1].setForeground(Color.white);
		add(label[1]);
		
		label[2] = new JLabel("?");
		label[2].setBounds(70, 150, 150, 60);
		label[2].setBackground(Color.blue);
		label[2].setOpaque(true);
		label[2].setHorizontalAlignment(JLabel.CENTER);
		label[2].setForeground(Color.white);
		add(label[2]);
		
		label[3] = new JLabel("?");
		label[3].setBounds(240, 150, 150, 60);
		label[3].setBackground(Color.green);
		label[3].setOpaque(true);
		label[3].setHorizontalAlignment(JLabel.CENTER);
		label[3].setForeground(Color.white);
		add(label[3]);
		
		label[4] = new JLabel("?");
		label[4].setBounds(420, 150, 150, 60);
		label[4].setBackground(Color.red);
		label[4].setOpaque(true);
		label[4].setHorizontalAlignment(JLabel.CENTER);
		label[4].setForeground(Color.white);
		add(label[4]);
		
		button = new JButton[3];
		String btnTitle[] = { "가위", "바위", "보" };
		
		for (int i = 0; i < btnTitle.length; i++) {
			button[i] = new JButton(btnTitle[i]);
			button[i].setBounds(120 + 140 * i, 250, 120, 50);
			button[i].addActionListener(this);
			add(button[i]);
		}		
		
		setSize(640, 480);
		setLocation(100, 0);
		setVisible(true);
				
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}	
	
	@Override
	public void actionPerformed(ActionEvent e) {		
		JButton btn = (JButton)e.getSource();
		String title = btn.getLabel();
		
		game.init();
		
		if(title.equals("가위")) {
			game.setUserNum(0);			
		}
		else if(title.equals("바위")) {
			game.setUserNum(1);
		}
		else if(title.equals("보")) {
			game.setUserNum(2);
		}
		
		label[2].setText(game.getUser());
		label[4].setText(game.getCom());
		
		String msg = game.play();
		label[3].setText( msg );
		
		int win = game.getWin();
		int lose = game.getLose();
		int draw = game.getDraw();
		
		frontLabel.setText(win + "승 " + lose + "패 " + draw + "무");
	}
}





 


변수 int로 승 패 무;-> getter 생성

init에서 랜텀 초기화, 

유저넘버는 밖에서 들어오므로 -> setter
play에서 판정
 if 문으로 하면 너무 길어짐.

 

((comNum - userNum)+2)%3 => 1일경우 win = result;
((comNum - userNum)+2)%3 => 0일경우 lose
((comNum - userNum)+2)%3 => 2일경우 draw
-> 스위치문사용하면 간결
case1: win++; msg에 메세지 입력;
 retrun msg;

package game;

public class gbbGame {

	private int userNum;
	private int comNum;
	private int win, lose, draw;
	private int result;
	
	public gbbGame() {
		win = lose = draw = 0;
	}
	public void init() {
		comNum = (int)(Math.random() * 3);	// 0, 1, 2		
	}
	public String play() {	// win, lose, draw
		String msg = "";
		
		/*
		// win
		// 0 == 가위 1 == 바위 2 == 보		
		if(userNum == 0 && comNum == 2) {}
		else if(userNum == 1 && comNum == 0) {}
		else if(userNum == 2 && comNum == 1) {}
		
		0 2
		1 0
		2 1
		
		// lose
		if(userNum == 2 && comNum == 0) {}
		else if(userNum == 0 && comNum == 1) {}
		else if(userNum == 1 && comNum == 2) {}
		
		// draw
		if(userNum == 0 && comNum == 0) {}
		else if(userNum == 1 && comNum == 1) {}
		else if(userNum == 2 && comNum == 2) {}
		
		p c		--- win
		0 2
		1 0
		2 1
		
		com 	player
		2	- 0 	+ 2	= 4 % 3	-> 1
		0   -   1       + 2     = 1 % 3 -> 1
		1   -   2       + 2     = 1 % 3 -> 1
		
		c p
		2 0
		0 1
		1 2
		
		0   -   2       + 2     = 0 % 3 -> 0
		1   -   0       + 2     = 3 % 3 -> 0
		2   -   1       + 2     = 3 % 3 -> 0 		
		
		0 0 
		1 1
		2 2
		
		0   -   0       + 2     = 2 % 3 -> 2
		1   -   1       + 2     = 2 % 3 -> 2
		2   -   2       + 2     + 2 % 3 -> 2        
		
		*/
		
		result = (comNum - userNum + 2) % 3;
		
		switch(result) {
			case 1:
				win++;
				msg = "승리!!!";
				break;
			case 0:
				lose++;
				msg = "패배~";
				break;
			case 2:
				draw++;
				msg = "무승부-";
				break;		
		}
		return msg;		
	}

	public int getWin() {
		return win;
	}

	public int getLose() {
		return lose;
	}

	public int getDraw() {
		return draw;
	}
	
	public void setUserNum(int userNum) {
		this.userNum = userNum;
	}
	
	public String getUser() {
		String userChoice = "";
		
		switch(userNum) {
			case 0:
				userChoice = "가위";
				break;
			case 1:
				userChoice = "바위";
				break;
			case 2:
				userChoice = "보";
				break;		
		}
		return userChoice;
	}
	
	public String getCom() {
		String comChoice = "";
		
		switch(comNum) {
			case 0:
				comChoice = "가위";
				break;
			case 1:
				comChoice = "바위";
				break;
			case 2:
				comChoice = "보";
				break;		
		}
		return comChoice;
	}
}






'JAVA > UI' 카테고리의 다른 글

layout(버튼과 라벨 기본셋팅)  (0) 2020.06.12
체크박스, 라디오버튼  (0) 2020.06.12
label / 확인창 뜨게하기  (0) 2020.06.11
Observer  (0) 2020.06.11
Label 과 Panel  (0) 2020.06.11