JAVA大作业3

代码

package thegreatwork;

import java.util.*;
import java.io.*; /*Board.java
*目的:里面有一些关于如何移动、如何存储、如何生成随机数的函数
*判断游戏是否结束*/
public class Board {
//用final修饰的确定的数值,用来确定随机数的值和游戏面板尺寸大小
public final int NUM_START_TILES = 2;
public final int TWO_PROBABILITY = 90;
public final int GRID_SIZE; private final Random random;
private int[][] grid;
private int score; /*
*在初始化游戏面板生成随机数的构造函数
*/
public Board(int boardSize, Random random) {
this.random = random;
GRID_SIZE = boardSize;
this.score=0;
//初始化一个二维数组
this.grid=new int[boardSize][boardSize];
//让游戏面板一开始就有随机数
for(int i=0;i<NUM_START_TILES;i++){
this.addRandomTile();
} } /*
*获取输入面板字符串和随机值的构造函数
* 这个函数是读取之前的存档,对应gui2048里面的-i输入
*/
public Board(String inputBoard, Random random) throws IOException {
this.random = random;
Scanner input = new Scanner(new File(inputBoard));
//读取尺寸和分数
GRID_SIZE = input.nextInt();
this.score=input.nextInt();
//创建一个新的二维数组来存储这些数据
int[][] grid0=new int[GRID_SIZE][GRID_SIZE];
for(int i=0;i<grid0.length;i++){
for(int j=0;j<grid0[i].length;j++){
grid0[i][j]=input.nextInt();
}
}
//使网格对象指向新输入的数组中
this.grid=grid0;
} /*saveBoard
*把当前游戏面板上的所有信息保存在一个文件里
*/
public void saveBoard(String outputBoard) throws IOException {
//创建流对象用于写入
PrintWriter writer=new PrintWriter(outputBoard);
//打印尺寸和分数
writer.println(GRID_SIZE);
writer.println(this.score);
//用一个循环把数据写入文件
for(int i=0;i<this.grid.length;i++){
for(int j=0;j<this.grid[i].length;j++){
writer.print(this.grid[i][j]+" ");
}
//另起一行
writer.println();
}
writer.close();
} /*addRandomTile
*增加随机的数据来让这个游戏开始
*/
public void addRandomTile() {
//计算数值为0的框
int count=0;
for(int i=0;i<this.grid.length;i++){
for(int j=0;j<this.grid[i].length;j++){
if(this.grid[i][j]==0){
count++;
}
}
}
//如果框已满,则不增加新得随机数
if(count==0){
return;
}
//0和count-1之间取随机数
int location = this.random.nextInt(count);
//0和99之间取随机数
int value = this.random.nextInt(100); count=0;
for(int i=0;i<this.grid.length;i++){
for(int j=0;j<this.grid[i].length;j++){
if(this.grid[i][j]==0){
count++;
//(count-1)=location的概率很小,但是如果一旦等于,就在那个位置防止随机数。
if((count-1)==location){
//如果value<90, 随机生成 2 ,不然的话随机生成 4,大部分情况下生成2.
if(value<TWO_PROBABILITY){
this.grid[i][j]=2;
}
else{
this.grid[i][j]=4;
}
}
}
}
}
} /*rotate
*可以顺时针旋转90度或者逆时针旋转90度
*rotateClockwise是用来决定是顺时针还是逆时针,布尔型
*/
public void rotate(boolean rotateClockwise) {
//创造一个新的数组用来存储一个旋转后的游戏面板
int[][] rotate=new int[GRID_SIZE][GRID_SIZE];
//用来决定是顺时针旋转还是逆时针旋转
if(rotateClockwise){
//顺时针旋转
for(int i=0;i<this.grid.length;i++){
for(int j=0;j<this.grid[i].length;j++){
rotate[j][GRID_SIZE-i-1]=this.grid[i][j];
}
}
}
//逆时针旋转
else{
for(int i=0;i<this.grid.length;i++){
for(int j=0;j<this.grid[i].length;j++){
rotate[GRID_SIZE-j-1][i]=this.grid[i][j];
}
}
}
//旋转后的游戏面板替换掉原来的游戏面板
this.grid=rotate;
} /*move
*根据输入的方向来移动
*/
public boolean move(Direction direction) {
if(direction.equals(Direction.UP)){
//使用Direction类的UP方法来向上移动
this.moveUp();
return this.canMoveUp();
}
if(direction.equals(Direction.DOWN)){
//使用Direction类的DOWN方法来向下移动
this.moveDown();
return this.canMoveDown();
}
if(direction.equals(Direction.LEFT)){
//使用Direction类的LEFT方法来向左移动
this.moveLeft();
return this.canMoveLeft();
}
if(direction.equals(Direction.RIGHT)){
//使用Direction类的RIGHT方法来向右移动
this.moveRight();
return this.canMoveRight();
}
return false;
} /*isGameOver
*用来判断游戏是否已经结束了
*布尔型
*/
public boolean isGameOver() {
//当任何一种移动都可以被执行的时候就返回false也就是说游戏并不结束
if(canMoveUp())
return false;
if(canMoveDown())
return false;
if(canMoveLeft())
return false;
if(canMoveRight())
return false;
//所有可能的移动都不能执行的时候游戏就结束了
return true;
} /*canMove
*用来判断这个移动是否可以被执行
*/
public boolean canMove(Direction direction) {
if(direction.equals(Direction.UP)){
//使用辅助的方法canMoveUp来检查是否可以执行UP
return this.canMoveUp();
}
if(direction.equals(Direction.DOWN)){
//使用辅助的方法canMoveDown来检查是否可以执行DOWN
return this.canMoveDown();
}
if(direction.equals(Direction.LEFT)){
//使用辅助的方法canMoveLeft来检查是否可以执行LEFT
return this.canMoveLeft();
}
if(direction.equals(Direction.RIGHT)){
//使用辅助的方法canMoveRight来检查是否可以执行RIGHT
return this.canMoveRight();
}
return false;
} /*moveUp
*向上移动
*/
private void moveUp(){
for(int j=0;j<GRID_SIZE;j++){
//把所有的非0数字放到动态数组里(按列排)
ArrayList<Integer> up=new ArrayList<Integer>();
for(int i=0;i<GRID_SIZE;i++){
if(grid[i][j]!=0){
up.add(grid[i][j]);
}
}
//遍历整个列
for(int i=0;i<up.size()-1;i++){
//如果值一样的话就合并,上方变成原来的值得两倍,下方的另一个变成0
if(up.get(i).equals(up.get(i+1))){
this.score+=up.get(i)*2;
up.set(i,up.get(i)*2);
up.remove(i+1);
}
}
//把动态数组的值返回到游戏面板中
for(int i=0;i<up.size();i++){
grid[i][j]=up.get(i);
}
for(int i=up.size();i<GRID_SIZE;i++){
grid[i][j]=0;
}
}
} /*moveDown
*向下移动
*/
private void moveDown(){
for(int j=0;j<GRID_SIZE;j++){
//把所有的非0数字放到的动态数组里(按列排)
ArrayList<Integer> down=new ArrayList<Integer>();
for(int i=GRID_SIZE-1;i>=0;i--){
if(grid[i][j]!=0){
down.add(grid[i][j]);
}
}
//遍历整个列
for(int i=0;i<down.size()-1;i++){
//add identical numbers together and remove one
if(down.get(i).equals(down.get(i+1))){
this.score+=down.get(i)*2;
down.set(i,down.get(i)*2);
down.remove(i+1);
}
}
//把动态数组的值返回到游戏面板中
for(int i=0;i<down.size();i++){
grid[GRID_SIZE-i-1][j]=down.get(i);
}
for(int i=0;i<GRID_SIZE-down.size();i++){
grid[i][j]=0;
}
}
} /*moveLeft
*向左移动
*/
private void moveLeft(){
for(int i=0;i<GRID_SIZE;i++){
//把所有的非0数字放到的动态数组里(按行排)?
ArrayList<Integer> left=new ArrayList<Integer>();
for(int j=0;j<GRID_SIZE;j++){
if(grid[i][j]!=0){
left.add(grid[i][j]);
}
}
//遍历整个行
for(int j=0;j<left.size()-1;j++){
//add identical numbers together and remove one
if(left.get(j).equals(left.get(j+1))){
this.score+=left.get(j)*2;
left.set(j,left.get(j)*2);
left.remove(j+1);
}
}
//把动态数组的值返回到游戏面板中
for(int j=0;j<left.size();j++){
grid[i][j]=left.get(j);
}
for(int j=left.size();j<GRID_SIZE;j++){
grid[i][j]=0;
}
}
} /*moveRight
*向右移动
*/
private void moveRight(){
for(int i=0;i<GRID_SIZE;i++){
//把所有的非0数字放到的动态数组里(按行排)?
ArrayList<Integer> right=new ArrayList<Integer>();
for(int j=GRID_SIZE-1;j>=0;j--){
if(grid[i][j]!=0){
right.add(grid[i][j]);
}
}
//遍历整个行
for(int j=0;j<right.size()-1;j++){
//add identical numbers together and remove one
if(right.get(j).equals(right.get(j+1))){
this.score+=right.get(j)*2;
right.set(j,right.get(j)*2);
right.remove(j+1);
}
}
//把动态数组的值返回到游戏面板中
for(int j=0;j<right.size();j++){
grid[i][GRID_SIZE-j-1]=right.get(j);
}
for(int j=0;j<GRID_SIZE-right.size();j++){
grid[i][j]=0;
}
}
} /*canMoveUp
*用来判断是否可以向上移动
*/
private boolean canMoveUp(){
for(int j=0;j<GRID_SIZE;j++){
for(int i=0;i<GRID_SIZE-1;i++){
//如果在两个非0格子之间有一个0格子就返回ture
if(grid[i][j]==0){
for(int index=i+1;index<GRID_SIZE;index++){
if(grid[index][j]!=0){
return true;
}
}
}
//如果有两个相连的非0格子可以合并则返回ture
if(grid[i][j]==grid[i+1][j]&&grid[i][j]!=0){
return true;
}
}
}
return false;
} /*canMoveDown
*用来判断是否可以向下移动
*/
private boolean canMoveDown(){
for(int j=0;j<GRID_SIZE;j++){
for(int i=GRID_SIZE-1;i>0;i--){
//如果在两个非0格子之间有一个0格子就返回ture
if(grid[i][j]==0){
for(int index=i-1;index>=0;index--){
if(grid[index][j]!=0){
return true;
}
}
}
//如果有两个相连的非0格子可以合并则返回ture
if(grid[i][j]==grid[i-1][j]&&grid[i][j]!=0){
return true;
}
}
}
return false;
} /*canMoveLeft
*用来判断是否可以向上移动
*/
private boolean canMoveLeft(){
for(int i=0;i<GRID_SIZE;i++){
for(int j=0;j<GRID_SIZE-1;j++){
//如果在两个非0格子之间有一个0格子就返回ture
if(grid[i][j]==0){
for(int index=j+1;index<GRID_SIZE;index++){
if(grid[i][index]!=0){
return true;
}
}
}
//如果有两个相连的非0格子可以合并则返回ture
if(grid[i][j]==grid[i][j+1]&&grid[i][j]!=0){
return true;
}
}
}
return false;
} /*canMoveRight
*用来判断是否可以向上移动
*/
private boolean canMoveRight(){
for(int i=0;i<GRID_SIZE;i++){
for(int j=GRID_SIZE-1;j>0;j--){
//如果在两个非0格子之间有一个0格子就返回ture
if(grid[i][j]==0){
for(int index=j-1;index>=0;index--){
if(grid[i][index]!=0){
return true;
}
}
}
//如果有两个相连的非0格子可以合并则返回ture
if(grid[i][j]==grid[i][j-1]&&grid[i][j]!=0){
return true;
}
}
}
return false;
} public int[][] getGrid() {
return grid;
} //返回分数
public int getScore() {
return score;
}
@Override
public String toString() {
StringBuilder outputString = new StringBuilder();
outputString.append(String.format("Score: %d\n", score));
for (int row = 0; row < GRID_SIZE; row++) {
for (int column = 0; column < GRID_SIZE; column++)
outputString.append(grid[row][column] == 0 ? " -" :
String.format("%5d", grid[row][column])); outputString.append("\n");
}
return outputString.toString();
}
}

