페널티킥 게임(최종)

문건우·2023년 2월 12일
0

JAVA 토이 프로젝트

목록 보기
4/4
post-thumbnail

페널티킥 게임이 완성됐다.
아직은 많이 부족한 실력이지만, 처음으로 만든 토이 프로젝트이기에 애정을 많이 가지고 작업했는데,
그 첫 프로젝트에 대해 소개하고 정리하고자 한다.


⚽️ 페널티킥 게임이란

이름만 들어도 어떤 게임인지 대부분의 사람들이 알 수 있듯이,
플레이어는 키커가 되어 득점을 하고, 골키퍼가 되어 키커의 슛을 막아내면 된다.

처음 프로젝트를 구상할 때 키커의 입장으로만 게임을 플레이하고,
5번의 기회 중 4번의 득점을 성공시켜야 게임에 승리하는 게임을 개발하고자 했다.
그리고 구상했던 프로젝트를 다 만들고 나서 깨달았다.
내가 처음 만드는 프로젝트에 겁을 먹고 쉬운 길을 택하고자 했다는 것을.

최종적으로 페널티킥 게임은 홈팀의 키커와 골키퍼의 입장에서
공격과 수비를 5회 반복하며 원정팀과 대결하는 게임으로 만들어졌다.


💻 소스 코드

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class UpdateMainGame {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);	// 스캐너 클래스
		
		AwayGoalkeeper agk = new AwayGoalkeeper("Liverpool", "Alisson Becker");	// 원정팀 이름, 골키퍼 이름 할당
		HomeGoalkeeper hgk = new HomeGoalkeeper("Manchester United", "David DeGea");	// 홈팀 이름, 골키퍼 이름 할당
	    
		List<HomeKicker> homeKicker = new ArrayList<HomeKicker>();	// 홈팀 이름, 키커 순번, 키커 이름 할당
		homeKicker.add(new HomeKicker("Manchester United", "1번 키커", "Marcus Rashford"));
		homeKicker.add(new HomeKicker("Manchester United", "2번 키커", "Bruno Fernands"));
		homeKicker.add(new HomeKicker("Manchester United", "3번 키커", "Casemiro"));
		homeKicker.add(new HomeKicker("Manchester United", "4번 키커", "Christian Eriksen"));
		homeKicker.add(new HomeKicker("Manchester United", "5번 키커", "Antony"));
		
		List<AwayKicker> awayKicker = new ArrayList<AwayKicker>();	// 원정팀 이름, 키커 순번, 키커 이름 할당
		awayKicker.add(new AwayKicker("Liverpool", "1번 키커", "Mohamed Salah"));
		awayKicker.add(new AwayKicker("Liverpool", "2번 키커", "Cody Gakpo"));
		awayKicker.add(new AwayKicker("Liverpool", "3번 키커", "Darwin Núñez"));
		awayKicker.add(new AwayKicker("Liverpool", "4번 키커", "Jordan Henderson"));
		awayKicker.add(new AwayKicker("Liverpool", "5번 키커", "Virgil van Dijk"));
		
		int hWin = 0;	// 홈팀 득점
		int aWin = 0;	// 원정팀 득점
		
		System.out.println(hgk.getHometeam() + " 와 " + agk.getAwayteam() + "의 경기 시작합니다!");
		System.out.print("★★★경기 방법 ");
		System.out.println(">> 좌측, 우측, 중앙 중 하나를 입력하세요.★★★");
		System.out.println("------------------------------------");
		
		try {
			Thread.sleep(1000);	
		} catch (InterruptedException e) {
			e.printStackTrace();
		}	

		for(int i = 0; i<awayKicker.size(); i++) {
			int addirection = (int)(Math.random() * 3);	// 어웨이팀 골키퍼가 다이빙 뛸 방향을 0~2까지의 난수로
			int akdirection = (int)(Math.random() * 3);	// 어웨이팀 키커가 슛팅할 방향을 0~2까지의 난수로
			String[] arr = { "좌측", "중앙", "우측" };	// 난수를 배열을 통해 문자열로 설정

			System.out.println(homeKicker.get(i));
			System.out.print("슛팅할 방향 입력 >> ");
			String str1 = scanner.nextLine();	
			
			try {
				Thread.sleep(800);	
			} catch (InterruptedException e) {
				e.printStackTrace();
			}	
				
			if(str1.equals("좌측") || str1.equals("중앙") || str1.equals("우측") ) {
				if(str1.equals(arr[addirection])) {
					System.out.println("[" + homeKicker.get(i).getName() + "]" + " " + str1 + "으로 슛팅!");
					try {
						Thread.sleep(800);	
					} catch (InterruptedException e) {
						e.printStackTrace();
					}	// 공이 날아가는 시간 표현
		    		 System.out.println("골키퍼 " + arr[addirection] + "으로 뜁니다!");	
		    		 System.out.println("[" + agk.getGoalkeeper() + "]" + " 선방입니다!!");
		    		 hWin += 0;
				}else {
		    		 System.out.println("["+homeKicker.get(i).getName() + "]" + " " + str1 + "으로 슛팅!");
						try {
							Thread.sleep(800);	
						} catch (InterruptedException e) {
							e.printStackTrace();
						}	// 공이 날아가는 시간 표현
		    		 System.out.println("골키퍼 " + arr[addirection] + "으로 뜁니다!");
		    		 System.out.println("["+homeKicker.get(i).getName() + "]" + " 득점 성공합니다!");
		    		 hWin += 1;
				} 
			} else {
				System.out.println("멀리! 아주 멀리 날아갑니다~!");
				System.out.println("실축입니다");
				hWin += 0;
			}
				
			System.out.println("------------------------------------");
				
			System.out.println(awayKicker.get(i) + " 준비 합니다.");
			System.out.print("키퍼가 다이빙할 방향 입력 >> ");
			String str2 = scanner.nextLine();
				
			if(str2.equals("좌측") || str2.equals("중앙") || str2.equals("우측") ) {
				if(str2.equals(arr[akdirection])) {
					System.out.println("[" + awayKicker.get(i).getName() + "]" + arr[akdirection] + "으로 슛팅!");
					try {
						Thread.sleep(800);	
					} catch (InterruptedException e) {
						e.printStackTrace();
					}	// 공이 날아가는 시간 표현
		    		System.out.println("골키퍼 " + str2 + "으로 뜁니다!");	
		    		System.out.println("[" + hgk.getGoalkeeper()+"]" + " 선방입니다!!");
		    		aWin += 0;
				}else {
					System.out.println("[" + awayKicker.get(i).getName() + "]" + arr[akdirection] + "으로 슛팅!");
					try {
						Thread.sleep(800);	
					} catch (InterruptedException e) {
						e.printStackTrace();
					}	// 공이 날아가는 시간 표현
					System.out.println("골키퍼 " + str2 + "으로 뜁니다!");
					System.out.println("[" + awayKicker.get(i).getName() + "]" + " 득점 성공합니다!");
					aWin += 1;
				} 
			}else {
				System.out.println("[" + awayKicker.get(i).getName() + "]" + " 득점 성공합니다!");
				aWin += 1;
			}
			System.out.println("------------------------------------");
		}
		
		if(hWin > aWin) {
			System.out.println(hgk.getHometeam() + " 가 승리를 가져갑니다!!");
		} else if(hWin == aWin){
			System.out.println("무승부 입니다.");
		} else {
			System.out.println(agk.getAwayteam() + " 이 승리를 가져갑니다...");
		}
	      
		System.out.println("---최종 스코어---");
		System.out.println(hgk.getHometeam() + " 득점 : " + hWin);
		System.out.println(agk.getAwayteam() + " 득점 : " + aWin);
		
	}

}
public class HomeGoalkeeper{

