36-java - class 문제들

jin·2022년 7월 30일
0

1. 숫자이동[3단계] : 클래스 + 변수

  1. 숫자2는 캐릭터이다.
  2. 숫자1을 입력하면, 캐릭터가 왼쪽으로
    숫자2를 입력하면, 캐릭터가 오른쪽으로 이동한다.
  3. 숫자 1은 벽이다. 벽을 만나면 이동할 수 없다.
  4. 단, 숫자3을 입력하면, 벽을 격파할 수 있다.
  5. 좌우 끝에 도달해도 계속 반대편으로 이동이 가능하다.
    예)
    0 0 0 0 0 0 0 2
    왼쪽(1) 오른쪽(2) : 2
    2 0 0 0 0 0 0 0
class GameMove{
	int[] game = {0, 0, 1, 0, 2, 0, 0, 1, 0};
}

public class 클래스1_알고리즘_숫자이동 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		GameMove gameMove = new GameMove();
		while (true) {
			int point = -1;
			for (int i = 0; i < gameMove.game.length; i++) {
				if (gameMove.game[i] == 2) {
					point = i;
					break;
				}
			}
			System.out.println(Arrays.toString(gameMove.game));
			System.out.println("[1]왼쪽 [2]오른쪽 [-1]종료");
			int select = sc.nextInt();
			if (select == -1) {
				System.out.println("종료");
				break;
			} else if (select == 1) { // 왼
				if (point == 0) {
					gameMove.game[point] = 0;
					point = gameMove.game.length-1;
					gameMove.game[point] = 2;
					System.out.println("왼쪽 끝 도달 오른쪽 끝으로 이동\n");
					continue;
				}
				if (gameMove.game[point-1] == 0) {
					gameMove.game[point] = 0;
					point--;
					gameMove.game[point] = 2;
					System.out.println("왼쪽 한칸 이동\n");
					continue;
				} 
				if (gameMove.game[point-1] == 1) {
					System.out.println("야생의 벽이 나타났다. 부수겠습니까?");
					System.out.println("[3]격파 [그외] 아무 행동 하지않음");
					select = sc.nextInt();
					if (select == 3) {
						gameMove.game[point-1] = 0;
						System.out.println("벽 격파\n");
					} else {
						System.out.println("아무일도 일어나지 않음\n");
						continue;
					}
				}
			} else if (select == 2) { // 오른
				if (point == gameMove.game.length-1) {
					gameMove.game[point] = 0;
					point = 0;
					gameMove.game[point] = 2;
					System.out.println("오른쪽 끝 도달 왼쪽 끝으로 이동\n");
					continue;
				}
				if (gameMove.game[point+1] == 0) {
					gameMove.game[point] = 0;
					point++;
					gameMove.game[point] = 2;
					System.out.println("오른쪽 한칸 이동\n");
					continue;
				}
				if (gameMove.game[point+1] == 1) {
					System.out.println("야생의 벽이 나타났다. 부수겠습니까?");
					System.out.println("[3]격파 [그외] 아무 행동 하지않음");
					select = sc.nextInt();
					if (select == 3) {
						gameMove.game[point+1] = 0;
						System.out.println("벽 격파\n");
					} else {
						System.out.println("아무일도 일어나지 않음\n");
						continue;
					}
				}
			}
		}
	}
}

이전 배열에서 했던 문제들을 클래스에 있는 변수들을 활용하여 다시 풀었다. 메소드 파트는 클래스 다음 파트라 메인 메소드에서 기능 구현했다.

2. 1 to 50[3단계] : 1 to 18

