java2048_java之2048
今天好热热热热热热热热热 ㄟ(≧◇≦)ㄏ ,所以吃块西瓜就开始玩2048吧~
一.先确定这个2048有哪些功能
初始出现2个数字和方块
移动方块
方块中的数字相加
仅出现1个相加后的数字和方块
记录最大数字
随机出现数字和方块
游戏结束
排行榜
重新开始
游戏存档
二.界面的实现
以画图的方式来实现2048游戏主界面。
☆窗体实现
☆游戏界面实现
Graphics的绘图方法
☆基本功能实现
三.实现2048游戏需要使用那些API类呢
JFrame
MouseListener
MouseEvent
KeyListener
KeyEvent
Graphics
Color
二维数组
四.功能实现
☆用字节流来做游戏存档和排行榜
1。Java的字节流
输入流:将数据输入到程序(内存)
输出流:将程序(内存)中的数据输出到外部设备上。
2。Java字节流的使用
InputStream 输入流
FileInputStream 字节输入流
read() 一次只能读取一个字节
read(byte[] b) 每一次读取一字节存入到数组中,直到读满整个数组
read(byte[] b,int off,int length) 每一次读取一字节存入到数组中,off表示是从数组的off 位置开始,length表示要读取多少个字节
available() 获取当前文件中还可以读取的字节数
close() 关闭流
OutputStream 输出流
FileOutputStream 字节输出流
write() 每一次只能写一个字节
write(byte[] b) 每一次只能写一个字节,会把数组中的数据一个一个的写入
write(byte[] b,int off,int length)
flush() 强制写入(清空缓冲区)
close() 关闭流
使用FileInputStream来读取文件中的数据
使用FileOutputStream将数据写入到另一个文件中
☆数字移动
KeyListener(KeyAdapter)
五.下面出代码哈
package SummerCamp8;
import static SummerCamp8.GameConfig.height;
import static SummerCamp8.GameConfig.x;
import static SummerCamp8.GameConfig.y;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.util.Random;
import javax.swing.JFrame;
/**
* 定义一个Game2048类
*
* @author 依米
*
*/
public class Game2048 extends JFrame implements GameConfig {
/**
* 定义2048入口函数
*
* @param args
*/
public static void main(String[] args) {
Game2048 game = new Game2048();
game.InitUI();
}
private Dimension dim;
private int[][] array;
/**
* 定义界面初始化
*/
public void InitUI() {
array = new int[4][4];
GameSave gs = new GameSave();
int[][] tempArray = gs.openInfo();
if (tempArray == null) {
randDate();
} else {
array = tempArray;
}
dim = new Dimension(540, 700);
this.setTitle("2048");
this.setSize(dim);
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setVisible(true);
this.requestFocus();
GameListener gl = new GameListener(array, this);
this.addKeyListener(gl);
this.addMouseListener(gl);
this.addMouseMotionListener(gl);
}
/**
* 重写JFrame组件的绘制方法
*
* @param g是画笔
*/
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);// 开启画笔抗锯齿
draw2048UI(g);
}
/**
* 随机生成2048游戏界面的初始数据
*/
public void randDate() {
Random rand = new Random();
int r1, c1;
r1 = rand.nextInt(array.length);//第一块方块的初始位置
c1 = rand.nextInt(array[r1].length);
int r2, c2;
do {
r2 = rand.nextInt(array.length);//第二块方块的初始位置
c2 = rand.nextInt(array[r1].length);
} while (r1 == r2 && c1 == c2);
array[r1][c1] = (rand.nextInt(2) + 1) * 2;//初始生成两个数字
array[r2][c2] = (rand.nextInt(2) + 1) * 2;
}
private Image img;//所有组件画在图片上,缓冲
private Graphics2D ig;
/**
* 绘制游戏界面的方法
*
* @param g
*/
public void draw2048UI(Graphics g) {
img = this.createImage(this.getWidth(), this.getHeight());
ig = (Graphics2D) img.getGraphics();
ig.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
ig.setColor(new Color(250, 250, 210));// 画笔颜色
ig.fillRoundRect(x, y, x + (dis + size) * 4, y + (dis + size) * 4, arcW,
arcH);// 游戏背景
ig.setColor(new Color(238, 232, 170));// 238, 232, 170
for (int r = 0; r < array.length; r++)
for (int c = 0; c < array[r].length; c++) {
ig.fillRect(x + dis + (size + dis) * c, y + dis + (size + dis)
* r, size, size);
}
ig.setColor(new Color(218, 165, 32));// 设置画笔颜色
// 根据数组中的数据来绘制初始时数据情况
for (int r = 0; r < array.length; r++) {
for (int c = 0; c < array[r].length; c++) {
if (array[r][c] != 0) {
switch (array[r][c]) {
case 2:
ig.setColor(new Color(255, 250, 205));
break;
case 4:
ig.setColor(new Color(245, 222, 179));// 240, 230, 140
break;
case 8:
ig.setColor(new Color(240, 230, 140));
break;
case 16:
ig.setColor(new Color(238, 200, 120));
break;
case 32:
ig.setColor(new Color(245, 190, 20));
break;
case 64:
ig.setColor(new Color(218, 165, 32));// 245, 222, 179
break;
case 128:
ig.setColor(new Color(255, 165, 0));
break;
case 256:
ig.setColor(new Color(255, 140, 0));
break;
case 512:
ig.setColor(new Color(205, 133, 63));
break;
case 1024:
ig.setColor(new Color(210, 105, 30));
break;
case 2048:
ig.setColor(new Color(255, 69, 0));
break;
}
ig.fillRect(x + dis + (size + dis) * c, y + dis
+ (size + dis) * r, size, size);
ig.setColor(new Color(85, 107, 100));
ig.setFont(new Font("微软雅黑", Font.BOLD, 30));
ig.drawString("" + array[r][c], x + dis + 40 + (size + dis)
* c, y + dis + 60 + (size + dis) * r);
}
}
}
ig.setColor(Color.black);
ig.fillRoundRect(x + 10, y + dis + height, 150, 50, 20, 20);
ig.fillRoundRect(x + dis + 155, y + dis + height, 150, 50, 20, 20);
ig.fillRoundRect(x + 2 * dis + 2 * 150, y + dis + height, 150, 50, 20,
20);
ig.setFont(new Font("MV Boli", Font.BOLD, 20));
ig.setColor(Color.white);
ig.drawString("New Game", x + dis + 10, y + (int) (dis * 2.5) + height);
ig.drawString("Rank", x + 3 * dis + 162, y + (int) (dis * 2.5) + height);
ig.drawString("Save", x + (int) (3.7 * dis + 2 * 150 + 15), y
+ (int) (dis * 2.5) + height);
g.drawImage(img, 0, 0, this);
}
}
package SummerCamp8;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class GameListener extends KeyAdapter implements MouseListener,
MouseMotionListener, GameConfig {
private int[][] array;// 声明数组名属性
private Game2048 game;// 声明窗体对象名属性
/**
* 构造方法
*
* @param array是从Game2048类中传递过来的数组对象
* @param game是从Game2048类中传递过来的窗体对象
*/
public GameListener(int[][] array, Game2048 game) {
this.array = array;
this.game = game;
}
/**
* 随机生成游戏界面上的一个数据的方法
*/
public void rData() {
Random rand = new Random();
int r, c;
do {
r = rand.nextInt(array.length);
c = rand.nextInt(array[r].length);
} while (array[r][c] != 0);
array[r][c] = (rand.nextInt(2) + 1) * 2;
}
/**
* 当你发生键盘按键按下时执行此方法
*/
public void keyPressed(KeyEvent e) {
int number = 0;
int code = e.getKeyCode();// 只能用这个获取功能键
switch (code) {
case 37:// 向左
// 相邻数字相加
for (int r = 0; r < array.length; r++)
for (int c = 0; c < array[r].length; c++)
if (array[r][c] != 0)
for (int c1 = c + 1; c1 < array[r].length; c1++)
if (array[r][c] == array[r][c1]) {
array[r][c] *= 2;// 相加后只保留一个相加后的数字
array[r][c1] = 0;// 令另一个数为0
number++;
break;
} else if (array[r][c1] != 0) {// 不能隔着不为0
// 的数字移动并和下一个相加
break;
}
// 仅在为0 的格子上移动
for (int r = 0; r < array.length; r++)
for (int c = 0; c < array[r].length; c++)
if (array[r][c] == 0) {
for (int c1 = c + 1; c1 < array[r].length; c1++) {
if (array[r][c1] != 0) {
array[r][c] = array[r][c1];// 两格子交换数字,实现移动
array[r][c1] = 0;
number++;
break;
}
}
}
break;
case 38:// 向上
for (int c = 0; c < array[0].length; c++)
for (int r = 0; r < array.length; r++)
if (array[r][c] != 0)
for (int r1 = r + 1; r1 < array.length; r1++)
if (array[r1][c] == array[r][c]) {
array[r][c] *= 2;
array[r1][c] = 0;
number++;
break;
} else if (array[r1][c] != 0)
break;
for (int c = 0; c < array[0].length; c++)
for (int r = 0; r < array.length; r++)
if (array[r][c] == 0) {
for (int r1 = r + 1; r1 < array.length; r1++) {
if (array[r1][c] != 0) {
array[r][c] = array[r1][c];
array[r1][c] = 0;
number++;
break;
}
}
}
break;
case 39:// 向右
// 相加
for (int r = 0; r < array.length; r++)
for (int c = array[r].length - 1; c >= 0; c--)
if (array[r][c] != 0)
for (int c1 = c - 1; c1 >= 0; c1--)
if (array[r][c] == array[r][c1]) {
array[r][c] *= 2;
array[r][c1] = 0;
number++;
break;
} else if (array[r][c1] != 0) {
break;
}
for (int r = 0; r < array.length; r++)
for (int c = array[r].length - 1; c >= 0; c--)
if (array[r][c] == 0) {
for (int c1 = c - 1; c1 >= 0; c1--) {
if (array[r][c1] != 0) {
array[r][c] = array[r][c1];
array[r][c1] = 0;
number++;
break;
}
}
}
break;
case 40:// 向下
for (int c = 0; c < array[0].length; c++)
for (int r = array.length - 1; r >= 0; r--)
if (array[r][c] != 0)
for (int r1 = r - 1; r1 >= 0; r1--)
if (array[r1][c] == array[r][c]) {
array[r][c] *= 2;
array[r1][c] = 0;
number++;
break;
} else if (array[r1][c] != 0)
break;
for (int c = 0; c < array[0].length; c++)
for (int r = array.length - 1; r >= 0; r--)
if (array[r][c] == 0) {
for (int r1 = r - 1; r1 >= 0; r1--) {
if (array[r1][c] != 0) {
array[r][c] = array[r1][c];
array[r1][c] = 0;
number++;
break;
}
}
}
break;
}
if (number > 0) {
rData();// 调用随机生成一个数据的方法
game.repaint();// 调用窗体的重绘方法
} else {
// System.out.println("~~~~~~~~~~" + number);// 检查number
int count = 0;
// 检测是否还可以移动
int max = array[0][0];
for (int r = 0; r < array.length; r++) {
for (int c = 0; c < array[r].length; c++) {
if (array[r][c] != 0) {
if (c + 1 < array[r].length
&& array[r][c + 1] == array[r][c]) {// 列
count++;
// System.out.println("~~~~~~~~~~~1" + count);//
// 检查count
}
if (r + 1 < array.length
&& array[r + 1][c] == array[r][c]) {// 行
count++;
// System.out.println("~~~~~~~~~~~2" + count);
}
} else {
count++;
}
if (array[r][c] > max)
max = array[r][c];
}
}
if (count == 0) {
// 不可以移动了
Graphics g = game.getGraphics();// 获取窗体上的画笔对象
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);// 开启画笔抗锯齿
g.setColor(Color.darkGray);
g.setFont(new Font("MV Boli", Font.BOLD, 83));
g.drawString("Game Over!", 20, game.getHeight() / 2 - 40);
game.removeKeyListener(this);
int option = JOptionPane.showConfirmDialog(game, "Record?",
"RankingList", JOptionPane.YES_NO_OPTION);
if (option == 0) {
String name = JOptionPane.showInputDialog(game, "User:",
"RankingList", JOptionPane.YES_NO_OPTION);
User user = new User(name, max);
GameSave gs = new GameSave();
boolean b = gs.saveRankingList(user);
if (b) {
JOptionPane.showMessageDialog(game, "排行榜信息存储成功!");
} else {
JOptionPane.showMessageDialog(game, "排行榜信息存储失败!");
}
}
}
}
}
/**
* Invoked when the mouse button has been clicked (pressed and released) on
* a component.
*/
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
int mx = e.getX();
int my = e.getY();
Graphics2D ig = (Graphics2D) game.getGraphics();
// 开始游戏按钮 x, y + distance + height, 150, 50
if (mx > (x + 10) && mx < (x + 160) && my > y + dis + height
&& my < y + dis + height + 50) {// 表示点击的是开始游戏按钮
ig.setColor(Color.LIGHT_GRAY);
ig.fillRoundRect(x + 10, y + dis + height, 150, 50, 20, 20);
ig.setFont(new Font("MV Boli", Font.BOLD, 20));
ig.setColor(Color.white);
ig.drawString("New Game", x + dis + 10, y + (int) (dis * 2.5)
+ height);
}
// 排行榜按钮 x + distance + 150, y + distance + height, 150, 50
if (mx > x + dis + 155 && mx < x + dis + 155 + 150
&& my > y + dis + height && my < y + dis + height + 50) {// 表示进入是排行榜按钮
ig.setColor(Color.LIGHT_GRAY);
ig.fillRoundRect(x + dis + 155, y + dis + height, 150, 50, 20, 20);
ig.setFont(new Font("MV Boli", Font.BOLD, 20));
ig.setColor(Color.white);
ig.drawString("Rank", x + 3 * dis + 162, y + (int) (dis * 2.5)
+ height);
// System.out.println("进入排行榜按钮");
}
// 游戏存档按钮x + 2 * distance + 2 * 150, y + distance + height,150, 50
if (mx > x + 2 * dis + 2 * 150 && mx < x + 2 * dis + 2 * 150 + 150
&& my > y + dis + height && my < y + dis + height + 50) {// 表示进入游戏存档按钮
ig.setColor(Color.LIGHT_GRAY);
ig.fillRoundRect(x + 2 * dis + 300, y + dis + height, 150, 50, 20,
20);
// System.out.println("进入游戏存档按钮");
ig.setFont(new Font("MV Boli", Font.BOLD, 20));
ig.setColor(Color.white);
ig.drawString("Save", x + (int) (3.7 * dis + 315), y
+ (int) (dis * 2.5) + height);
}
}
public void mouseReleased(MouseEvent e) {
int mx = e.getX();
int my = e.getY();
Graphics2D ig = (Graphics2D) game.getGraphics();
// 开始游戏按钮 x, y + distance + height, 150, 50
if (mx > (x + 10) && mx < (x + 160) && my > y + dis + height
&& my < y + dis + height + 50) {// 表示点击的是开始游戏按钮
int option = JOptionPane.showConfirmDialog(game,
"Start a new game ~(*0*~)?", "new game",
JOptionPane.YES_NO_OPTION);
if (option == 0) {
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
array[i][j] = 0;// 清空数据
Random rand = new Random();// 初始数据
int r1, c1;
r1 = rand.nextInt(array.length);
c1 = rand.nextInt(array[r1].length);
int r2, c2;//
do {
r2 = rand.nextInt(array.length);
c2 = rand.nextInt(array[r1].length);
} while (r1 == r2 && c1 == c2);
array[r1][c1] = (rand.nextInt(2) + 1) * 2;
array[r2][c2] = (rand.nextInt(2) + 1) * 2;
}
game.paint(game.getGraphics());
// 给事件源对象重新添加监听
game.addKeyListener(this);
}
// 排行榜按钮 x + distance + 150, y + distance + height, 150, 50
if (mx > x + dis + 155 && mx < x + dis + 155 + 150
&& my > y + dis + height && my < y + dis + height + 50) {// 表示点击的是开始游戏按钮
JOptionPane.showMessageDialog(game, "Check the Rank ~>_
GameSave gs = new GameSave();
ArrayList list = gs.openRankingList();
JFrame frame = new JFrame();
frame.setTitle("Ranking");
frame.setSize(300, 700);
frame.setDefaultCloseOperation(2);
frame.setLocationRelativeTo(null);
frame.setLayout(null);
frame.setResizable(false);
JLabel lab = new JLabel("User Max ");
lab.setBounds(30, 60, 400, 60);
frame.add(lab);
for (int i = 0; i < list.size(); i++) {
User user = (User) list.get(i);
JLabel label = new JLabel(user.toString());
label.setBounds(30, 60 + (i + 1) * 50, 400, 60);
frame.add(label);
}
frame.setVisible(true);
}
// 游戏存档按钮x + 2 * distance + 2 * 150, y + distance + height,150, 50
if (mx > x + 2 * dis + 2 * 150 && mx < x + 2 * dis + 2 * 150 + 150
&& my > y + dis + height && my < y + dis + height + 50) {// 表示点击的是开始游戏按钮
GameSave gs = new GameSave();
boolean b = gs.saveInfo(array);
if (b)
JOptionPane.showMessageDialog(game, "Success in Saving ^_^");
else
JOptionPane.showMessageDialog(game, "Failure in Saving ~_~");
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
}
/**
* 当鼠标进入按钮的区域时,按钮颜色变化,实则重新画一个除颜色外其他地方都相同的按钮
*/
public void mouseMoved(MouseEvent e) {
int mx = e.getX();
int my = e.getY();
// System.out.println("mx = " + mx + " my = " + my);
Graphics2D ig = (Graphics2D) game.getGraphics();
// 开始游戏按钮 x, y + distance + height, 150, 50
if (mx > (x + 10) && mx < (x + 160) && my > y + dis + height
&& my < y + dis + height + 50) {
// System.out.println("进入开始游戏按钮");// 表示点击的是开始游戏按钮
ig.setColor(Color.GRAY);
ig.fillRoundRect(x + 10, y + dis + height, 150, 50, 20, 20);
ig.setFont(new Font("MV Boli", Font.BOLD, 20));
ig.setColor(Color.white);
ig.drawString("New Game", x + dis + 10, y + (int) (dis * 2.5)
+ height);
} else {
ig.setColor(Color.black);
ig.fillRoundRect(x + 10, y + dis + height, 150, 50, 20, 20);
ig.setFont(new Font("MV Boli", Font.BOLD, 20));
ig.setColor(Color.white);
ig.drawString("New Game", x + dis + 10, y + (int) (dis * 2.5)
+ height);
}
// 排行榜按钮 x + distance + 150, y + distance + height, 150, 50
if (mx > x + dis + 155 && mx < x + dis + 155 + 150
&& my > y + dis + height && my < y + dis + height + 50) {// 表示进入是排行榜按钮
ig.setColor(Color.GRAY);
ig.fillRoundRect(x + dis + 155, y + dis + height, 150, 50, 20, 20);
ig.setFont(new Font("MV Boli", Font.BOLD, 20));
ig.setColor(Color.white);
ig.drawString("Rank", x + 3 * dis + 162, y + (int) (dis * 2.5)
+ height);
// System.out.println("进入排行榜按钮");
} else {
ig.setColor(Color.black);
ig.fillRoundRect(x + dis + 155, y + dis + height, 150, 50, 20, 20);
ig.setFont(new Font("MV Boli", Font.BOLD, 20));
ig.setColor(Color.white);
ig.drawString("Rank", x + 3 * dis + 162, y + (int) (dis * 2.5)
+ height);
}
// 游戏存档按钮x + 2 * distance + 2 * 150, y + distance + height,150, 50
if (mx > x + 2 * dis + 2 * 150 && mx < x + 2 * dis + 2 * 150 + 150
&& my > y + dis + height && my < y + dis + height + 50) {// 表示进入游戏存档按钮
ig.setColor(Color.GRAY);
ig.fillRoundRect(x + 2 * dis + 300, y + dis + height, 150, 50, 20,
20);
// System.out.println("进入游戏存档按钮");
ig.setFont(new Font("MV Boli", Font.BOLD, 20));
ig.setColor(Color.white);
ig.drawString("Save", x + (int) (3.7 * dis + 315), y
+ (int) (dis * 2.5) + height);
} else {
ig.setColor(Color.black);
ig.fillRoundRect(x + 2 * dis + 2 * 150, y + dis + height, 150, 50,
20, 20);
ig.setFont(new Font("MV Boli", Font.BOLD, 20));
ig.setColor(Color.white);
ig.drawString("Save", x + (int) (3.7 * dis + 315), y
+ (int) (dis * 2.5) + height);
}
}
}
package SummerCamp8;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
public class GameSave {
/**
* 游戏信息存档的方法
*
* @param array要存档的数据
*/
public boolean saveInfo(int[][] array) {
try {
// 实例化一个输出流对象
OutputStream os = new FileOutputStream("E:\\机器人\\Yimi.SummerCamp\\src\\SummerCamp8\\saveinfo.txt");
os.write(array.length);// 写入数组的行数
os.write(array[0].length);// 写入数组的列数
// 将数组中的元素写入到文件中
for (int r = 0; r < array.length; r++) {
for (int c = 0; c < array.length; c++) {
os.write(array[r][c]);
}
}
os.close();//关文件
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 读取文档中的数据
*
* @return 返回读取到存档信息
*/
@SuppressWarnings("resource")
public int[][] openInfo() {
try {
// 实例化一个输入流对象
InputStream is = new FileInputStream("E:\\机器人\\Yimi.SummerCamp\\src\\SummerCamp8\\saveinfo.txt");
int row = is.read();
int column = is.read();
if (row != -1 && column != -1) {
int[][] array = new int[row][column];
for (int r = 0; r < array.length; r++) {
for (int c = 0; c < array.length; c++) {
array[r][c] = is.read();
}
}
is.close();
return array;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 存储游戏排行版信息的方法
*
* @param user用户信息对象
*/
public boolean saveRankingList(User user) {
try {
ArrayList list = openRankingList();
if (list != null) {
list.add(user);// 将新的用户信息(名字,最高分)添加到数组队列中
for (int i = 0; i < list.size() - 1; i++) {
int index = i;
for (int j = i + 1; j < list.size(); j++) {
User use_max = (User) list.get(index);
User use = (User) list.get(j);
if (use_max.getMax() <= use.getMax()) {
index = j;
}
}
if (index != i) {
User use_max = (User) list.get(index);
User use = (User) list.get(i);
list.set(index, use);
list.set(i, use_max);
}
}
} else {
list = new ArrayList();
list.add(user);
}
// 实例化一个输出流对象
OutputStream os = new FileOutputStream("E:\\机器人\\Yimi.SummerCamp\\src\\SummerCamp8\\Rankinglist.txt");
DataOutputStream dos = new DataOutputStream(os);
dos.writeInt(list.size());// 写入信息条数
for (int i = 0; i < list.size(); i++) {
User use = (User) list.get(i);
dos.writeByte(use.getName().getBytes().length);
dos.write(use.getName().getBytes());
dos.writeInt(use.getMax());
}
dos.close();
os.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 读取文档中的数据
*
* @return 返回读取到存档信息
*/
public ArrayList openRankingList() {
try {
// 实例化一个输入流对象
InputStream is = new FileInputStream("E:\\机器人\\Yimi.SummerCamp\\src\\SummerCamp8\\Rankinglist.txt");
DataInputStream d = new DataInputStream(is);
// 读取信息的条数
int size = d.readInt();
//System.out.println("===="+size);
// 实例化ArrayList的数组队列对象
ArrayList list = new ArrayList();
if (size != -1) {
for (int i = 0; i < size; i++) {
byte nSize = d.readByte();
byte[] b = new byte[nSize];
is.read(b);
int max = d.readInt();
User use = new User(new String(b), max);
list.add(use);
}
}
d.close();
is.close();
return list;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
package SummerCamp8;
public interface GameConfig {
int x=20;
int y=50;
int size=101;
int arcW=20;
int arcH=20;
int dis=20;
int height=550;
}
package SummerCamp8;
public class User {
private String name;
private int max;
public User() {
}
public User(String name, int max) {
this.name = name;
this.max = max;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
public String toString() {
return name + " " + max + " " ;
}
}
六.看一下效果哈
https://www.zhihu.com/video/873653325361483776
https://www.zhihu.com/video/873653363428966400
https://www.zhihu.com/video/873653397407031296
我自己最多能玩到512,太水了(・・)
差不多就是这样了哈,有机会可以加上支付的功能,等下次我更新哈,么么哒
See u~
java2048_java之2048相关推荐
- 是男人就下100层【第五层】——2048游戏从源代码到公布市场
上一篇<是男人就下100层[第五层]--换肤版2048游戏>中阳光小强对2048游戏用自己的方式进行了实现,并分享了核心源码,这一篇阳光小强打算将该项目的全部源码公开并结合这个实例在这篇文 ...
- f-fdisk做磁盘分区,起始扇区从2048块开始
文章目录 First Sector 起始扇区 fdisk工具加分区 fdisk删除分区 First Sector 起始扇区 默认从第2048块扇区开始是因为,由于EFI的兴起,要给EFI 代码留磁盘最 ...
- Flex报错Error #2048: 安全沙箱冲突
Flex+JPA架构,JPA程序迁移,从A服务器到B.其他一切没变,唯一变的就是IP. 前端Flex也就是swf报错Error #2048: 安全沙箱冲突:http://xxx.swf 不能从 xxx ...
- 使用javascript开发2048
嗯,团队队友开发了一个简单的2048...哈哈,没办法,这游戏那么疯狂,必须搞搞啦,大家能够直接粘贴代码到一个html文件,直接执行就可以 依赖文件:jquery,假设乜有,大家能够自己下载一份 &l ...
- 【ACM】杭电OJ 2048 2049
两题均是错排公式与阶乘的运用 2048算的是一个比例,2049计算的是一个事情发生的总数 一个用double 来存放数据,一个用long long来存放数据 2048 #include <io ...
- 你玩《2048》能拿多少分?AI的最高分纪录:401912
来源|量子位 如果让AI来玩<2048>这样的游戏,那会是怎样一种画面? 现在,有人用强化学习方法实践了起来. 于是,插上DQN的翅膀,AI从零起步,自己琢磨出了<2048>的 ...
- 基于 react, redux 最佳实践构建的 2048
前段时间 React license 的问题闹的沸沸扬扬,搞得 React 社区人心惶惶,好在最终 React 团队听取了社区意见把 license 换成了 MIT.不管 React license ...
- python游戏代码五子棋_用20行Python代码实现2048小游戏,你会吗?
前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...
- remote: 此仓库的限制大小为: 2048 MB, 您的使用已经超出限额
Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 392.33 MiB | 7.45 MiB/s, done. T ...
- 2048界面优化c语言,好玩的2048小游戏,C语言的代码分享给你,快来练习吧!
学习C/C++一个多月了,我们已经学习了c语言数据的基本类型.变量的输入输出.进制转换.运算符和分支结构.循环结构.数组.指针.函数和字符串结构体等等,在老师带着我们作出了一个贪吃蛇的过程中让我深刻的 ...
最新文章
- java final bigd_【BigData】Java基础_常量
- 后台技术-JavaWeb项目初识
- SwiftUI之深入解析如何实现3D Scroll效果
- 大话oraclerac集群、高可用性、备份与恢复_Oracle RAC结构
- 安装好MongoDB,但服务中没有MongoDB服务的解决办法
- python处理ncdc气象数据并利用arcgis可视化
- 三大超算军团加速布局 中科曙光E级超算预研项目正式启动
- 所有的生意都是在做两件事
- 九种跨域方式的实现原理,第一个就超惊艳!| 技术头条
- Bootstrap 中 表单和图片(二)
- 利用Bat命令批量修改文件名
- 深度deepin安装腾达U12无线网卡驱动
- APP推广工具(总结)
- 纬地道路纵断面设计教程_中铁城际总结公路设计应掌握的知识要领解答
- 如何绕过百度网盘客户端下载大文件
- JavaScript中的时间与日期、正则表达式和Function类型
- JQuery仿百度有啊人气排行特效演示
- 没的选择时,存在就是合理的::与李旭科书法字QQ聊天记录
- 计蒜之道 测试赛 (BCD)
- togaf 的4A架构
热门文章
- C#获取屏幕的分辨率
- 【JavaSE】学了这么久Java,你真的会用代码块吗?
- Pull Request 的概述
- HTTP中GET,POST和PUT的区别
- 技术人人都是好的需求评审专家- 如何需求评审,需求评审评什么.
- php限制选择图片数量,ImagePicker组件,限制选择图片数量上限(selectable={images.length 3} )失败...
- Tic-Tac-Toe可能棋局搜索的实现(python)
- ERPLAB脑电数据分析教程
- Unity - Timeline 之 Timeline Preview and Timeline Selector(Timeline预览与Timeline选择器)
- C# 之 ZipOutPutStream 压缩文件