这学期开始学Java,也许是为了工作,也许是对编程有了一点点兴趣,所以学的稍微有一点用心。而老师也只讲了一些基本的语法和操作,其他的都是自己一步步摸索来的,所以想写一点点东西来让以后的自己看看。

废话不多说,这学期的java实践课作业是做一个扫雷游戏。下面逐一讲解。

设计思路—-
(一)
首先设计一个二维数组,用于存放雷和周围八个格子雷的个数,再定义两个一维数组分别存放雷的X和Y坐标,布雷,记录周围八个格子雷的个数。
我使用的是eclipse
新建Java项目Boom
新建package:boom
新建Class:Block
代码:

package boom;
/** 设计一个二维数组,用于存放雷和周围八个格子雷的个数,* 再定义两个一维数组分别存放雷的X和Y坐标,* 布雷,记录周围八个格子雷的个数。*/import java.util.Random;public class Block {protected int[][] Array;//用于存放雷和周围雷的个数protected int[] ArrayTestX;//用于存放雷的X坐标protected int[] ArrayTestY;//用于存放雷的Y坐标protected static int m;//用于记录已产生雷的个数,并对即将要产生的雷做限制条件protected static int s;//用于记录要产生雷的个数private static int t = 0;//记录周围雷的个数public Block(int x,int y){m = 0;s = 0;//此处必须置零Array = new int[x][y];switch(Array.length){case 9:ArrayTestX = new int[10];ArrayTestY = new int[10];s = 10;break;case 16:ArrayTestX = new int[40];ArrayTestY = new int[40];s = 40;break;case 30:ArrayTestX = new int[99];ArrayTestY = new int[99];s = 99;break;}//选则游戏不同难度所对应的不同数组大小for(int i = 0;i < Array.length;i++){for(int j = 0;j < Array.length;j++){Array[i][j] = 0;}}//产生平面数组Random a = new Random();for(;m < s;m++){Array[(ArrayTestX[m] = a.nextInt(Array.length))][(ArrayTestY[m] = a.nextInt(Array.length))] = -1;//随机产生雷点,并赋值-1if((Judge() && m > 0)){m--;}//判断雷点是否重复}//产生雷点for (int i = 0; i < Array.length; i++) {for (int j = 0; j < Array.length; j++) {t = 0;if (Array[i][j] == -1) {} else {if ((i - 1 >= 0) && (j - 1 >= 0)) {if (Array[i - 1][j - 1] == -1) {t++;}}if (i - 1 >= 0) {if (Array[i - 1][j] == -1) {t++;}}if ((i - 1 >= 0) && (j + 1 < Array.length)) {if (Array[i - 1][j + 1] == -1) {t++;}}if (j - 1 >= 0) {if (Array[i][j - 1] == -1) {t++;}}if (j + 1 < Array.length) {if (Array[i][j + 1] == -1) {t++;}}if ((i + 1 < Array.length) && (j - 1 >= 0)) {if (Array[i + 1][j - 1] == -1) {t++;}}if (i + 1 < Array.length) {if (Array[i + 1][j] == -1) {t++;}}if ((i + 1 < Array.length) && (j + 1 < Array.length)) {if (Array[i + 1][j + 1] == -1) {t++;}}Array[i][j] = t;}}}//遍历周围八个格子,记录雷的个数并赋值给当前位置}private boolean Judge(){for(int i = 0;i < m;i++){for(int j = i;j < m;j++){if((ArrayTestX[j] == ArrayTestX[j+1]) && (ArrayTestY[j] == ArrayTestY[j+1])){return true;}}}return false;}//此方法用于判断已产生的雷的雷点是否重复。public void fun(){for(int i = 0;i < Array.length;i++){for(int j = 0;j < Array.length;j++){System.out.print(Array[i][j]);}}}//此方法打印出平面数组
}

