package game2048;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class GameView {
private static final int jframeWidth = 405;//窗口宽高
private static final int jframeHeight = 530;
private static int score = 0;
Font topicFont = new Font("微软雅黑", Font.BOLD, 50);//主题字体
Font scoreFont = new Font("微软雅黑", Font.BOLD, 28);//得分字体
Font explainFont = new Font("宋体", Font.PLAIN, 20);//提示字体
private JFrame jframeMain;
private JLabel jlblTitle;
private JLabel jlblScoreName;
private JLabel jlblScore;
private JLabel jlblTip;
private GameBoard gameBoard;
public GameView() {
init();
}
public void init() {
//1、创建窗口
jframeMain = new JFrame("2048小游戏");
jframeMain.setSize(jframeWidth, jframeHeight);
jframeMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframeMain.setLocationRelativeTo(null);//窗口显示位置居中
jframeMain.setResizable(false);
jframeMain.setLayout(null);//设置绝对布局,以便后面可以用setBounds设置位置
jlblTitle = new JLabel("2048", JLabel.CENTER);
jlblTitle.setFont(topicFont);
jlblTitle.setForeground(Color.BLACK);
jlblTitle.setBounds(50, 0, 150, 60);
jframeMain.add(jlblTitle);
//2、框架窗口搭建好,则需向里面开始添加内容
//设置字体及其颜色、位置
jlblScoreName = new JLabel("得 分", JLabel.CENTER);
jlblScoreName.setFont(scoreFont);
jlblScoreName.setForeground(Color.WHITE);
jlblScoreName.setOpaque(true);
jlblScoreName.setBackground(Color.GRAY);
jlblScoreName.setBounds(250, 0, 120, 30);
jframeMain.add(jlblScoreName);
//3、得分区(得分名+分数)
jlblScore = new JLabel("0", JLabel.CENTER);
jlblScore.setFont(scoreFont);
jlblScore.setForeground(Color.WHITE);
jlblScore.setOpaque(true);
jlblScore.setBackground(Color.GRAY);
jlblScore.setBounds(250, 30, 120, 30);
jframeMain.add(jlblScore);
//4、提示说明区
jlblTip = new JLabel("操作: ↑ ↓ ← →, 按ENTER键重新开始 ",
JLabel.CENTER);
jlblTip.setFont(explainFont);
jlblTip.setForeground(Color.DARK_GRAY);
jlblTip.setBounds(0, 60, 400, 40);
jframeMain.add(jlblTip);
//5、主游戏面板区
gameBoard = new GameBoard();
gameBoard.setBounds(0, 100, 400, 400);
gameBoard.setBackground(Color.GRAY);
gameBoard.setFocusable(true);//焦点即当前正在操作的组件,也就是移动的数字
gameBoard.setLayout(new FlowLayout());
jframeMain.add(gameBoard);
}
public void showView() {
jframeMain.setVisible(true);
}
// 游戏面板
class GameBoard extends JPanel implements KeyListener {
private static final int CHECK_GAP = 10;//方格之间的间隙
private static final int CHECK_SIZE = 85;//方格大小
private static final int CHECK_ARC = 20;//方格弧度
private Check[][] checks = new Check[4][4];
private boolean isadd = true;
public GameBoard() {
initGame();
addKeyListener(this);
}
private void initGame() {
score = 0;
for (int indexRow = 0; indexRow < 4; indexRow++) {
for (int indexCol = 0; indexCol < 4; indexCol++) {
checks[indexRow][indexCol] = new Check();
}
}
// 最开始时生成两个数
isadd = true;
createCheck();
isadd = true;
createCheck();
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_ENTER:
initGame();//重新开始游戏(初始化游戏)
break;
case KeyEvent.VK_LEFT:
moveLeft();
createCheck();//调用一次方法创建一个方格数字
judgeGameOver();//创建后判断是否GameOver,若所有格子均满即跳出GameOver
break;
case KeyEvent.VK_RIGHT:
moveRight();
createCheck();
judgeGameOver();
break;
case KeyEvent.VK_UP:
moveUp();
createCheck();
judgeGameOver();
break;
case KeyEvent.VK_DOWN:
moveDown();
createCheck();
judgeGameOver();
break;
case KeyEvent.VK_ESCAPE:
System.exit(1);
break;
default:
break;//按其他键没有反应
}
repaint();//刷新,会自动调用paint()方法,重新绘制移动后的图
}
private void createCheck() {
List<Check> list = getEmptyChecks();
if (!list.isEmpty() && isadd) {
Random random = new Random();
int index = random.nextInt(list.size());
Check check = list.get(index);
// 2, 4出现概率3:1
int randomValue = random.nextInt(4);
check.value = (randomValue % 3 == 0 || randomValue % 3 == 1) ? 2 : 4;//只有[0,4)中的2才能生成4
isadd = false;
}
}
// 获取空白方格
private List<Check> getEmptyChecks() {
List<Check> checkList = new ArrayList<>();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (checks[i][j].value == 0) {
checkList.add(checks[i][j]);
}
}
}
return checkList;
}
//是否全部格子占满,全部占满则GameOver
private boolean judgeGameOver() {
jlblScore.setText(score + "");
if (!getEmptyChecks().isEmpty()) {
return false;
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
//判断是否存在可合并的方格
if (checks[i][j].value == checks[i][j + 1].value
|| checks[i][j].value == checks[i + 1][j].value) {
return false;
}
}
}
return true;
}
private void moveLeft() {
//找到一个非空格子后checks[i][j].value > 0,可分为三种情况处理
for (int i = 0; i < 4; i++) {
for (int j = 1, index = 0; j < 4; j++) {
if (checks[i][j].value > 0) {
//第一种情况:checks[i][j](非第1列)与checks[i][index]的数相等,则合并乘以2,且得分增加
if (checks[i][j].value == checks[i][index].value) {
score += checks[i][index].value *= 2;
checks[i][j].value = 0;
isadd = true;
} else if (checks[i][index].value == 0) {
//第二种:若checks[i][index]为空格子,checks[i][j]就直接移到最左边checks[i][index]
checks[i][index].value = checks[i][j].value;
checks[i][j].value = 0;
isadd = true;
} else if (checks[i][++index].value == 0) {
//第三种:若checks[i][index]不为空格子,并且数字也不相等,若其旁边为空格子,则移到其旁边
checks[i][index].value = checks[i][j].value;
checks[i][j].value = 0;
isadd = true;
}
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
java小游戏(贪吃蛇、2048、石头剪刀布)
共127个文件
class:17个
sample:10个
java:9个
需积分: 0 0 下载量 98 浏览量
2022-12-06
18:27:55
上传
评论
收藏 21.32MB ZIP 举报
温馨提示
java小游戏 贪吃蛇、2048、石头剪刀布
资源推荐
资源详情
资源评论
收起资源包目录
java小游戏(贪吃蛇、2048、石头剪刀布) (127个子文件)
0e724c68c5c28ce8e33b202899ade246c63912 2KB
100ba599d2dca004d95c24c37cffec20166309 145B
1942152763e9359e05977175de41ddf77be932 19KB
23c5c2a24092e69293a89eba697d6804a5ccf5 2KB
265a87ad10116d9bcdcdb564b48564b3f800e7 49B
26cb1406f8907c3e9b00278d776783065ea098 80B
2789938342b58766c5e861f9d71709a44aad0b 135B
2f03a57406449ac3a7e5a76e7233e7b0af38b1 805B
3042ba6059e9c95b02721870e6056a20527d41 27B
397b5ef70e8cf64642e1b79b72277982038eee 792B
39e03a92815b7f838a6287e09e5fa4a3b66376 167B
3aa651718e5e4238853d95a12e5ea76ab70b49 140B
3d9cb0d9571c87697a5e46e53ffa5149a73169 56B
43a304df22a0f37dc0ca1de7e233f41df5fe02 201B
479424e97cfe98a8a80669aefc53e638e56c2e 7KB
48d9af076705e7fcaf249e045cbcb4ae07335f 120B
49a1dfeb12abc198af51cda443539efa90849a 65B
52d079d8b53a67bcc50dd2e978fd7c3108fada 140B
575ab4d19b877b71b60b986db198c95b1370c6 176KB
5b8de7ae53fa73733d3b5a6eb4f9d61cc5309a 166B
5d693d3e5b8156c1af3a0b3b3c3cf75e6d5fbe 383B
5dee64bcfb48793379b200a1afd14e85a8aaf4 21B
61477db5979191cdbb62f065eb7ecbceafbcad 4KB
65e7604eb7d18fde8d43bf6fe4e030becca22b 172B
67db82673c33bc87cda1bd96a9d476875a9384 54B
75d01ab9ba6b9d9a5cdeb594e6884cc32159e3 10.09MB
76bcbe2165eb6d145601770521282c205dbd24 1KB
78547f223bf8b6bf26991777c419f8acd1c5ff 434B
7c8cbdce22968a75b89f3bad757b6ac230d254 4KB
7dd77cd09aa803af0e1eb04fa9cd4d1964f46b 400B
825dc642cb6eb9a060e54bf8d69288fbee4904 15B
8366452ecf5c6623e32036c0a07d84d780e6db 1KB
84abb20a77610e126ed31a8d4475985cbda1ed 52B
8b3abd635e5ca2368745df36c2a7dccaba64c2 620B
94fe74e49fcdd6a154129cd0bc1238fab709b2 760B
954e825e10166bdbc5ebccb305c2675b095de4 50B
9ab7435519f4dc0c3630babd899b93a98ecf33 442B
9c8b8019fa7a9c2ffcd5abb99a16e89908390f 191KB
a01aeee22026a2ddd02f714eda4e3a03a48c34 56B
aaa161ec0f31dfd10f7b0941bdac95d592dc24 846B
aaa74d26edc58ff6953e958486f70bf1fb0444 451B
ab05815dc6fdc2df3852de06d3818bbb80ff6d 154B
adc254822ae2a2844f8838269a2ae046fd923a 61KB
ae735b9ae8fd82e29cdcffc6f9470d2b7563c3 595B
b68ef10d49f67a9b6073c80a36b1cb6946118b 85B
b718c588cdd71b6bdb3e66583902f09c7ce841 144B
bc29cde0c75edc0072fce92663681bd2cff5f5 53B
bee6f1a99299233476252133d74c94044a0f5a 27B
c8ae0b899de123da3ed9146479f921e34f0459 537B
ced62c1646367060c863cea1e408d2b85d9d29 311B
GameView$GameBoard.class 7KB
Snake.class 3KB
GameView.class 3KB
SnakeGrid.class 2KB
Check.class 2KB
Main.class 2KB
Button$3.class 1KB
SnakeGame.class 1KB
Button.class 1KB
SnakeGrid$SnakeThread.class 1KB
Food.class 970B
Button$2.class 878B
Snake$Node.class 827B
Button$4.class 712B
SnakeGrid$1.class 700B
Button$1.class 689B
MainGame.class 448B
config 311B
d1588299c02fe12e5bf315449e614e1fe559fe 525B
d43c1eb2d58c4390992ae2f6842a6795a570ef 968B
d5937b7dc2405e1eced6f4ebc895cd940d8bca 171B
da41c0172667b094653321711e02a52bc80a13 580B
description 73B
e15b09468c7848afea80f68902d968515f8fc9 636B
e3ea72bf1235004f2fa6cad7ae7404b994a738 974B
e74259bf0881c732cafa803341c623300e4a6e 166B
e7afac6c895c697baebb44584b2bbc670f7ff1 85B
e886a08d42bcb90c6c1f6ea007ec77f3721090 2KB
ea81a4028721127dd19e16ee7b1e1f821a58f3 647B
exclude 250B
f43b27a222fd7d9a76d34af3219b048a03eabf 80B
FETCH_HEAD 99B
.gitignore 227B
.gitignore 11B
HEAD 176B
HEAD 176B
HEAD 32B
HEAD 23B
2048.ico 264KB
java-games.iml 423B
index 2KB
GameView.java 13KB
Snake.java 4KB
SnakeGrid.java 2KB
Check.java 2KB
Button.java 2KB
Main.java 1KB
SnakeGame.java 1KB
Food.java 634B
MainGame.java 164B
共 127 条
- 1
- 2
资源评论
oNuoyi
- 粉丝: 157
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功