2048——Java控制台版本

举报
红目香薰 发表于 2022/01/21 22:22:53 2022/01/21
【摘要】 前情提要,祝2021年的蓝桥杯小伙伴成绩突出。 贪心、杂凑、递归、分类、评分、哈希、共识、聚类、分治、启发式、粒子群、最大期望、最小完成时间、序列最小优化。。。。算法无数,但是基础类似,无非坐标处理。那么开启一个坐标小游戏2048吧~ 一个简单的2048小游戏的操作提示——Java控制台版本: import java.uti...

前情提要,祝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);
      		}
      	}
      }
  
 

玩法示例:输入大小写均可。

文章来源: laoshifu.blog.csdn.net,作者:红目香薰,版权归原作者所有,如需转载,请联系作者。

原文链接:laoshifu.blog.csdn.net/article/details/117385909

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。