(二)
建立一个顶层容器JFrame,上面添加一个JPanel——JpMain,使用BorderLayout布局North为重新开始按钮,Center为雷区(我在这里新建了一个对象,把雷区进行了封装),South为选择难度区域(任然使用一个JPanel,上面添加JRadioButton单选器),废话不多说,下面给出我的顶层容器代码:
1.在Boom项目下新建Class,命名为SuperJpanel。
代码:

package boom;
/** 添加顶层容器* 设置雷区* 设置选择难度按钮,及其触发事件。* 设置根据难度不同调整容器大小。*/import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.net.URL;
import java.util.LinkedList;
import java.util.Queue;import boom.Block;import javax.swing.*;public class SuperJpanel extends JFrame{private static int X = 9;private static int Y = 9;//用与对选择难度时做中间变量private JPanel JpSouth = new JPanel();private Block block = new Block(X,Y);private CenterJpanel JpCenter;//初始化一个CenterJpanel对象,为雷区private JPanel JpMain ;//在顶层容器中添加一个JPanelprivate JButton JbRestart;//新建一个重新开始按钮private JRadioButton[] jrb = {new JRadioButton("初级",true),new JRadioButton("中级"),new JRadioButton("高级")};//新建选择按钮private ButtonGroup bg = new ButtonGroup();public SuperJpanel(){String UI = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";try {UIManager.setLookAndFeel(UI);} catch(Exception e){e.printStackTrace();}//设置整个面板显示格式JbRestart = new JButton("重新开始") ;JpCenter = new CenterJpanel(block.Array, block.ArrayTestX, block.ArrayTestY);JpMain = new JPanel();JpMain.setLayout(new BorderLayout());//设置布局方式为BorderLayout布局JbRestart.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO 自动生成的方法存根if (e.getSource() == JbRestart) {JpCenter.clear(block.Array);JpMain.remove(JpCenter);//先移除Center区域,block = new Block(block.Array.length,block.Array.length);//新生成一个不同的数组作为雷区JpCenter = new CenterJpanel(block.Array, block.ArrayTestX, block.ArrayTestY);//将雷区添加到Center中JpCenter.first(block.Array);//让雷区显示第一张卡片JpMain.add(JpCenter,BorderLayout.CENTER);//将Center添加到定层容器中JpMain.revalidate();//刷新整个面板} }});//重新开始按钮触发事件处理方式for(int i = 0;i < 3;i ++){JpSouth.add(jrb[i]);bg.add(jrb[i]);jrb[i].addItemListener(new ItemListener() {@Overridepublic void itemStateChanged(ItemEvent e) {// TODO 自动生成的方法存根if(e.getSource() == jrb[0]){//初级按钮X = 9;Y = 9;//设置对应雷区的X,Y轴的长度JpCenter.clear(block.Array);JpMain.remove(JpCenter);//任然移除Centerblock = new Block(X,Y);//新建一个初级的雷区JpCenter = new CenterJpanel(block.Array, block.ArrayTestX, block.ArrayTestY);JpCenter.first(block.Array);//翻到第一块卡片choose(X);//调用选择方法来设置整个面板的大小JpMain.add(JpCenter,BorderLayout.CENTER);JpMain.revalidate();}if(e.getSource() == jrb[1]){X = 16;Y = 16;JpCenter.clear(block.Array);JpMain.remove(JpCenter);block = new Block(X,Y);JpCenter = new CenterJpanel(block.Array, block.ArrayTestX, block.ArrayTestY);JpCenter.first(block.Array);choose(X);JpMain.add(JpCenter,BorderLayout.CENTER);JpMain.revalidate();}if(e.getSource() == jrb[2]){X = 30;Y = 30;JpCenter.clear(block.Array);JpMain.remove(JpCenter);block = new Block(X,Y);JpCenter = new CenterJpanel(block.Array, block.ArrayTestX, block.ArrayTestY);JpCenter.first(block.Array);choose(X);JpMain.add(JpCenter,BorderLayout.CENTER);JpMain.revalidate();}}});//难度选择按钮触发事件}JpMain.add(JpCenter,BorderLayout.CENTER);JpMain.add(JbRestart,BorderLayout.NORTH);JpMain.add(JpSouth,BorderLayout.SOUTH);//将三个区域添加进主面板中this.add(JpMain);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭结束this.setTitle("扫雷");this.setBounds(100, 100, 200, 300);//设置初始时顶层容器大小this.setResizable(false);//设置用户不可自己调整大小this.setVisible(true);}public void choose(int x){switch(x){case 9:this.setBounds(100, 100, 200, 300);break;case 16:this.setBounds(100, 100, 300, 380);break;case 30:this.setBounds(100, 100, 500, 580);break;}}//根据不同难度设置不同顶层容器大小
}

