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;
}
}
}
}
}
}
이전 배열에서 했던 문제들을 클래스에 있는 변수들을 활용하여 다시 풀었다. 메소드 파트는 클래스 다음 파트라 메인 메소드에서 기능 구현했다.
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 배열 값을 순차척으로 정답 인덱스 위치에 넣어주면 된다.
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
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
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 값을 넣었다.
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을 넣었다.
이 점에 대해 이건 배열의 한계인지 질문하려고 했는데 슬픈 사정이 있어 다음주에 질문하기로