JAVA大作业汇总3的更多相关文章

  1. JAVA大作业汇总1

    JAVA大作业 代码 ``` package thegreatwork; import javafx.application.; import javafx.scene.control.; impor ...

  2. JAVA大作业汇总2

    JAVA大作业2 代码 package thegreatwork; //Enum一般用来表示一组相同类型的常量,这里用于表示运动方向的枚举型常量,每个方向对象包括方向向量. public enum D ...

  3. < JAVA - 大作业(2)仿qq即时通讯软件 >

    < JAVA - 大作业(2)仿qq即时通讯软件 > 背景 JAVA上机大作业:设计一个仿qq即时通讯软件 任务简要叙述:设计一款仿QQ的个人用户即时通讯软件,能够实现注册,登陆,与好友聊 ...

  4. java大作业博客--购物车

    Java 大作业----使用MySQL的购物车 一.团队介绍 姓名 任务 李天明.康友煌 GUI设计及代码编写 谢晓淞 业务代码编写.MySQL服务器平台部署.git代码库 严威 类和包的结构关系设计 ...

  5. <JAVA - 大作业(1)文本编辑器 >

    <JAVA - 大作业(1)文本编辑器 > 背景 JAVA上机大作业:qq / 代码评价系统 第一次上机主题是练习JAVA自带的GUI图形化编程 目的:实现一个跟window10记事本界面 ...

  6. java大作业 KShinglingAlgorithm

    wiki上关于KShingling Algorithm(w-shingling)的说明: http://en.wikipedia.org/wiki/W-shingling 摘要: In natural ...

  7. 期末Java Web大作业----简易的学生管理系统

    学生信息管理系统(大作业) 2018-12-21:此文章已在我的网站更新,添加视图介绍等信息,源码请移步下载https://www.jeson.xin/javaweb-sims.html PS:首先不 ...

  8. Java Web大作业——编程导航系统

    title: Java Web大作业--编程导航系统 categories: - - 计算机科学 - Java abbrlink: 40bc48a1 date: 2021-12-29 00:37:35 ...

  9. 史上最全的 Java 新手问题汇总

    史上最全的 Java 新手问题汇总   Java是目前最流行的编程语言之一——它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在. 有超过30亿 ...

随机推荐

  1. 收放卷及张力控制 PID调试技巧

    1) 小 Kp( 0.01) , 大 Ti ( 20000ms) 2)逐渐增大Kp, 减小Ti ( 20000ms – 3000ms),避免发生震荡 3)观察I-out 是否在0附近 可能原因:卷径不 ...

  2. Linux xclock打不开时钟终端

    一般执行该操作的都是在安装oracle数据库或其他应用时,需要测试是否可以正常弹层执行的: 网络关于这个的描述和处理大片片的,但是符合自己实际情况的,还是需要直接去确认: 两步处理: 第一步: 使用r ...

  3. NODE-windows 下安装nodejs及其配置环境

    相信对于很多关注javascript发展的同学来说,nodejs已经不是一个陌生的词眼.有关nodejs的相关资料网上已经铺天盖地.由于它的高并发特性,造就了其特殊的应用地位. 国内目前关注最高,维护 ...

  4. SONA Topology

    N多年以前就有有人设计传了一种类似“房子”状结构的拓扑图,在Cisco的文档中可以查到这种叫SONA.这是个非常神奇的设计,适合用于中小型网络,之所以这么讲,是因为在这个结构下,但凡任何一台接入层或者 ...

  5. TOEFL考试(一年半的复仇,裸考)

    8/11/2018 had a TOEFL test without preparation. Reading (worry about too much, not familiar with the ...

  6. 2017.9.5 Java知识点总结

    1.*程序的数据操作往往都在内存中操作的,也就是说数据运算都在内存中完成. 2.*什么是变量? --变量就是内存中的一块用来存放数据的存储单元. --变量中的值可变 --我们通过变量名就可以找到内存中 ...

  7. 基于bootstrap模态框的二次封装

    一.参数设置 $.beamDialog(options); var defaults = { title:'标题', content:'内容', showCloseButton:true, //显示关 ...

  8. 用jquery写的json省市县三级联动下拉

    <form action="#" name="myform"> <label>省</label><select nam ...

  9. 【luogu P3275 [SCOI2011]糖果】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3275 把不等式 A > B 转化成 A - B >= 1或者 B - A <= -1再差分 ...

  10. Oracle数据库对象,同义词、序列、视图、索引

    数据库对象简介 Oracle 数据库对象又称模式对象 数据库对象是逻辑结构的集合,最基本的数据库对象是表 其他数据库对象包括: 同义词是现有对象的一个别名. 简化SQL语句 隐藏对象的名称和所有者 提 ...