(三)
创建一个对象——雷区对象的初始化,整个雷区使用一个JPanel包含,这个JPanel使用GridLayout布局方式,雷区有多少个格子就添加多少个JPanel,使用卡片布局方式,每个JPanel中有两个卡片,第一个卡片为按钮,第二张卡片为JLabel——用于显示雷,周围雷的个数。
新建Class命名为CenterJpanel
注意:我在这里遇到的问题最多,首先我的想法是将遍历周围八个数组封装成方法,再递归调用,最后发现因为递归层次太多极其容易卡死,所以不得不另想办法,最后想到了使用队列,把每个0的点放入队列,直到判断到不为0的地方
代码:

package boom;import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.util.LinkedList;
import java.util.Queue;import javax.swing.*;public class CenterJpanel extends JPanel{private JPanel[][] jp;//有多少格子就对应产生多少JPanelprivate JLabel[][] jl;//设置第二层卡片显示的数字,雷private JButton[][] jb;//设置第一层卡片显示的按钮public CenterJpanel(int[][] Array,int[] ArrayTestX,int [] ArrayTestY){//根据传入数组的不同产生不同的雷区this.setLayout(new GridLayout(Array.length,Array.length,0,0));//设置雷区布局为网格布局jp = new JPanel[Array.length][Array.length];jl = new JLabel[Array.length][Array.length];jb = new JButton[Array.length][Array.length];for(int i = 0;i < Array.length;i++){for(int j = 0;j < Array.length;j++){jp[i][j] = new JPanel();jp[i][j].setLayout(new CardLayout());jb[i][j] = new JButton();jb[i][j].setBorder(BorderFactory.createRaisedBevelBorder());jp[i][j].add(jb[i][j],"card1");//添加按钮到第一层卡片jb[i][j].addActionListener(new ActionListener() {//设置按钮触发事件@Overridepublic void actionPerformed(ActionEvent e) {// TODO 自动生成的方法存根       for (int i = 0; i < Array.length; i++) {for (int j = 0; j < Array[i].length; j++) {if (e.getSource() == jb[i][j]) {if (Array[i][j] == -1) {for (int x = 0; x < ArrayTestX.length; x++) {CardLayout cl = (CardLayout) jp[ArrayTestX[x]][ArrayTestY[x]].getLayout();cl.show(jp[ArrayTestX[x]][ArrayTestY[x]],"card2");}//若为雷,则游戏结束,显示所有雷(因为A让raytestX,Y分别对应记录了雷的位置,直接遍历就OK)for (int m = 0; m < Array.length; m++) {for (int n = 0; n < Array[m].length; n++) {jb[m][n].setEnabled(false);}}//并且使整个雷区按钮不可再触发} else if (Array[i][j] == 0) {//若为0,则显示周围八个格子除雷以外的每个格子的的周围八个雷的个数,若有为0的再遍历CardLayout cl = (CardLayout) jp[i][j].getLayout();cl.show(jp[i][j], "card2");Ergodic(Array,i, j);//遍历周围八个格子。} else {CardLayout cl = (CardLayout) jp[i][j].getLayout();cl.show(jp[i][j], "card2");}//若不为0也不为雷则显示周围雷的个数}}}}});jl[i][j] = new JLabel();//设置第二层卡片jl[i][j].setBorder(BorderFactory.createLoweredBevelBorder());//设置JLabel显示为凹下去,便于美观jl[i][j].setFont(new java.awt.Font("微软雅黑", 1, 14));//设置字体if(Array[i][j] == -1){URL imgURL = SuperJpanel.class.getResource("b.png");ImageIcon icon = new ImageIcon(imgURL);jl[i][j].setIcon(icon); ;}//若为雷则显示地雷图片else if(Array[i][j] == 0){jl[i][j].setText("");}//若为0则什么也不显示else{if(Array[i][j] == 1){jl[i][j].setForeground(Color.BLUE);}if(Array[i][j] == 2){jl[i][j].setForeground(Color.GREEN);}if(Array[i][j] == 3){jl[i][j].setForeground(Color.RED);}if(Array[i][j] == 4){jl[i][j].setForeground(Color.cyan);}if(Array[i][j] == 5){jl[i][j].setForeground(Color.yellow);}jl[i][j].setText(Integer.toString(Array[i][j]));}//若为周围雷的个数则设置每个数字的颜色不同jp[i][j].add(jl[i][j],"card2");this.add(jp[i][j]);}}}public void Ergodic(int[][] Array,int i, int j) {Queue<Integer> qi = new LinkedList<Integer>();Queue<Integer> qj = new LinkedList<Integer>();if ((i - 1 >= 0) && (j - 1 >= 0)) {if ((Array[i - 1][j - 1] == 0)) {CardLayout cl = (CardLayout) jp[i - 1][j - 1].getLayout();cl.show(jp[i - 1][j - 1], "card2");qi.offer(i - 1);qj.offer(j - 1);Array[i - 1][j - 1] = -2;} else if ((Array[i - 1][j - 1] != -1)) {CardLayout cl = (CardLayout) jp[i - 1][j - 1].getLayout();cl.show(jp[i - 1][j - 1], "card2");}}if (i - 1 >= 0) {if ((Array[i - 1][j] == 0)) {CardLayout cl = (CardLayout) jp[i - 1][j].getLayout();cl.show(jp[i - 1][j], "card2");qi.offer(i - 1);qj.offer(j);Array[i - 1][j] = -2;} else if ((Array[i - 1][j] != -1)) {CardLayout cl = (CardLayout) jp[i - 1][j].getLayout();cl.show(jp[i - 1][j], "card2");}}if ((i - 1 >= 0) && (j + 1 < Array.length)) {if ((Array[i - 1][j + 1] == 0)) {CardLayout cl = (CardLayout) jp[i - 1][j + 1].getLayout();cl.show(jp[i - 1][j + 1], "card2");qi.offer(i - 1);qj.offer(j + 1);Array[i - 1][j + 1] = -2;} else if ((Array[i - 1][j + 1] != -1)) {CardLayout cl = (CardLayout) jp[i - 1][j + 1].getLayout();cl.show(jp[i - 1][j + 1], "card2");}}if (j - 1 >= 0) {if ((Array[i][j - 1] == 0)) {CardLayout cl = (CardLayout) jp[i][j - 1].getLayout();cl.show(jp[i][j - 1], "card2");qi.offer(i);qj.offer(j - 1);Array[i][j - 1] = -2;} else if ((Array[i][j - 1] != -1)) {CardLayout cl = (CardLayout) jp[i][j - 1].getLayout();cl.show(jp[i][j - 1], "card2");}}if (j + 1 < Array.length) {if ((Array[i][j + 1] == 0)) {CardLayout cl = (CardLayout) jp[i][j + 1].getLayout();cl.show(jp[i][j + 1], "card2");qi.offer(i);qj.offer(j + 1);Array[i][j + 1] = -2;} else if ((Array[i][j + 1] != -1)) {CardLayout cl = (CardLayout) jp[i][j + 1].getLayout();cl.show(jp[i][j + 1], "card2");}}if ((i + 1 < Array.length) && (j - 1 >= 0)) {if ((Array[i + 1][j - 1] == 0)) {CardLayout cl = (CardLayout) jp[i + 1][j - 1].getLayout();cl.show(jp[i + 1][j - 1], "card2");qi.offer(i + 1);qj.offer(j - 1);Array[i + 1][j - 1] = -2;} else if ((Array[i + 1][j - 1] != -1)) {CardLayout cl = (CardLayout) jp[i + 1][j - 1].getLayout();cl.show(jp[i + 1][j - 1], "card2");}}if (i + 1 < Array.length) {if ((Array[i + 1][j] == 0)) {CardLayout cl = (CardLayout) jp[i + 1][j].getLayout();cl.show(jp[i + 1][j], "card2");qi.offer(i + 1);qj.offer(j);Array[i + 1][j] = -2;} else if ((Array[i + 1][j] != -1)) {CardLayout cl = (CardLayout) jp[i + 1][j].getLayout();cl.show(jp[i + 1][j], "card2");}}if ((i + 1 < Array.length) && (j + 1 < Array.length)) {if ((Array[i + 1][j + 1] == 0)) {CardLayout cl = (CardLayout) jp[i + 1][j + 1].getLayout();cl.show(jp[i + 1][j + 1], "card2");qi.offer(i + 1);qj.offer(j + 1);Array[i + 1][j + 1] = -2;} else if ((Array[i + 1][j + 1] != -1)) {CardLayout cl = (CardLayout) jp[i + 1][j + 1].getLayout();cl.show(jp[i + 1][j + 1], "card2");}}//遍历八个格子,分别判断每个格子属性,若为0则显示,再将此点放入队列,更改数值(以免进入无线循环。)while ((qi.peek() != null) && (qj.peek() != null)) {int a = qi.poll();int b = qj.poll();if ((a - 1 >= 0) && (b - 1 >= 0)) {if ((Array[a - 1][b - 1] == 0)) {CardLayout cl = (CardLayout) jp[a - 1][b - 1].getLayout();cl.show(jp[a - 1][b - 1], "card2");qi.offer(a - 1);qj.offer(b - 1);Array[a - 1][b - 1] = -2;} else if ((Array[a - 1][b - 1] != -1)) {CardLayout cl = (CardLayout) jp[a - 1][b - 1].getLayout();cl.show(jp[a - 1][b - 1], "card2");}}if (a - 1 >= 0) {if ((Array[a - 1][b] == 0)) {CardLayout cl = (CardLayout) jp[a - 1][b].getLayout();cl.show(jp[a - 1][b], "card2");qi.offer(a - 1);qj.offer(b);Array[a - 1][b] = -2;} else if ((Array[a - 1][b] != -1)) {CardLayout cl = (CardLayout) jp[a - 1][b].getLayout();cl.show(jp[a - 1][b], "card2");}}if ((a - 1 >= 0) && (b + 1 < Array.length)) {if ((Array[a - 1][b + 1] == 0)) {CardLayout cl = (CardLayout) jp[a - 1][b + 1].getLayout();cl.show(jp[a - 1][b + 1], "card2");qi.offer(a - 1);qj.offer(b + 1);Array[a - 1][b + 1] = -2;} else if ((Array[a - 1][b + 1] != -1)) {CardLayout cl = (CardLayout) jp[a - 1][b + 1].getLayout();cl.show(jp[a - 1][b + 1], "card2");}}if (b - 1 >= 0) {if ((Array[a][b - 1] == 0)) {CardLayout cl = (CardLayout) jp[a][b - 1].getLayout();cl.show(jp[a][b - 1], "card2");qi.offer(a);qj.offer(b - 1);Array[a][b - 1] = -2;} else if ((Array[a][b - 1] != -1)) {CardLayout cl = (CardLayout) jp[a][b - 1].getLayout();cl.show(jp[a][b - 1], "card2");}}if (b + 1 < Array.length) {if ((Array[a][b + 1] == 0)) {CardLayout cl = (CardLayout) jp[a][b + 1].getLayout();cl.show(jp[a][b + 1], "card2");qi.offer(a);qj.offer(b + 1);Array[a][b + 1] = -2;} else if ((Array[a][b + 1] != -1)) {CardLayout cl = (CardLayout) jp[a][b + 1].getLayout();cl.show(jp[a][b + 1], "card2");}}if ((a + 1 < Array.length) && (b - 1 >= 0)) {if ((Array[a + 1][b - 1] == 0)) {CardLayout cl = (CardLayout) jp[a + 1][b - 1].getLayout();cl.show(jp[a + 1][b - 1], "card2");qi.offer(a + 1);qj.offer(b - 1);Array[a + 1][b - 1] = -2;} else if ((Array[a + 1][b - 1] != -1)) {CardLayout cl = (CardLayout) jp[a + 1][b - 1].getLayout();cl.show(jp[a + 1][b - 1], "card2");}}if (a + 1 < Array.length) {if ((Array[a + 1][b] == 0)) {CardLayout cl = (CardLayout) jp[a + 1][b].getLayout();cl.show(jp[a + 1][b], "card2");qi.offer(a + 1);qj.offer(b);Array[a + 1][b] = -2;} else if ((Array[a + 1][b] != -1)) {CardLayout cl = (CardLayout) jp[a + 1][b].getLayout();cl.show(jp[a + 1][b], "card2");}}if ((a + 1 < Array.length) && (b + 1 < Array.length)) {if ((Array[a + 1][b + 1] == 0)) {CardLayout cl = (CardLayout) jp[a + 1][b + 1].getLayout();cl.show(jp[a + 1][b + 1], "card2");qi.offer(a + 1);qj.offer(b + 1);Array[a + 1][b + 1] = -2;} else if ((Array[a + 1][b + 1] != -1)) {CardLayout cl = (CardLayout) jp[a + 1][b + 1].getLayout();cl.show(jp[a + 1][b + 1], "card2");}}}}//队列中再分别判断每个点的周围的八个格子,若仍为0,则再放入队列。之道遍历到边界或者不为0的点public void clear(int[][] Array){for(int i = 0;i < Array.length;i ++){for(int j = 0;j < Array.length;j ++){jp[i][j].remove(jl[i][j]);jp[i][j].remove(jb[i][j]);this.remove(jp[i][j]);}}}//此方法清除每个JPanel上的卡片public void first(int[][] Array){for(int i = 0;i < Array.length;i ++){for(int j = 0;j < Array.length;j ++){CardLayout cl = (CardLayout) jp[i][j].getLayout();cl.first(jp[i][j]);}}}//此方法显示卡片一
}

