반응형
게임 2048을 java를 이용해 직접 구현한 것이다. 아직 최적화도 하지 않았고, 또한 기능도 매우 제한적이다.
GUI 방식이 아닌 키보드로부터 숫자를 입력받아서 이동하는 것이다. 아래 소스코드를 첨부하였다.
여기서 할 수 있는 기능은 단지 움직이는 것만 할 수 있다. 즉, undo라던지 점수출력, 혹은 저장 및 불러오기 등 2048 게임에서 지원하는 것을 다 담지는 못하였다.
아래는 소스코드이다.
- import java.util.Scanner;
- public class game {
- /*********** This is element function ***********/
- public static int getRand(int min, int max) {
- return i;
- }
- public static void syncArr(int [][] arr, int [][] barr) {
- if(arr.length != barr.length)
- return;
- for(int i = 0; i < arr.length; i++) {
- if(arr[i].length != barr[i].length)
- return;
- for(int j = 0; j < arr[i].length; j++)
- barr[i][j] = arr[i][j];
- }
- }
- // if arr[i][j] and arr[k][l] are same, then merge it at arr[i][j]
- public static void merge(int [][] arr, int i, int j, int k, int l) {
- if(arr[i][j] == arr[k][l])
- {
- arr[i][j] = arr[i][j] + arr[k][l];
- arr[k][l] = 0;
- }
- return;
- }
- // if arr[i][j] is 0, then move arr[k][l] to arr[i][j]
- public static void shift(int [][] arr, int i, int j, int k, int l) {
- if(arr[i][j] == 0)
- {
- arr[i][j] = arr[k][l];
- arr[k][l] = 0;
- }
- }
- public static void randNum(int [][] arr) {
- int i = 0; int j = 0; // i, j is index number of array
- if(check_Lose(arr)) {
- show_Lose();
- return;
- }
- while(true) {
- i = getRand(0, arr.length - 1);
- j = getRand(0, arr[i].length - 1);
- if(arr[i][j] == 0)
- break;
- }
- arr[i][j] = getRand(0, 1) * 2 + 2;
- }
- /*********** This is moving function ***********/
- public static void L_Move(int [][] arr) {
- int k, l;
- for(int i = 0; i < arr.length; i++) {
- for(int j = 0; j < arr[i].length-1; j++) {
- k = i; l = j;
- while(l >=0) {
- shift(arr, k, l, k, l+1);
- l--;
- }
- }
- }
- for(int i = 0; i < arr.length; i++) {
- for(int j =0; j < arr[i].length-1; j++)
- {
- merge(arr, i, j, i, j+1);
- }
- }
- for(int i = 0; i < arr.length; i++) {
- for(int j = 0; j < arr[i].length-1; j++) {
- k = i; l = j;
- while(l >=0) {
- shift(arr, k, l, k, l+1);
- l--;
- }
- }
- }
- }
- public static void R_Move(int [][] arr) {
- int k, l;
- for(int i = 0; i < arr.length; i++) {
- for(int j = arr[i].length - 1; j > 0; j--) {
- k = i; l = j;
- while(l < arr[i].length ) {
- shift(arr, k, l, k, l-1);
- l++;
- }
- }
- }
- for(int i = 0; i < arr.length; i++) {
- for(int j = arr[i].length - 1; j > 0; j--) {
- merge(arr, i, j, i, j-1);
- }
- }
- for(int i = 0; i < arr.length; i++) {
- for(int j = arr[i].length - 1; j > 0; j--) {
- k = i; l = j;
- while(l < arr[i].length ) {
- shift(arr, k, l, k, l-1);
- l++;
- }
- }
- }
- }
- public static void T_Move(int [][] arr) {
- int k, l;
- for(int j = 0; j < arr.length; j++) {
- for(int i = 1; i < arr.length; i++) {
- k = i; l = j;
- while(k > 0 ) {
- shift(arr, k-1, l, k, l);
- k--;
- }
- }
- }
- for(int j = 0; j < arr.length; j++) {
- for(int i = 1; i < arr.length; i++) {
- merge(arr, i-1, j, i, j);
- }
- }
- for(int j = 0; j < arr.length; j++) {
- for(int i = 1; i < arr.length; i++) {
- k = i; l = j;
- while(k > 0 ) {
- shift(arr, k-1, l, k, l);
- k--;
- }
- }
- }
- }
- public static void B_Move(int [][] arr) {
- int k, l;
- for(int j = 0; j < arr.length; j++) {
- for(int i = arr.length - 2; i >= 0; i--) {
- k = i; l = j;
- while(k < arr.length -1 ) {
- shift(arr, k+1, l, k, l);
- k++;
- }
- }
- }
- for(int j = 0; j < arr.length; j++) {
- for(int i = arr.length - 2; i >= 0; i--) {
- merge(arr, i+1, j, i, j);
- }
- }
- for(int j = 0; j < arr.length; j++) {
- for(int i = arr.length - 2; i >= 0; i--) {
- k = i; l = j;
- while(k < arr.length -1 ) {
- shift(arr, k+1, l, k, l);
- k++;
- }
- }
- }
- }
- public static void MoveArr(int [][] arr, int opt) {
- int [][] Barr = new int[arr.length][arr.length];
- syncArr(arr, Barr);
- if(opt == 0) {
- T_Move(arr);
- } else if (opt == 1) {
- B_Move(arr);
- } else if (opt == 2) {
- R_Move(arr);
- } else if (opt == 3) {
- L_Move(arr);
- } else {
- return;
- }
- for(int i = 0; i < arr.length; i++) {
- for(int j = 0; j < arr[i].length; j++) {
- if(Barr[i][j] != arr[i][j]) {
- randNum(arr);
- show_arr(arr);
- return;
- }
- }
- }
- show_arr(arr);
- }
- /*********** This is showing function ***********/
- public static void show_option() {
- }
- public static void show_arr(int [][] arr) {
- for(int i = 0; i < arr.length; i++) {
- for(int j = 0; j < arr[i].length; j++) {
- }
- }
- }
- public static void show_Win() {
- }
- public static void show_Lose() {
- }
- /*********** checking the game end ***********/
- public static boolean check_Same(int [][] arr, int [][] barr) {
- if(arr.length != barr.length)
- return false;
- for(int i = 0; i < arr.length; i++) {
- if(arr[i].length != barr[i].length)
- return false;
- for(int j = 0; j < arr[i].length; j++)
- if(barr[i][j] != arr[i][j])
- return false;
- }
- return true;
- }
- public static boolean check_Win(int [][] arr, int maxnum) {
- for(int i = 0; i < arr.length; i++) {
- for(int j = 0; j < arr[i].length; j++) {
- if(maxnum <= arr[i][j]){
- show_Win();
- return true;
- }
- }
- }
- return false;
- }
- public static boolean check_Lose(int [][] arr) {
- int [][] barr = new int[arr.length][arr.length];
- syncArr(arr, barr);
- for(int i =0; i < arr.length; i++) {
- for(int j = 0; j < arr[i].length; j++) {
- if(arr[i][j] == 0)
- return false;
- }
- }
- L_Move(barr);
- if (!check_Same(barr, arr))
- return false;
- syncArr(arr, barr);
- R_Move(barr);
- if(!check_Same(barr, arr))
- return false;
- syncArr(arr, barr);
- T_Move(barr);
- if(!check_Same(barr, arr))
- return false;
- syncArr(arr, barr);
- B_Move(barr);
- if(!check_Same(barr, arr))
- return false;
- show_Lose();
- return true;
- }
- /*********** This is setting game ***********/
- public static void setGame(int [][] arr) {
- randNum(arr);
- randNum(arr);
- show_arr(arr);
- }
- /*********** This is main part ***********/
- int [][] arr = new int[4][4];
- int opt = 0;
- int num = 2048;
- // System.out.println("input number");
- // num = scan.nextInt();
- setGame(arr);
- while(true) {
- if(check_Win(arr, num))
- break;
- if(check_Lose(arr))
- break;
- show_option();
- opt = scan.nextInt();
- MoveArr(arr, opt);
- }
- scan.close();
- }
- }
휴.. 아직 갈 길이 멀군..
반응형
'컴퓨터 > Java' 카테고리의 다른 글
MongoDB에서 Between 쿼리 사용하기 (0) | 2024.04.23 |
---|---|
도서 바코드 데이터 추출 알고리즘 (2) | 2016.01.27 |
[프로그래밍, 자료구조] 큐(Queue) (2) | 2014.08.25 |
2048 ver 1.1 (0) | 2014.06.04 |
Fibonacci number (0) | 2014.06.04 |