class Game1to50{
	final int SIZE = 9;	
	int[] front = new int[SIZE];
	int[] back  = new int[SIZE];	
}
public class 클래스1_프로젝트_1to50문제 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Random rnd = new Random();
		Game1to50 game1to50 = new Game1to50();
		int SIZE = game1to50.SIZE;
		int[] front = game1to50.front;
		int[] back = game1to50.back;
		
		int count = 0;
		int index = 0;
		int[] check = new int[SIZE];
		int[][] game = new int[SIZE/3][SIZE/3];
		int gameIdx = 0;
		// 배열에 값 넣기
		while (true) {
			if (count == (SIZE * 2)) {
				for (int i = 0; i < SIZE/3; i++) {
					for (int j = 0; j < SIZE/3; j++) {
						game[i][j] = front[gameIdx];
						gameIdx++;
					}
					System.out.println(); 
				}
				System.out.println("값 입력 완료\n");
				break;
			}
			
			if (count < 9) {
				int rNum = rnd.nextInt(SIZE)+1;
				int checkIdx = rNum-1;
				if (check[checkIdx] != 0) {
					continue;
				}
				check[checkIdx] = rNum;
				front[index] = rNum;
				index++;
				count++;
			} else {
				
				int rNum = rnd.nextInt(SIZE)+10;
				int checkIdx = rNum-10;
				if (check[checkIdx] != 0) {
					continue;
				}
				check[checkIdx] = rNum;
				back[index] = rNum;
				index++;
				count++;
			}
			
			
			if(index == SIZE) {
				index = 0;
				check = null;
				check = new int[SIZE];
			}
		}
		System.out.println(Arrays.toString(front));
		System.out.println(Arrays.toString(back));
		
		count = 0;
		index = 0;
		while(true) {
			for (int i = 0; i < game.length; i++) {
				for (int j = 0; j < game[0].length; j++) {
					System.out.printf("[%2d]", game[i][j]);
				}
				System.out.println();
			}
			if (count == (SIZE * 2)) {
				System.out.println("게임 클리어");
				break;
			}
			System.out.println("세로 위치 지정 (1~3)");
			int col = sc.nextInt();
			int colIdx = col-1;
			if (colIdx < 0 || colIdx > 2) {
				System.out.println("세로위치 입력 오류");
				continue;
			}
			System.out.println("가로 위치 지정 (1~3)");
			int row = sc.nextInt();
			int rowIdx = row-1;
			if (rowIdx < 0 || rowIdx > 2) {
				System.out.println("가로위치 입력 오류");
				continue;
			}
			
			if (count/9 == 0 && (count+1 == game[colIdx][rowIdx])) {
				game[colIdx][rowIdx] = back[index];
				index++;
				count++;
				System.out.println("정답");
			} else if (count/9 == 1 && (count+1 == game[colIdx][rowIdx] )) {
				game[colIdx][rowIdx] = 0;
				count++;
				System.out.println("정답");
			} else {
				System.out.println("오답");
			}
		}
	}
}

이전 배열에서는 플레이 안하고 보기만 해서 이해를 잘못했었는데 1~9까지의 수를 front배열에 넣어주고 10~18까지의 값을 back에 넣어준 후 정답 수가 9에 도달하기 전에 정답을 맞추면 back 배열 값을 순차척으로 정답 인덱스 위치에 넣어주면 된다.

3. 기억력 게임 : 클래스 + 변수

  1. front 배열 카드 10장을 섞는다.
  2. front 배열에서 같은 카드를 골라 카드의 위치를 입력한다.
  3. 선택한 2장의 카드가 같은 카드이면, back 배열에 표시한다.
  4. 모든 카드가 뒤집히면(back배열의 0이 사라지면) 게임은 종료된다.
class GameMemory{
	int[] front = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5};
	int[] back = new int[10];
	
	int cnt = 0;		// 정답을 맞춘 횟수
}

public class 클래스1_프로젝트_기억력게임문제 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Random rnd = new Random();
		GameMemory gameMemory = new GameMemory();
		int[] front = gameMemory.front;
		int[] back = gameMemory.back;
		int count = gameMemory.cnt;
		// 셔플
		for (int i = 0; i < 1000; i++) {
			int first = rnd.nextInt(front.length);
			int second = rnd.nextInt(front.length);
			
			int temp = front[first];
			front[first] = front[second];
			front[second] = temp;
		}
		System.out.println(Arrays.toString(front));
		// 본 게임
		while (true) {
			boolean check = false;
			if (count == back.length/2) {
				for (int i = 0; i < back.length; i++) {
					if (back[i] == 0) {
						check = true;
						break;
					}
				}
				if (check == true) {
					System.out.println("에러");
				} 
				System.out.println("게임 종료");
				System.out.println(Arrays.toString(back));
				break;
			}
			System.out.println(Arrays.toString(back));
			System.out.println("첫번째 카드 선택 1~10");
			int first = sc.nextInt();
			if ( (first < 1 && first > 10) || back[first-1] != 0) {
				System.out.println("선택오류\n");
				continue;
			}
			System.out.println("두번째 카드 선택 1~10");
			int second = sc.nextInt();
			if (second < 1 && second > 10 || back[second-1] != 0) {
				System.out.println("선택오류\n");
				continue;
			}
			if (front[first-1] == front[second-1]) {
				System.out.println("정답");
				back[first-1] = front[first-1];
				back[second-1] = front[second-1];
				count++;
			} else {
				System.out.println("오답");
			}
		}
	}
}

