package com.daliu.game2048;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.Scanner;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Game2048 extends JPanel {
static int[][] wall = new int[4][4];
private static BufferedImage background;
static {
try {
background = ImageIO.read(Game2048.class.getResource("game.jpg"));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Random r = new Random();
int i = r.nextInt(4);
int j = r.nextInt(4);
wall[i][j] = 2;
int i1 = r.nextInt(4);
int j1 = r.nextInt(4);
wall[i1][j1] = 2;
if (i1 == i && j1 == j) {
wall[i1][j1] = 4;
do {
i = r.nextInt(4);
j = r.nextInt(4);
wall[i][j] = 2;
} while (i1 == i && j1 == j);
}
JFrame frame = new JFrame("2048");
// JPanel panel = new JPanel();
Game2048 tetris = new Game2048();
tetris.setBackground(Color.black);
frame.add(tetris);
frame.setSize(535, 585);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame 在显示的时候, 会尽快调用panel的
// paint方法绘制显示界面效果
frame.setVisible(true);
// main方法中调用, 软件的开始方法
tetris.action();
print(wall);
while (true) {
System.out.print("输入4左,输入2下,输入6右,输入8上");
Scanner s = new Scanner(System.in);
int key = s.nextInt();
switch (key) {
case 8:
moveup(wall);
break;
case 6:
moveRight(wall);
break;
case 2:
moveDrop(wall);
break;
case 4:
moveLeft(wall);
break;
}
print(wall);
}
}
public void action() {
// 1) 实现键盘监听接口,创建监听器(Listener)对象
KeyListener l = new KeyListener() {
/** 按键按下时候执行的方法 */
//int i = 0;
public void keyPressed(KeyEvent e) {
// long time = e.getWhen();
int key = e.getKeyCode();
// System.out.println("按下了!");
switch (key) {
case KeyEvent.VK_RIGHT:
Game2048.moveRight(wall);//this.
break;
case KeyEvent.VK_LEFT:
Game2048.moveLeft(wall);//this.
break;
case KeyEvent.VK_DOWN:
Game2048.moveDrop(wall);//this.
break;
case KeyEvent.VK_UP:
Game2048.moveup(wall);//this.
break;
}
// 是JPanel的方法: 尽快执行paint()
repaint();// 重绘界面
}
/** 按键抬起时候执行的方法 */
public void keyReleased(KeyEvent e) {
}
/** 字母按键输入了以后候执行的方法 */
public void keyTyped(KeyEvent e) {
}
};
// 2) 在当前面板上注册监听器对象
this.addKeyListener(l);
// 为当前面板获取输入焦点,有焦点才能获取键盘
// 输入的消息
this.setFocusable(true);
this.requestFocus();
// 3) 等待键盘消息,
// 如果有按键按下将执行监听器对象中的方法.
}
private static void moveLeft(int[][] matrix) {
int a = 0, d = 0;
boolean c = true;
for (int b = 0; b < 4; b++) {
if (matrix[b][a] != 0)
d++;
if (d >= 3)
c = false;
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
// 当前位置的数字是不是0,
// 如果是0从左侧找到非0的数字
// 做交换
if (matrix[j][i] == 0) {
for (int k = i + 1; k < 4; k++) {
if (matrix[j][k] != 0) {
c = true;
matrix[j][i] = matrix[j][k];
matrix[j][k] = 0;
break;
}
}
}
// 检查有没有相同的数字,有相加
for (int k = i + 1; k <= 3; k++) {
if (matrix[j][i] != 0 && matrix[j][i] == matrix[j][k]) {
c = true;
matrix[j][i] *= 2;
matrix[j][k] = 0;
break;
}
else if (matrix[j][k] != 0) { break; }
}
}
}
if (c)
Randm(matrix);
}
private static void moveDrop(int[][] matrix) {
int a = 3, d = 0;
boolean c = true;
for (int b = 3; b >= 0; b--) {
if (matrix[a][b] != 0)
d++;
if (d >= 3)
c = false;
}
for (int i = 3; i >= 0; i--) {
for (int j = 3; j >= 0; j--) {
// 当前位置的数字是不是0,
// 如果是0从左侧找到非0的数字
// 做交换
if (matrix[j][i] == 0) {
for (int k = j - 1; k >= 0; k--) {
if (matrix[k][i] != 0) {
c = true;
matrix[j][i] = matrix[k][i];
matrix[k][i] = 0;
break;
}
}
}
// 检查有没有相同的数字,有相加
for (int k = j - 1; k >= 0; k--) {
if (matrix[j][i] != 0 && matrix[j][i] == matrix[k][i]) {
c = true;
matrix[j][i] *= 2;
matrix[k][i] = 0;
break;
}
else if (matrix[k][i] != 0) { break; }
}
}
}
if (c)
Randm(matrix);
}
private static void moveup(int[][] matrix) {
int a = 0, d = 0;
boolean c = true;
for (int b = 0; b < 4; b++) {
if (matrix[a][b] != 0) {
d = d + 1;
//System.out.println("d=" + d);
}
if (d >= 3)
c = false;
//System.out.println("1" + c);
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
// 当前位置的数字是不是0,
// 如果是0从左侧找到非0的数字
// 做交换
if (matrix[i][j] == 0) {
for (int k = i + 1; k < 4; k++) {
if (matrix[k][j] != 0) {
c = true;
matrix[i][j] = matrix[k][j];
matrix[k][j] = 0;
break;
}
}
}
// 检查有没有相同的数字,有相加
for (int k = i + 1; k <= 3; k++) {
if (matrix[i][j] != 0 && matrix[i][j] == matrix[k][j]) {
c = true;
matrix[i][j] *= 2;
matrix[k][j] = 0;
break;
}
else if (matrix[k][j] != 0) { break; }
}
}
}
//System.out.println("2" + c);
if (c)
Randm(matrix);
}
/**
* 往右移动
*
* @param matrix
* 转过来的数组的引用地址
*/
private static void moveRight(int[][] matrix) {
int a = 0, d = 0;
boolean c = true;
for (int b = 3; b >= 0; b--) {
if (matrix[b][a] != 0)
d++;
if (d >= 3)
c = false;
}
for (int i = 0; i < matrix.length; i++) {
for (int j = 3; j >= 0; j--) {
// 当前位置的数字是不是0,
// 如果是0从左侧找到非0的数字
// 做交换
if (matrix[i][j] == 0) {
for (int k = j - 1; k >= 0; k--) {
if (matrix[i][k] != 0) {
c = true;
matrix[i][j] = matrix[i][k];
matrix[i][k] = 0;
break;
}
}
}
// 检查有没有相同的数字,有相加
for (int k = j - 1; k >= 0; k--) {
if (matrix[i][j] != 0 && matrix[i][j] == matrix[i][k]) {
c = true;
matrix[i][j] *= 2;
matrix[i][k] = 0;
break;
}
else if (matrix[i][k] != 0) { break; }
}
}
}
if (c)
Randm(matrix);
}
private static void Randm(int[][] matrix) {
while (true) {
Random r = new Random();
int a = r.nextInt(4);
int b = r.nextInt(4);
if (matrix[a][b] == 0) {
matrix[a][b] = 2;
break;
}
}
}
private static void print(int[][] matrix) {
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
public void paint(Graphics g) {
// g 是绑定到当前面板的画笔
g.setColor(Color.BLUE);
g.drawString("Hello World", 100, 50);
// draw 绘 paint涂
g.drawImage(background, 0, 0, null);
g.translate(15, 15);
g.setColor(Color.RED);
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 4; y++) {
if (wall[x][y] < 10) {
Font f = new Font(Font.SANS_SERIF, Font.BOLD, 30);
g.setFont(f);
g.setColor(Color.BLACK);
} else if (wall[x][y] > 10 && wall[x][y] < 100) {
Font f = new Font(Font.SANS_SERIF, Font.BOLD, 20);
g.setFont(f);
g.setColor(Color.BLUE);
} else if (wall[x][y] > 100 && wall[x][y] < 1000) {
Font f = new Font(Font.SANS_SERIF, Font.BOLD, 15);
g.setFont(f);
g.setColor(Color.RED);
}else if (wall[x][y] > 1000) {
Font f = new Font(Font.SANS_SERIF, Font.BOLD, 10);
g.setFont(f);
g.setColor(Color.YELLOW);
}
String a = wall[x][y] + "";
g.drawString(a, (y + 1) * 50, (x + 1) * 50);
}
}
}
}
把该图片放到包下,并命名为game.jpg。