Java控制台版本的2048游戏:重新定义游戏体验
最编程
2024-08-15 10:42:11
...
前情提要,祝2021年的蓝桥杯小伙伴成绩突出。
贪心、杂凑、递归、分类、评分、哈希、共识、聚类、分治、启发式、粒子群、最大期望、最小完成时间、序列最小优化。。。。算法无数,但是基础类似,无非坐标处理。那么开启一个坐标小游戏2048吧~
一个简单的2048小游戏的操作提示——Java控制台版本:
import java.util.Random;
import java.util.Scanner;
/**
*
* @author 老师付 2021年5月29日15:05:21
*/
public class Action {
static Random random = new Random();
static Scanner scanner = new Scanner(System.in);
private static boolean isNotFull(int[][] board) {
for (int[] ia : board)
for (int i : ia)
if (i == 0)
return true;
return false;
}
private static void generate(int[][] board) {
assert isNotFull(board);
while (true) {
int number = random.nextInt(16);
int row = number / 4;
int col = number % 4;
if (board[row][col] == 0) {
board[row][col] = System.currentTimeMillis() % 2 == 0 ? 2 : 4;
break;
}
}
}
static int[][] init() {
int[][] numArray = new int[4][4];
generate(numArray);
generate(numArray);
return numArray;
}
static void showBoard(int[][] board) {
for (int[] numArray : board) {
for (int i : numArray) {
if (i == 0) {
System.out.printf("%4s", ".");
} else {
System.out.printf("%4s", i);
}
}
System.out.println();
}
}
static char acceptInput() {
while (true) {
String line = scanner.nextLine().toLowerCase();
char direction = line.charAt(0);
if ("wasdWASD".indexOf(direction) != -1) {
return direction;
}else {
System.out.println("请按要求输入操作指令:");
System.out.println("up:w/W");
System.out.println("left:a/A");
System.out.println("down:s/S");
System.out.println("right:d/D");
}
}
}
static void downBlock(int[][] numArray) {
for (int i = 0; i < 4; i++) {
for (int k = 0; k < 3; k++) {
for (int j = 3; j > 0; j--) {
if (numArray[j][i] == 0) {
numArray[j][i] = numArray[j - 1][i];
numArray[j - 1][i] = 0;
}
}
for (int j = 3; j > 0; j--) {
if (numArray[j][i] == numArray[j - 1][i]) {
numArray[j][i] = 2 * numArray[j][i];
numArray[j - 1][i] = 0;
}
}
}
}
generate(numArray);
}
static void upBlock(int[][] numArray) {
for (int i = 0; i < 4; i++) {
for (int k = 0; k < 3; k++) {
for (int j = 0; j < 3; j++) {
if (numArray[j][i] == 0) {
numArray[j][i] = numArray[j + 1][i];
numArray[j + 1][i] = 0;
}
}
for (int j = 0; j < 3; j++) {
if (numArray[j][i] == numArray[j + 1][i]) {
numArray[j][i] = 2 * numArray[j][i];
numArray[j + 1][i] = 0;
}
}
}
}
generate(numArray);
}
static void leftBlock(int[][] numArray) {
for (int i = 0; i < 4; i++) {
for (int k = 0; k < 3; k++) {
for (int j = 0; j < 3; j++) {
if (numArray[i][j] == 0) {
numArray[i][j] = numArray[i][j + 1];
numArray[i][j + 1] = 0;
}
}
for (int j = 0; j < 3; j++) {
if (numArray[i][j] == numArray[i][j + 1]) {
numArray[i][j] = 2 * numArray[i][j];
numArray[i][j + 1] = 0;
}
}
}
}
generate(numArray);
}
static void rightBlock(int[][] numArray) {
for (int i = 0; i < 4; i++) {
for (int k = 0; k < 3; k++) {
for (int j = 3; j > 0; j--) {
if (numArray[i][j] == 0) {
numArray[i][j] = numArray[i][j - 1];
numArray[i][j - 1] = 0;
}
}
for (int j = 3; j > 0; j--) {
if (numArray[i][j] == numArray[i][j - 1]) {
numArray[i][j] = 2 * numArray[i][j];
numArray[i][j - 1] = 0;
}
}
}
}
generate(numArray);
}
static void process(int[][] board, char direction) {
switch (direction) {
case 'w':
upBlock(board);
break;
case 'a':
leftBlock(board);
break;
case 's':
downBlock(board);
break;
case 'd':
rightBlock(board);
break;
}
}
public static void main(String[] args) {
System.out.println("游戏开始:请按照操作提示游戏:");
System.out.println("up:w/W");
System.out.println("left:a/A");
System.out.println("down:s/S");
System.out.println("right:d/D");
int[][] board = init();
while (true) {
showBoard(board);
char direction = acceptInput();
process(board, direction);
}
}
}
玩法示例:输入大小写均可。
推荐阅读
-
使用Qt实现一个可自定义难度的2048小游戏 [版本:Qt 5.6.2]
-
经典的2048游戏迎来了控制台版本
-
Java控制台版本的2048游戏:重新定义游戏体验
-
Java 8新特性探究(十三)JavaFX 8新特性以及开发2048游戏-JavaFX历史## 跟java在服务器端和web端成绩相比,桌面一直是java的软肋,于是Sun公司在2008年推出JavaFX,弥补桌面软件的缺陷,请看下图JavaFX一路走过来的改进 从上图看出,一开始推出时候,开发者需使用一种名为JavaFX Script的静态的、声明式的编程语言来开发JavaFX应用程序。因为JavaFX Script将会被编译为Java bytecode,程序员可以使用Java代码代替。 JavaFX 2.0之后的版本摒弃了JavaFX Script语言,而作为一个Java API来使用。因此使用JavaFX平台实现的应用程序将直接通过标准Java代码来实现。 JavaFX 2.0 包含非常丰富的 UI 控件、图形和多媒体特性用于简化可视化应用的开发,WebView可直接在应用中嵌入网页;另外 2.0 版本允许使用 FXML 进行 UI 定义,这是一个脚本化基于 XML 的标识语言。 从JDK 7u6开始,JavaFx就与JDK捆绑在一起了,JavaFX团队称,下一个版本将是8.0,目前所有的工作都已经围绕8.0库进行。这是因为JavaFX将捆绑在Java 8中,因此该团队决定跳过几个版本号,迎头赶上Java 8。 ##JavaFx8的新特性 ## ###全新现代主题:Modena 新的Modena主题来替换原来的Caspian主题。不过在Application的start方法中,可以通过setUserAgentStylesheet(STYLESHEET_CASPIAN)来继续使用Caspian主题。 参考http://fxexperience.com/2013/03/modena-theme-update/ ###JavaFX 3D 在JavaFX8中提供了3D图像处理API,包括Shape3D (Box, Cylinder, MeshView, Sphere子类),SubScene, Material, PickResult, LightBase (AmbientLight 和PointLight子类),SceneAntialiasing等。Camera类也得到了更新。从JavaDoc中可以找到更多信息。 ###富文本 强化了富文本的支持 ###TreeTableView ###日期控件DatePicker 增加日期控件 ###用于 CSS 结构的公共 API
-
完美BT版的亚洲王朝-重新体验帝国时代3的Java游戏