자바 미니 게임 2048 실현

9987 단어 javaSE 학습 정리
수업 시간 에 한 여자 어린이 신발 이 2048 이라는 게임 을 하 는 것 을 보 았 는데 사실은 게임 을 하 는 것 이 매우 지루 하 다 고 생각 했다.
올 라 가서 그녀 에 게 말 했다. "이게 뭐 가 재 밌 어! 너무 유치 해. 내 가 다 쓸 수 있어." 
그녀 가 한 마디 할 줄 누가 알 았 겠 는가? "그래, 네가 쓰 면 내 가 너의 것 을 가지 고 놀 고 이것 을 하지 않 을 거 야!"
미녀 가 입 을 열 었 으 니 쓰 지 않 기 가 미안 하 다!가서 6 시간 걸 려 서 PC 버 전 2048 을 썼어 요. 
더 이상 핸드폰 으로 놀 수 는 없 지만 까 불 었 어 요. 사실 쉬 워 요.
2 차원 배열 로 4 방향 으로 덧셈 을 해서 빈 위치 에 무 작위 2 가 나 오 면 됩 니 다.
알고리즘 이 어디 에 시간 을 좀 지체 하 였 는 지, 주로 인터페이스 가 번 거 로 운 것 이다.
코드 공유!
주 창
package jyy.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MainFrame extends JFrame {
	public static JPanel viewJp;
	public static Graphics g;
	JPanel controlJP = new JPanel();
	public int[][] map =new int[4][4];
	public int SIZE = 100;
	public int posY = 0;
	public int posX = 0;

	public MainFrame() {
		this.setTitle("   2048");
		this.setLayout(null);
		initControlJp();
		initViewJp();
		this.setSize(450, 520);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	public void initViewJp() {

		viewJp = new JPanel() {
			@Override
			public void paint(Graphics g) {
				flash(g);
			}
		};

		viewJp.setBounds(0, 50, 480, 480);
		this.add(viewJp);
	}

	public void initControlJp() {
		
		JLabel jl=new JLabel("   2048");
		jl.setFont(new Font("    ", Font.PLAIN, 26));
		jl.setBounds(160, 10, 300, 40);
		controlJP.setBounds(0, 0, 480, 50);
		controlJP.setLayout(null);
		controlJP.add(jl);
		this.add(controlJP);
	}

	/**
	 *   Map    
	 * 
	 * @param g
	 */
	public void flash(Graphics g) {
		g.setColor(new Color(250, 248, 239));
		g.fillRect(0, 0, 450, 450);
		g.setFont(new Font("    ", Font.BOLD, 25));
		for (int y = 0; y < map.length; y++) {
			for (int x = 0; x < map.length; x++) {

				if (map[y][x] == 0) {
					g.setColor(Color.white);
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);
				}
				else if (map[y][x] == 2) {
					g.setColor(new Color(220, 210, 199));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);

				}
				else if (map[y][x] == 4) {
					g.setColor(new Color(225, 229, 189));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);

				}
				else if (map[y][x] == 8) {
					g.setColor(new Color(225, 142, 109));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);

				}
				else if (map[y][x] == 16) {
					g.setColor(new Color(254, 112, 84));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);

				}
				else if (map[y][x] == 32) {
					g.setColor(new Color(244, 122, 94));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);

				}
				else if (map[y][x] == 64) {
					g.setColor(new Color(238, 91, 61));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);

				}
				else if (map[y][x] == 128) {
					g.setColor(new Color(238, 207, 107));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);

				}
				else if (map[y][x] == 256) {
					g.setColor(new Color(238, 205, 88));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);

				}
				else if (map[y][x] == 512) {
					g.setColor(new Color(239, 201, 68));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);

				}
				else if (map[y][x] == 1024) {
					g.setColor(new Color(238, 198, 50));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);

				}
				else if (map[y][x] == 2048) {
					g.setColor(new Color(238, 196, 30));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);

				}else {
					g.setColor(new Color(60, 220, 0));
					g.fillRoundRect(x * SIZE + (x * 5) + 5, y * SIZE + (y * 5)
							+ 5, SIZE, SIZE, 10, 10);
				}

				g.setColor(Color.black);
				if (map[y][x] != 0) {

					g.drawString(map[y][x] + "", x * SIZE + (x * 5) + 25, y
							* SIZE + (y * 5) + 65);
				}
				System.out.print(map[y][x] + "\t");
			}
			System.out.println();
		}
		System.out.println("------------------------------------");
	}

	public void addListener(KeyListener listener) {
		this.addKeyListener(listener);
	}

}

컨트롤 러
package jyy.control;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;

import jyy.view.MainFrame;

public class GameControl implements KeyListener {
	Random r = new Random();
	MainFrame mf;
	int SCOPE = 4;
	final private int LEFT = 37;
	final private int UP = 38;
	final private int RIGHT = 39;
	final private int DOWN = 40;

	/**
	 *         
	 */

