자바 어린이 코딩6시간동안 했는데 혹시 코드한번 봐주실수있나요?

경품돌리는 간단한 코든데 어떻게 코딩을 했어야 더 잘 된 코딩이였을까요?
이렇게 간단한거하는데 6시간 걸리는 제 자신이 너무 슬퍼요 ㅠㅠ

package practice;

import java.util.Scanner;
import java.util.InputMismatchException;

public class lotteryapp {
	private Scanner scanner;
	private player[] players;
	private good[] goods;
	
	public lotteryapp() {
		scanner = new Scanner(System.in);
	}
	public void run() {
		System.out.println("경품추첨을 시작합니다.");
		int nplayers;
		int ngoods;
		while(true) {
			System.out.println("경품추첨에 참가하는 인원은 몇명입니까?");
			try {
				nplayers = scanner.nextInt();
				break;
			} catch(InputMismatchException e) {
				System.out.println("정수를 입력해야 합니다.");
				scanner.nextLine();
				continue;
			} //player 인원 정홤
		}
		players = new player[nplayers];
		for(int i=0; i<nplayers; i++) {
			System.out.println("참가자의 이름을 입력하세요");
			String name = scanner.next();
			players[i] = new player(name);
		} //player 이름 정함
		
		while(true) {
			System.out.println("경품은 몇개입니까?");
			try {
				ngoods = scanner.nextInt();
				break;
			} catch(InputMismatchException e) {
				System.out.println("정수를 입력해야 합니다.");
				scanner.nextLine();
				continue;
				
			}
		} //경품 개수 정함
		goods = new good[ngoods];
		
		for(int i=0; i<ngoods; i++) {
			System.out.println("경품의 이름과 가격을 입력하시오.");
			String name = scanner.next();
			int price = scanner.nextInt();
			goods[i] = new good(name, price);
		}//경품 이름 정함
		int next = 0; //참가자 돌리는 필드
		int usedgood = 0; //당첨된 경품개수 저장
		int putsplayernumber = 0;//당첨된 플레이어 몇명인지 저장
		while(true) {
		
			System.out.println("경품을 추첨합니다");
			int value = (int)(Math.random()*2);//랜덤값
			if(value==0) {//당첨
				if(players[next].putgood==1) {//이미 받은 사람이 또 받은 경우
					 continue;
				}
				else{
					players[next].putgood++;//또 받은 플레이어 구분
					players[next].good = goods[putsplayernumber].name; //풀레이어 good필드에 상품저장
					usedgood++; //경품 모두 소진시 끝내려는 의도
					putsplayernumber++; //모든 사람이 경품 받았을시 끝내려는 의도
				}
				next ++; 
				next %= nplayers; //무한으로 돌리는 메커니즘
			}
			else{ //당첨되지 않았을 경우
				next ++; 
				next %= nplayers; //사람은 돌림
				continue;
			}
			if(putsplayernumber == nplayers || usedgood == ngoods) {
		   break; //모든 사람이 받았거나 모든 경품이 소진됬을시 종료
		}
	}
		for(int i=0; i<nplayers; i++) {
			if(players[i].putgood==1)
			System.out.println(players[i].name + "의 경품은"+ players[i].good);
			else {
				System.out.println(players[i].name+"은 꽝!");
			}
				
		}
	}
	
	
	public static void main(String[] args) {
		lotteryapp game = new lotteryapp();
		game.run();
	}

}



class player {
	private Scanner scanner;
	public String name;
	public String good;
	public int putgood = 0; //경품 받았는지 판별하는 필드
	
	public player(String name) {
		this.name = name;
		scanner = new Scanner(System.in);
	}

} 

class good {
	private Scanner scanner;
	public String name;
	private int price; //가격 저장하는 필드
	
	public good(String name, int price) {
		this.name = name;
		this.price = price;
		scanner = new Scanner(System.in);
	}
	
}

1 Like

처음부터 잘하는 사람이 있나요. 연습하면서 는거죠.

  1. 자바는 클래스가 대문자로 시작합니다
  2. 처음 두번의 while 섹션이 메세지만 바뀌고 똑같네요. 함수로 빼서 재활용해 보세요.
  3. 클래스 안의 멤버변수들을 죄다 퍼블릭처리 하는건 지양해야 합니다.
  4. Value 관련 로직이 좀 이상하고요.

뭐 이정도면 나쁘지 않을것 같읍니다.

2 Likes

제가 봤을 때는 run() 함수에 있는 기능들을 함수로 쪼개는 작업이 필요할 거 같아요

저도 잘 짜는 편은 아니지만 저는 한번 코드를 짜고 리팩토링 할 때

나눌 수 있는 코드나 반복되는 코드들은 함수로 만드는 편 입니다.

맞아요 열심히 하시다보면 성장해나가실겁니다.
윗분들께서 좋은 말씀 해주셨는데 하나씩 코드를 고쳐보세요.
그런 과정을 리팩토링이라고 합니다 ㅎㅎㅎ

1 Like

답글이 늦었네요 감사합니다 ㅠㅠ 열심히 해볼게요!