	private String Hometeam;	// 홈팀 이름
	private String Goalkeeper;	// 골키퍼 이름
	public HomeGoalkeeper(String hometeam, String goalkeeper) {
		super();
		Hometeam = hometeam;
		Goalkeeper = goalkeeper;
	}
	public String getHometeam() {
		return Hometeam;
	}
	public void setHometeam(String hometeam) {
		Hometeam = hometeam;
	}
	public String getGoalkeeper() {
		return Goalkeeper;
	}
	public void setGoalkeeper(String goalkeeper) {
		Goalkeeper = goalkeeper;
	}
	@Override
	public String toString() {
		return	Hometeam + " [골키퍼 " + Goalkeeper + "]";
	}
	
}
public class HomeKicker {
	
	private String Hometeam;	// 홈팀 이름
	private String order;	// 순번
	private String name;	// 키커 이름 
	
	public HomeKicker(String hometeam, String order, String name) {
		super();
		Hometeam = hometeam;
		this.order = order;
		this.name = name;
	}
	public String getHometeam() {
		return Hometeam;
	}
	public void setHometeam(String hometeam) {
		Hometeam = hometeam;
	}
	public String getOrder() {
		return order;
	}
	public void setOrder(String order) {
		this.order = order;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override	
	public String toString() {
		return Hometeam + "["+order+ " " + name + "]";
	}
	
}
public class AwayGoalkeeper{

	private String Awayteam;	// 원정팀 이름
	private String Goalkeeper;	// 골키퍼 이름
	
