【Java】用JAVA实现2048小游戏

用JAVA实现2048小游戏

  • 前言
  • 一、代码
    • 运行结果
    • *

前言

今天给大家分享一个简单的游戏——2048,想必大家平常都玩过这款,那么今天我就给大家分享一下这游戏的代码吧。下面直接给大家上代码展示!!

一、代码

`package com.company;

import java.awt.*;

import java.awt.event.*;

import java.util.Random;

import javax.swing.*;

//继承 JPanel 用于我们游戏界面布局

//tips:JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类

/**

* 2048小游戏

* 游戏玩法:通过上下左右方向键移动图块,使得数字合出2048则获胜

*/

public class Game2048 extends JPanel {

//枚举:开始,获胜,正在进行游戏,游戏结束

enum State {

start, won, running, over

}

final Color[] colorTable = {

new Color(0x701710), new Color(0xFFE4C3), new Color(0xfff4d3),

new Color(0xffdac3), new Color(0xe7b08e), new Color(0xe7bf8e),

new Color(0xffc4c3), new Color(0xE7948e), new Color(0xbe7e56),

new Color(0xbe5e56), new Color(0x9c3931), new Color(0x701710)};

final static int target = 2048;//游戏最终目标

static int higheNum;//最高数

static int score;

private Color gridColor = new Color(0xBBADA0);//网格颜色

private Color emptyColor = new Color(0xCDC1B4);//没有图块的格子的颜色

private Color startColor = new Color(0xFFEBCD);//开始界面框的颜色

private Random rand = new Random();

private Tile[][] tiles;

private int side = 4;

private State gamestate = State.start;

private boolean checkingAvailableMoves;

public Game2048() {

setPreferredSize(new Dimension(900, 700));

setBackground(new Color(0xFAF8EF));

setFont(new Font("SansSerif", Font.BOLD, 48));

setFocusable(true);

addMouseListener(new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e) {

startGame();

repaint();

}

});

addKeyListener(new KeyAdapter() {

@Override

public void keyPressed(KeyEvent e) {

switch (e.getKeyCode()) {

case KeyEvent.VK_UP:

moveUp();

break;

case KeyEvent.VK_DOWN:

moveDown();

break;

case KeyEvent.VK_LEFT:

moveLeft();

break;

case KeyEvent.VK_RIGHT:

moveRight();

break;

}

repaint();

}

});

}

//复写JPanel里面的paintComponent方法,创建一个我们自己想要的界面

@Override

public void paintComponent(Graphics gg) {

super.paintComponent(gg);

Graphics2D g = (Graphics2D) gg;

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

drawGrid(g);

}

//开始游戏

void startGame() {

if (gamestate != State.running) {

score = 0;

higheNum = 0;

gamestate = State.running;

tiles = new Tile[side][side];

//执行两次,生成两个随机数

addRandomTile();

addRandomTile();

}

}

//生成框及里面内容

void drawGrid(Graphics2D g) {

g.setColor(gridColor);

g.fillRoundRect(200, 100, 499, 499, 15, 15);

if (gamestate == State.running) {

for (int r = 0; r < side; r++) {

for (int c = 0; c < side; c++) {

if (tiles[r][c] == null) {

g.setColor(emptyColor);

g.fillRoundRect(215 + c * 121, 115 + r * 121, 106, 106, 7, 7);

} else {

drawTile(g, r, c);

}

}

}

} else {

g.setColor(startColor);

g.fillRoundRect(215, 115, 469, 469, 7, 7);

g.setColor(gridColor.darker());//设置一个比当前颜色深一级的Color

g.setFont(new Font("SansSerif", Font.BOLD, 128));

g.drawString("2048", 310, 270);

g.setFont(new Font("SansSerif", Font.BOLD, 20));

if (gamestate == State.won) {

g.drawString("恭喜你,你成功得到2048!!", 330, 350);

} else if (gamestate == State.over)

g.drawString("你失败了,请重新开始游戏", 330, 350);

g.setColor(gridColor);

g.drawString("开始游戏", 390, 470);

g.drawString("tips:使用上下左右箭头移动图块", 310, 530);

}

}

void drawTile(Graphics2D g, int r, int c) {

int value = tiles[r][c].getValue();

g.setColor(colorTable[(int) (Math.log(value) / Math.log(2)) + 1]);

g.fillRoundRect(215 + c * 121, 115 + r * 121, 106, 106, 7, 7);

String s = String.valueOf(value);

g.setColor(value < 128 ? colorTable[0] : colorTable[1]);

FontMetrics fm = g.getFontMetrics();

int asc = fm.getAscent();

int dec = fm.getDescent();

int x = 215 + c * 121 + (106 - fm.stringWidth(s)) / 2;

int y = 115 + r * 121 + (asc + (106 - (asc + dec)) / 2);

g.drawString(s, x, y);

}

private void addRandomTile() {

int pos = rand.nextInt(side * side);

int row, col;

do {

pos = (pos + 1) % (side * side);

row = pos / side;

col = pos % side;

} while (tiles[row][col] != null);

int val = rand.nextInt(10) == 0 ? 4 : 2;

tiles[row][col] = new Tile(val);

}

private boolean move(int countDownFrom, int yIncr, int xIncr) {

boolean moved = false;

for (int i = 0; i < side * side; i++) {

int j = Math.abs(countDownFrom - i);

int r = j / side;

int c = j % side;

if (tiles[r][c] == null)

continue;

int nextR = r + yIncr;

int nextC = c + xIncr;

while (nextR >= 0 && nextR < side && nextC >= 0 && nextC < side) {

Tile next = tiles[nextR][nextC];

Tile curr = tiles[r][c];

if (next == null) {

if (checkingAvailableMoves)

return true;

tiles[nextR][nextC] = curr;

tiles[r][c] = null;

r = nextR;

c = nextC;

nextR += yIncr;

nextC += xIncr;

moved = true;

} else if (next.canMergeWith(curr)) {

if (checkingAvailableMoves)

return true;

int value = next.mergeWith(curr);

if (value > higheNum)

higheNum = value;

score += value;

tiles[r][c] = null;

moved = true;

break;

} else

break;

}

}

if (moved) {

if (higheNum < target) {

clearMerged();

addRandomTile();

if (!movesAvailable()) {//如果不能再移动图块,则则把游戏状态变成游戏失败

gamestate = State.over;

}

} else if (higheNum == target)//如果最高数=2048,则把游戏状态变成游戏成功

gamestate = State.won;

}

return moved;

}

boolean moveUp() {

return move(0, -1, 0);

}

boolean moveDown() {

return move(side * side - 1, 1, 0);

}

boolean moveLeft() {

return move(0, 0, -1);

}

boolean moveRight() {

return move(side * side - 1, 0, 1);

}

void clearMerged() {

for (Tile[] row : tiles)

for (Tile tile : row)

if (tile != null)

tile.setMerged(false);

}

//判断是否还能继续移动图块

boolean movesAvailable() {

checkingAvailableMoves = true;

boolean hasMoves = moveUp() || moveDown() || moveLeft() || moveRight();

checkingAvailableMoves = false;

return hasMoves;

}

public static void main(String[] args) {

SwingUtilities.invokeLater(() -> {

JFrame f = new JFrame();

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.setTitle("2048小游戏");

f.setResizable(true);

f.add(new Game2048(), BorderLayout.CENTER);

f.pack();

f.setLocationRelativeTo(null);

f.setVisible(true);

});

}

}

class Tile {

private boolean merged;

private int value;

Tile(int val) {

value = val;

}

boolean canMergeWith(Tile other) {

return !merged && other != null && !other.merged && value == other.getValue();

}

int mergeWith(Tile other) {

if (canMergeWith(other)) {

value *= 2;

merged = true;

return value;

}

return -1;

}

//set get

int getValue() {

return value;

}

void setMerged(boolean m) {

merged = m;

}

}`

