자바 미니 게임 2048 실현
9987 단어 javaSE 학습 정리
올 라 가서 그녀 에 게 말 했다. "이게 뭐 가 재 밌 어! 너무 유치 해. 내 가 다 쓸 수 있어."
그녀 가 한 마디 할 줄 누가 알 았 겠 는가? "그래, 네가 쓰 면 내 가 너의 것 을 가지 고 놀 고 이것 을 하지 않 을 거 야!"
미녀 가 입 을 열 었 으 니 쓰 지 않 기 가 미안 하 다!가서 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
}
}