	public void newGame() {
		mf = new MainFrame();
		flashMap(mf.map);
		mf.repaint();
		mf.addListener(this);
	}

	/**
	 *                   2
	 * 
	 * @param map
	 */
	private void flashMap(int[][] map) {
		ArrayList temp = new ArrayList();
		for (int x = 0; x < map.length; x++) {
			for (int y = 0; y < map.length; y++) {
				if (map[x][y] == 0) {
					temp.add(x + "," + y);
				}
			}
		}
		//  size  0           
		if (temp.size() != 0) {
			int index = r.nextInt(temp.size());
			int posX = Integer.parseInt(temp.get(index).split(",")[0]);
			int posY = Integer.parseInt(temp.get(index).split(",")[1]);
			map[posX][posY] = 2;
			mf.map = map;
		} else {
			System.out.println("    !");
			System.exit(1);
		}
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	/**
	 *     
	 */
	public void keyPressed(KeyEvent e) {
		move(e.getKeyCode());
		flashMap(mf.map);
		mf.repaint();
	}

	private void move(int keyCode) {
		switch (keyCode) {
		case LEFT:
			moveLeft();
			break;
		case RIGHT:
			moveRight();
			break;
		case UP:
			moveUp();
			break;
		case DOWN:
			moveDown();
			break;
		}
	}

	private void moveDown() {
		System.out.println("      ");
		for (int x = 0; x < SCOPE; x++) {
			//                 
			for (int y =SCOPE-2; y >-1; y--) {
				//           0       
				if (mf.map[y][x] == 0) {
					continue;
				}
				int point = findUpDownPoint(x, y, DOWN);

				int temp = mf.map[y][x];
				//                           
				if (mf.map[point][x] == 0 || point == y) {
					mf.map[y][x] = 0;
					mf.map[point][x] = temp;
					//                          
				} else {
					mf.map[y][x] = 0;
					mf.map[point][x] = temp * 2;
				}
			}
		}

	}

	private void moveUp() {
		System.out.println("      ");
		for (int x = 0; x < SCOPE; x++) {
			//                 
			for (int y = 1; y  -1; i--) {
				if (mf.map[i][x] == 0 || mf.map[i][x] == mf.map[y][x]) {
					point = i;
					continue;
				} else {
					if (point == null) {
						return y;
					} else {
						return point;
					}
				}
			}
		} else if (direction == DOWN) {
			//              
			for (int i = y + 1; i < SCOPE; i++) {
				if (mf.map[i][x] == 0 || mf.map[i][x] == mf.map[y][x]) {
					point = i;
					continue;
				} else {
					if (point == null) {
						return y;
					} else {
						return point;
					}
				}
			}
		}
		//            
		if (point == null) {
			return y;
		} else {
			return point;
		}
	}

	private void moveRight() {
		System.out.println("      ");
		for (int y = 0; y < SCOPE; y++) {
			//                
			for (int x = SCOPE - 1; x > -1; x--) {
				//           0       
				if (mf.map[y][x] == 0) {
					continue;
				}
				int point = findRightLeftPoint(x, y, RIGHT);

				int temp = mf.map[y][x];
				//                           
				if (mf.map[y][point] == 0 || point == x) {
					mf.map[y][x] = 0;
					mf.map[y][point] = temp;
					//                          
				} else {
					mf.map[y][x] = 0;
					mf.map[y][point] = temp * 2;
				}
			}
		}

	}

	private void moveLeft() {
		System.out.println("      ");
		for (int y = 0; y < SCOPE; y++) {
			//                       
			for (int x = 1; x < SCOPE; x++) {
				//           0       
				if (mf.map[y][x] == 0) {
					continue;
				}
				int point = findRightLeftPoint(x, y, LEFT);
				int temp = mf.map[y][x];

				//                           
				if (mf.map[y][point] == 0 || point == x) {
					mf.map[y][x] = 0;
					mf.map[y][point] = temp;
					//                          
				} else {
					mf.map[y][x] = 0;
					mf.map[y][point] = temp * 2;
				}
			}
		}
	}

	private int findRightLeftPoint(int x, int y, int direction) {
		Integer point = null;
		if (direction == LEFT) {
			//              
			for (int i = x - 1; i > -1; i--) {
				if (mf.map[y][i] == 0 || mf.map[y][i] == mf.map[y][x]) {
					point = i;
					continue;
				} else {
					if (point == null) {
						return x;
					} else {
						return point;
					}
				}
			}
		} else if (direction == RIGHT) {
			//              
			for (int i = x + 1; i < SCOPE; i++) {
				if (mf.map[y][i] == 0 || mf.map[y][i] == mf.map[y][x]) {
					point = i;
					continue;
				} else {
					if (point == null) {
						return x;
					} else {
						return point;
					}
				}
			}
		}
		//            
		if (point == null) {
			return x;
		} else {
			return point;
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub

	}

}

좋은 웹페이지 즐겨찾기