* 1

* 2

* 3

* 4

* 5

* 6

* 7

* 8

* 9

* 10

* 11

* 12

* 13

* 14

* 15

* 16

* 17

* 18

* 19

* 20

* 21

* 22

* 23

* 24

* 25

* 26

* 27

* 28

* 29

* 30

* 31

* 32

* 33

* 34

* 35

* 36

* 37

* 38

* 39

* 40

* 41

* 42

* 43

* 44

* 45

* 46

* 47

* 48

* 49

* 50

* 51

* 52

* 53

* 54

* 55

* 56

* 57

* 58

* 59

* 60

* 61

* 62

* 63

* 64

* 65

* 66

* 67

* 68

* 69

* 70

* 71

* 72

* 73

* 74

* 75

* 76

* 77

* 78

* 79

* 80

* 81

* 82

* 83

* 84

* 85

* 86

* 87

* 88

* 89

* 90

* 91

* 92

* 93

* 94

* 95

* 96

* 97

* 98

* 99

* 100

* 101

* 102

* 103

* 104

* 105

* 106

* 107

* 108

* 109

* 110

* 111

* 112

* 113

* 114

* 115

* 116

* 117

* 118

* 119

* 120

* 121

* 122

* 123

* 124

* 125

* 126

* 127

* 128

* 129

* 130

* 131

* 132

* 133

* 134

* 135

* 136

* 137

* 138

* 139

* 140

* 141

* 142

* 143

* 144

* 145

* 146

* 147

* 148

* 149

* 150

* 151

* 152

* 153

* 154

* 155

* 156

* 157

* 158

* 159

* 160

* 161

* 162

* 163

* 164

* 165

* 166

* 167

* 168

* 169

* 170

* 171

* 172

* 173

* 174

* 175

* 176

* 177

* 178

* 179

* 180

* 181

* 182

* 183

* 184

* 185

* 186

* 187

* 188

* 189

* 190

* 191

* 192

* 193

* 194

* 195

* 196

* 197

* 198

* 199

* 200

* 201

* 202

* 203

* 204

* 205

* 206

* 207

* 208

* 209

* 210

* 211

* 212

* 213

* 214

* 215

* 216

* 217

* 218

* 219

* 220

* 221

* 222

* 223

* 224

* 225

* 226

* 227

* 228

* 229

* 230

* 231

* 232

* 233

* 234

* 235

* 236

* 237

* 238

* 239

* 240

* 241

* 242

* 243

* 244

* 245

* 246

* 247

* 248

* 249

* 250

* 251

* 252

* 253

* 254

* 255

* 256

* 257

* 258

* 259

* 260

* 261

* 262

* 263

* 264

* 265

* 266

* 267

* 268

* 269

* 270

* 271

* 272

* 273

* 274

* 275

* 276

* 277

* 278

* 279

* 280

运行结果

1.开始界面
【Java】用JAVA实现2048小游戏
2.游戏界面
【Java】用JAVA实现2048小游戏
3.失败后界面
【Java】用JAVA实现2048小游戏

以上是 【Java】用JAVA实现2048小游戏 的全部内容, 来源链接: utcz.com/a/96089.html

回到顶部