배열에서 풀었던 그 문제 클래스ver2

4. 더하기 게임

  1. 1부터 10 사이의 랜덤한 값을 중복 없이 game 배열에 6개 저장한다.
  2. 0부터 5사이의 랜덤 값 3개를 중복 없이 선택해 그 수의 합을 출력한다.
  3. 사용자는 중복없이 3개의 인덱스를 골라 그 합을 맞추는 게임이다.
class GamePlus{
	int[] game = new int[6];
	int[] idx = new int[3];
	int[] myIdx = new int[3];	
	int total = 0;
}

public class 클래스1_프로젝트_더하기게임문제 {
	public static void main(String[] args) {
		Random rnd = new Random();
		Scanner sc = new Scanner(System.in);
		GamePlus gamePlus = new GamePlus();
		int[] game = gamePlus.game;
		int[] check = new int[10];
		int count = 0;
		// 1. 1부터 10 사이의 랜덤한 값을 중복 없이 game 배열에 6개 저장한다.
		while (true) { // 게임배열
			if (count == game.length) { break; }
			int rNum = rnd.nextInt(9)+1;
			if (check[rNum-1] != 0) { continue; }
			check[rNum-1] = rNum;
			game[count] = rNum;
			count++;
		}
		
		
		int[] index = gamePlus.idx;
		int total = gamePlus.total;
		count = 0;
		check = null;
		check = new int[game.length];
		// 2. 0부터 5사이의 랜덤 값 3개를 중복 없이 선택해 그 수의 합을 출력한다. 
		while (true) { // index배열
			int rNum = rnd.nextInt(6);
			
			if (index.length == count) { break; }
			if (check[rNum] != 0) { continue; }
			
			check[rNum] = rNum;
			total += game[rNum];
			count++;
		}
		
		// 3. 사용자는 중복없이 3개의 인덱스를 골라 그 합을 맞추는 게임이다.
		count = 0;
		int myTotal = 0;
		check = null;
		check = new int[game.length];
		while (true) {
			System.out.println( "문제 : "+total);
			System.out.println(Arrays.toString(game));
			
			System.out.println((count+1)+"번째 인덱스 입력 0~5");
			int num = sc.nextInt();
			
			if (check[num] != 0) { 
				System.out.println("이미 선택한 인덱스\n");
				continue; 
			}
			
			check[num] = num;
			myTotal += game[num]; 
			count++;
			
			if (count == index.length && myTotal == total) { 
				System.out.println("정답");
				System.out.println("내 선택 합 : " + myTotal);
				break; 
			} else if (count == index.length && myTotal != total ) {
				System.out.println("오답");
				System.out.println("내 선택 합 : " + myTotal);
				check = null;
				check = new int[game.length];
				myTotal = 0;
				count = 0;
				continue;
			}
		}
	}
}

배열에서 풀었던 그 문제 클래스ver3

5. 랭킹 매기기

1) 랭크 클래스를 만든다.
2) 점수에 기반해서 rank 에 등수를 저장한다.
[조건] 동점자가 있을경우 등수는 같게 저장하고 다음 점수학생은
동점자만큼 뒤의 등수를 저장한다.
예) 지금 점수가 10 , 30 , 100, 30
==> 등수는 4,2,1,2 이다.