	public AwayGoalkeeper(String awayteam, String goalkeeper) {
		super();
		Awayteam = awayteam;
		Goalkeeper = goalkeeper;
	}
	public String getAwayteam() {
		return Awayteam;
	}
	public void setAwayteam(String awayteam) {
		Awayteam = awayteam;
	}
	public String getGoalkeeper() {
		return Goalkeeper;
	}
	public void setGoalkeeper(String goalkeeper) {
		Goalkeeper = goalkeeper;
	}
	@Override
	public String toString() {
		return   Awayteam + " [골키퍼 " + Goalkeeper + "]";
	}
	
}
public class AwayKicker {
	
	private String Awayteam;	// 원정팀 이름
	private String order;	// 순번
	private String name;	// 키커 이름 
	public AwayKicker(String awayteam, String order, String name) {
		super();
		Awayteam = awayteam;
		this.order = order;
		this.name = name;
	}
	public String getAwayteam() {
		return Awayteam;
	}
	public void setAwayteam(String awayteam) {
		Awayteam = awayteam;
	}
	public String getOrder() {
		return order;
	}
	public void setOrder(String order) {
		this.order = order;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override	
	public String toString() {
		return Awayteam + "["+order+ " " + name + "]";
	}
	
}

✔️ 주요 기능

  • 난수와 배열
int addirection = (int)(Math.random() * 3);	// 어웨이팀 골키퍼가 다이빙 뛸 방향을 0~2까지의 난수로
int akdirection = (int)(Math.random() * 3);	// 어웨이팀 키커가 슛팅할 방향을 0~2까지의 난수로
String[] arr = { "좌측", "중앙", "우측" };	// 난수를 배열을 통해 문자열로 설정

랜덤 함수를 이용해 0~2까지의 난수를 출력하게 했고,
그 값을 배열을 통해 좌측, 중앙, 우측에 할당했다.

  • ArrayList
List<HomeKicker> homeKicker = new ArrayList<HomeKicker>();	// 홈팀 이름, 키커 순번, 키커 이름 할당
homeKicker.add(new HomeKicker("Manchester United", "1번 키커", "Marcus Rashford"));
homeKicker.add(new HomeKicker("Manchester United", "2번 키커", "Bruno Fernands"));
homeKicker.add(new HomeKicker("Manchester United", "3번 키커", "Casemiro"));
homeKicker.add(new HomeKicker("Manchester United", "4번 키커", "Christian Eriksen"));
homeKicker.add(new HomeKicker("Manchester United", "5번 키커", "Antony"));
		
List<AwayKicker> awayKicker = new ArrayList<AwayKicker>();	// 원정팀 이름, 키커 순번, 키커 이름 할당
awayKicker.add(new AwayKicker("Liverpool", "1번 키커", "Mohamed Salah"));
awayKicker.add(new AwayKicker("Liverpool", "2번 키커", "Cody Gakpo"));
awayKicker.add(new AwayKicker("Liverpool", "3번 키커", "Darwin Núñez"));
awayKicker.add(new AwayKicker("Liverpool", "4번 키커", "Jordan Henderson"));
awayKicker.add(new AwayKicker("Liverpool", "5번 키커", "Virgil van Dijk"));

ArrayList 클래스를 이용해서 홈팀과 원정팀 키커들의 값을 할당했다.

  • try~catch + Thread.Sleep
try {
	Thread.sleep(1000);	
} catch (InterruptedException e) {
	e.printStackTrace();
}	

게임이 진행되는 과정을 해설위원이 말을 하는 형식으로 출력하게 하였는데,
try catch 예외와 Thread.Sleep을 이용하여
키커가 슛팅하고 골키퍼가 다이빙할 때 까지 공이 날아가는 시간을 표현했다.

  • Scanner

스캐너 클래스를 이용해 플레이어가 슛팅하고, 선방하고자 하는 방향을 입력받도록 했다.


✍🏼 후기

자바 수업에서 배운 것들을 최대한 활용하여 프로젝트를 만들어보고자 했다.

앞서 말했듯, 처음이라고 지레 겁었던 것이 프로젝트를 진행하는 과정에서 느껴졌다.
생각보다 원하는 기능을 구현하는 과정이 수월했고,
모르는 기능들은 책과 구글링을 통해 해결해가는 과정이 재밌었다.

실력은 부족할지 몰라도, 앞으로 더 많은 프로젝트들을 진행하며
실력을 차근차근 쌓겠다.

이제 진짜 끝!🫰🏼
(마지막으로는 내가 좋아하는 축구팀 ㅋㅅㅋ)

profile
반드시 해내야지

0개의 댓글