(四)
新建Class ——BoomMain 勾选产生主函数
主函数,直接初始化一个SuperJpanel对象就是
代码:

package boom;public class BoomMain{public static void main(String[] args) {// TODO 自动生成的方法存根new SuperJpanel();//Block1 b = new Block1(16,16);//b.fun();}}

需要整个工程的请说明

扫雷:我的Java之路--第一个小作品相关推荐

  1. Java写的第一个小游戏

    实现思路 1.如何分析? 第一步:发现类(对象) 人物-小丑(敌方-友方) 子弹-帽子 墙体 爆炸物 第二步:发现属性 小丑: 宽高 , 位置(x y), 移动速度 帽子: 宽高 , 位置(x y), ...

  2. java新手的第一个小东西,或许小东西都算不上=。 =

    import java.util.ArrayList; import java.util.Scanner; /** * 系统类 * * @author Administrator * */ publi ...

  3. Java写的第一个小游戏(续)

    优化代码(数据维护): 注:此为小游戏最终版本 代码做到最优最简 基于之前发表的文章详情可见 点击查看前文 回顾之前的代码我们可以看到很多的固定常量值或是属性我们都会大量的重复使用,这并不符合我们代码 ...

  4. 菜鸟haqima的Java学习之路第一天

    菜鸟haqima的Java学习之路第一天 导读:DOS命令 常用快捷键 Java的简单概述 (第一章 Java开发环境的搭建) 1.常用的DOS命令 1.1.怎么打开DOS命令窗口 win键+r(组合 ...

  5. 萌新的java学习之路——第一周

    萌新的java学习之路--第一周 第一周的学习 这是我学习Java的第一周,写这个博客更多的时为了总结自己这一周的学习情况,如果有人看到我写的博客,有什么问题的话,可以问我.虽然我也是一个小白,但我会 ...

  6. 20165203 2017-2018-2 《Java程序设计》第一周学习总结

    20165203 2017-2018-2<Java程序设计>第一周学习总结 教材学习内容总结 (一)Java的地位 Java是面向对象编程,并涉及网络.多线程等重要的基础知识,是一门很好的 ...

  7. 大学本科 java教材,大学本科自学java之路——IO

    大学本科自学java之路--IO 大学本科自学java之路--IO 我现在大三,大一,大二就是玩,现在大三准备考虑就业了,特写博客便于坚持自己学习 一. 字节缓冲流的构造方法: BufferedOut ...

  8. 学不可以已!我一年Java之路的回顾,反思以及展望

    大约就是在去年的这个时候吧,Java这个字眼就开始占据了我学习计划中的重要席位,从那时候那杯冒热气的咖啡一直陪伴我到今天.也不知道当时为什么要学 习Java,又是为什么选择了Java.因为我记得当时的 ...

  9. 学不可以已--我一年Java之路的回顾,反思以及展望(上)

    学不可以已 ――我一年Java之路的回顾,反思以及展望 大约就是在去年的这个时候吧,Java这个字眼就开始占据了我学习计划中的重要席位,从那时候那杯冒热气的咖啡一直陪伴我到今天.也不知道当时为什么要学 ...

最新文章

  1. AspxCallBack控件的CallBack事件
  2. 数据结构面试的常客,一文带你深入了解堆
  3. rmi 反序列化漏洞_IDEA动态调试(二)——反序列化漏洞(Fastjson)
  4. extjs--combox用法
  5. 『设计模式』设计模式--模板方法模式
  6. js 操作location URL对象进行操作
  7. 深度残差收缩网络再次理解(论文地址+代码地址+代码理解)
  8. C++ vector所有操作,你真的掌握vector了吗?两万总结带你干穿vector
  9. Linux 进程控制相关函数
  10. python内置max()、min()函数与Numpy自带的max()、min()函数性能对比分析
  11. thingjs这个3D js库怎么样?
  12. 新浪云部署javaweb项目
  13. Qt报错 error: C1083
  14. 时光轴全新导购网站购物新体验
  15. Cisco路由器配置Ipsec
  16. 400家门店直接“云”上办公 JASONWOOD 是如何做到的?
  17. 【科普】准大一新生如何挑选笔记本电脑
  18. C# DLL资源文件打包(图片、JS、CSS)[WebResource]
  19. 写给女儿青春生日的信(转载)
  20. 小米 红米4(标准版)线刷兼救砖_解账户锁_纯净刷机包_教程

热门文章

  1. 基于node的毕业设计学生宿舍寝室管理系统
  2. 视频时长太长,怎么才能快速去头去尾
  3. C语言编程: 在BMP图片上添加图片水印
  4. TCP报文的标志字段
  5. Method的invoke方法初步了解
  6. python把object转换成int_python – Pandas:将dtype’object’转换为int
  7. C语言顺序栈实现代码
  8. 谷歌浏览器关闭搜索历史提示
  9. linux系统获取4G模块IMEI号
  10. 软件质量管理-5-估算、计划和跟踪