class Rank{
	int score[] = {10, 30, 100, 30};
	int rank [] = new int[4];
}
public class 클래스1_프로젝트_랭킹문제 {
	public static void main(String[] args) {
		Rank rank = new Rank();
		int[] scores = rank.score;
		int[] ranks = rank.rank;
		for (int i = 0; i < scores.length; i++) {
			for (int j = 0; j < scores.length; j++) {
				if (i == j) {
					ranks[i]++;
					continue;
				}
				if (scores[i] < scores[j]) {
					ranks[i]++;
				}
			}
		}
		System.out.println(Arrays.toString(rank.rank));
		
	}
}

rank배열 값이 0인 상태가 초기값이니 자기 자신일때 1씩 올리면 1부터 나오겠구나 싶어서 작성한 코드.
선생님은 cnt 변수를 만들고 초기값을 1로 준 후 이중for문 스코프 아래에서 rank 배열에 cnt 값을 넣었다.

6. 관리자 컨트롤러

class User{
	String id;
}
class Item{
	String name;
	int price;
}
class Cart{
	String userId;
	String itemName;
}

public class 클래스배열2_프로젝트_관리자_컨트롤러 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String[] userIdList = { "admin", "bbb", "ccc" };

		String[] itemNameList = { "사과", "칸초", "귤", "감" };
		int[] itemPriceList = { 10000, 2000, 6500, 3300 };
		
		int max = 1000;
		User[] userList = new User[max];
		int userSize = 0;
		for (int i = 0; i < userIdList.length; i++) {
			userList[i] = new User();
			userList[i].id = userIdList[i];
			userSize ++;
			
		}
		
		Item[] itemList = new Item[max];
		int itemSize = 0;
		for (int i = 0; i < itemNameList.length; i++) {
			itemList[i] = new Item();
			itemList[i].name = itemNameList[i];
			itemList[i].price = itemPriceList[i];
			itemSize ++;
			
		}
		
		Cart[] cartList = new Cart[max];
		int cartSize = 0;
		
		while (true) {
			System.out.println("[0] 종료 [1] 로그인 [2] 회원가입 ");
			int sel = sc.nextInt();
			
			if (sel == 1) { // 로그인
				System.out.println("로그인 아이디 입력 ");
				String id = sc.next();
				
				boolean idCheck = false;
				for (int i = 0; i < userSize; i++) {
					if (id.equals(userList[i].id)) {
						idCheck = true;
						break;
					}
					
				}
				
				if (idCheck == false) {
					System.out.println("로그인 실패 아이디 확인바람\n");
					continue;
				}
				
				if (id.equals("admin")) {
					while(true) {
						System.out.println("[관리자메뉴]");
						System.out.println("[0] 로그아웃 [1] 아이템 추가 [2] 아이템 삭제 [3] 아이템 목록");
						sel = sc.nextInt();
						if(sel == 0) {
							System.out.println("관리자 로그아웃\n");
							break;
						} else if (sel == 1) { // 아이템 추가
							boolean flag = false;
							System.out.print("추가 아이템 입력 : ");
							String insertItem = sc.next();
							for (int i = 0; i < itemSize; i++) {
								if (insertItem.equals(itemList[i].name)) {
									flag = true;
									break;
								}
							}
							if (flag == true) {
								System.out.println("해당 아이템은 이미 존재\n");
								continue;
							}
							
							System.out.print("아이템 가격 입력 : ");
							int insertPrice = sc.nextInt();
							
							Item item = new Item();
							item.name = insertItem;
							item.price = insertPrice;
							itemList[itemSize] = item;
							itemSize ++;
							
							System.out.println("아이템 등록 완료\n");
							
						} else if (sel == 2) { // 아이템 삭제
							System.out.print("추가 아이템 입력 : ");
							String delItem = sc.next();
							int idx = -1;
							boolean flag = false;
							for (int i = 0; i < itemSize; i++) {
								if (delItem.equals(itemList[i].name)) {
									idx = i;
									flag = true;
									break;
								}
							}
							
							if (flag == false) {
								System.out.println("해당 아이템 존재하지 않음");
								continue;
							}
							
							for (int i = idx; i < itemSize; i++) {
								itemList[i] = itemList[i+1];
							}
							itemList[itemSize] = null;
							itemSize --;
							
							System.out.println("삭제완료\n");
							
							
						} else if (sel == 3) { // 아이템 목록
							System.out.println("아이템 목록");
							for (int i = 0; i < itemSize; i++) {
								System.out.println(itemList[i].name + " " + itemList[i].price);
							}
							System.out.println();
							
						}
					}
						
				} else {
					while(true) {
						System.out.println("[" + id + " 로그인]");
						System.out.println("[쇼핑메뉴]");
						
						System.out.println("[0] 로그아웃 [1] 쇼핑 [2] 주문확인 [3] 탈퇴");
						sel = sc.nextInt();
						if(sel == 0) {
							System.out.println("[" + id + " 로그아웃]");
							break;
						} else if (sel == 1) { // 쇼핑 ==> 카트리스트 추가
							 System.out.print("카트에 담을 아이템 입력 : ");
							 String insertCartItem = sc.next();
							 boolean flag = false;
							 for (int i = 0; i < itemSize; i++) {
								 if (insertCartItem.equals(itemList[i].name)) {
									 Cart cart = new Cart();
									 cart.userId = id;
									 cart.itemName = insertCartItem;
									 cartList[cartSize] = cart;
									 cartSize++;
									 System.out.println("카트 담기 완료\n");
									 flag = true;
									 break;
								 }
							 }
							
							 if (flag == false) {
								 System.out.println("해당 아이템 없음\n");
								 continue;
							 }
							
						} else if (sel == 2) { // 주문확인 
							boolean flag = false;
							for (int i = 0; i < cartSize; i++) {
								if(id.equals(cartList[i].userId)) {
									System.out.println(cartList[i].userId + " " + cartList[i].itemName);
									flag = true;
								}
							}
							System.out.println();
							if (flag == false) {
								System.out.println("해당 회원 카트 목록 비어있음\n");
							}
							
						} else if (sel == 3) { // 탈퇴 ==> 카트리스트 삭제
							int cnt = 0;
							for (int i = 0; i < cartSize; i++) {
								Cart cartTemp = cartList[i];
								if (!id.equals(cartList[i].userId)) {
									cartList[cnt] = cartList[i];
									cartList[i] = cartTemp;
									cnt++;
								}
								
							}
							
							if (cnt == 0) {
								cnt = cartSize;
								cartSize = 0;
								for (int i = cartSize; i < cnt; i++) {
									cartList[i] = null;
								}
								
							} else {
								cartSize = cartSize - cnt;
								for (int i = cartSize; i < cnt; i++) {
									cartList[i] = null;
								}
								
							}
							System.out.println("카트 삭제 완료");
							
							for (int i = 0; i < userSize; i++) {
								if (id.equals(userList[i].id)) {
									for (int j = i; j < userSize; j++) {
										userList[j] = userList[j+1];
									}
									break;
								}
							}
							userSize--;
							userList[userSize] = null;
							System.out.println("유저 탈퇴완료\n");
							break;
						}
					}
				}
				
			} else if (sel == 2) { // 회원가입
				System.out.println("회원 아이디 입력 ");
				String id = sc.next();
				boolean check = false;
				for (int i = 0; i < userSize; i++) {
					if (id.equals(userList[i].id)) {
						check = true;
					}
					
				}
				
				if (check == true) {
					System.out.println("이미 있는 회원 아이디");
					continue;
				}
				
				userList[userSize] = new User();
				userList[userSize].id = id;
				userSize++;
				System.out.println("회원가입 완료");
				
			} else { break; }
			
			
		} 
		
		sc.close();
	}
}

회원 탈퇴 시 장바구니도 비워줘야하는데 이때 어떻게 해야할지 고민이 많았다.
별 탈 없이 작동하겠지 구현했더니 하나씩 남아버리고 널포인트도 보고 문제점 찾는데 제법 많은 시간이 소요됐다.
삭제 구현시 하나씩 남는 문제점 해결은 다른 회원 장바구니에 상품이 담겨있는지 확인하고 없을 경우에 전부 null을 넣었다.
이 점에 대해 이건 배열의 한계인지 질문하려고 했는데 슬픈 사정이 있어 다음주에 질문하기로

0개의 댓글