业务需求->业务对象模型(对象关系)->数据建模->类的设计->概要编码->详细功能设计

基本规则:

1)俄罗斯方块都是由一个个Cell构成的:

行宽:10,列高:20,以每个小正方形为单位

2)其次,所有的俄罗斯方块都是一组由4个小型正方形组成的规则图形Tetromino

分别为:S、Z、L、J、I、O、T这几种

数据结构设计:

Cell     格子

|--     int row 行

|--     int col 列

|--     Image image 贴图

Tetromino     四格方块,有7个子类

|--     Cell[] cells     包含4个格子

Tetris     俄罗斯方块

|--     int score     分数

|--     int lines      行数

|--     Cell[][] wall = new Cell[20][10]     20*10的墙

|--     Tetromino tetromino     正在下落的方块

|--     Trtromino nextOne        下一个下落方块

其次是功能:

下落移动功能

旋转流程

定时自动下落

暂停

继续

结束游戏

算法设计:

4格方块的初始形态:I S Z J L T O

就在初始数据的数值状态设计

四格方块的下落计算: 就是将每个格子的row+1

四格子方块的左右移动计算:就是将每个格子的col+1或col-1

下落流程控制:控制方块下落与墙之间的控制关系

1) 如果"能够下落", 就下落一步

2) 否则就"着陆到墙里面"

3) 着落以后, "销毁充满的行", 并且记分

4) 检查游戏是否结束

5) 如果没有结束,还能玩,就生成下一个方块

分数计算

界面的绘制

键盘事件控制

旋转流程控制

加速下降流程控制

记分

开始流程控制(Timer)

主刷新(Timer)频率: 1/100 秒

0.5秒执行一次下落(是主刷新的50倍)

利用定时器定时的调用 下落流程

如果暂停时候, 就不执行下落流程来

实现过程:

1) 在Tetris类中添加属性 Timer, 用于启动主刷新频率

2) 在Tetris类中添加属性 level 是下落的间隔次数

如: 50 表示50次刷新以后,执行一次 下落, 如果减少,

加快下落

3)  在Tetris类中添加属性 stepIndex 是下落计数

每当 stepIndex % level == 0 时候 执行一次 下落

4) 在Tetris类中添加属性  pause 暂停执行状态控制

5) 在action() 方法添加主刷新Timer的启动

在主刷新中 添加代码 控制下落

绘制背景图片

1) 在Tetris类中声明静态变量 background

2) 使用静态代码块 加载磁盘文件到内存对象

将使用到 图片读取API: ImageIO

3) 在paint 方法中绘制背景图片

绘制 正在下落的方块

1) 先在action方法中生产 正在下落的方块和下一个方块

2) 在paint方法中调用 paintTetromino()方法

3) 在Tetris类中 增加paintTetromino()方法

将正在下落的4格方块的每个格子逐一绘制出来

使方块移动

1) 处理键盘事件(API), 获得用户何时按下 ->

2) 当按下 -> 按键时候, 执行当前4格方块 向右移动 方法

3) 向右移动 方法 会改变当前4格方块的每个格子的列坐标

4) 调用继承于JPanel类的 repaint(), 这个方法会尽快的

调用 paint()

5) paint() 会根据当前数据(已经被右移动改变的数据)

绘制全部面板效果

以下是源码:

Cell.java(格子类)

1 packagecom.timmy.tetris;2 importjava.awt.Image;3 public classCell {4 /**

5 *一个格子6 */

7 private introw;8 private intcol;9 privateImage image;10 public Cell(int row,intcol,Image image){11 this.row =row;12 this.col =col;13 this.image =image;14 }15

16 //toString打印行列,方便调试

17 publicString toString(){18 return "["+row+","+col+"]";19 }20

21 public voiddrop(){22 row++;23 }24

25 public voidmoveLeft(){26 col--;27 }28

29 public voidmoveRight(){30 col++;31 }32

33

34 public void setRow(introw){35 this.row =row;36 }37

38 public intgetRow(){39 returnrow;40 }41 public intgetCol() {42 returncol;43 }44 public void setCol(intcol) {45 this.col =col;46 }47 publicImage getImage() {48 returnimage;49 }50 public voidsetImage(Image image) {51 this.image =image;52 }53 }

Tetromino.java(四格方块类)

1 packagecom.timmy.tetris;2 importjava.util.Random;3 //抽象类

4 public abstract classTetromino {5 /**

6 * 四格方块类7 */

8 //是留给子类的,所以用保护

9 protected Cell[] cells = new Cell[4];10 protected State[] states;//旋转状态

11

12 /**私有构造器,不会有子类*/

13 privateTetromino(){14 }15

16 /**内部类、旋转*/

17 protected classState{18 introw0,col0,row1,col1,row2,col2,row3,col3;19 public State(int row0, int col0, int row1, int col1, introw2,20 int col2, int row3, intcol3) {21 super();22 this.row0 =row0;23 this.col0 =col0;24 this.row1 =row1;25 this.col1 =col1;26 this.row2 =row2;27 this.col2 =col2;28 this.row3 =row3;29 this.col3 =col3;30 }31 }32

33 /**旋转下标*/

34 private int index = 10000;35

36 /**向右转*/

37 public voidrotateRight(){38 index++; //10001

39 State s = states[index%states.length];//取余是[1]40 //s = s1

41 Cell o = cells[0];//找到0号格子作为旋转轴

42 int row =o.getRow();43 int col =o.getCol();44 cells[1].setRow(row+s.row1);45 cells[1].setCol(col+s.col1);46 cells[2].setRow(row+s.row2);47 cells[2].setCol(col+s.col2);48 cells[3].setRow(row+s.row3);49 cells[3].setCol(col+s.col3);50 }51

52 /**向左转*/

53 public voidrotateLeft(){54 index--;55 State s = states[index%states.length];56 Cell o = cells[0];57 int row =o.getRow();58 int col =o.getCol();59 cells[1].setRow(row+s.row1);60 cells[1].setCol(col+s.col1);61 cells[2].setRow(row+s.row2);62 cells[2].setCol(col+s.col2);63 cells[3].setRow(row+s.row3);64 cells[3].setCol(col+s.col3);65 }66

67 /**下落一步*/

68 public voidsoftDrop(){69 for(int i=0;i

86 }87

88 //简单工厂方法模式:

89 public staticTetromino randomOne(){90 Random r = newRandom();91 int type = r.nextInt(7);92 switch(type){93 case 0: return newT();94 case 1: return newI();95 case 2: return newS();96 case 3: return newZ();97 case 4: return newL();98 case 5: return newJ();99 case 6: return newO();100 }101 return null;102 }103

104 //利用私有内部类,封装了子类实现的细节,永远只有7种子类105 //静态会造成用类名直接访问,外部不知道,别人不能new

106 private static class T extendsTetromino{107 publicT(){108 cells[0] = new Cell(0,4,Tetris.T);109 cells[1] = new Cell(0,3,Tetris.T);110 cells[2] = new Cell(0,5,Tetris.T);111 cells[3] = new Cell(1,4,Tetris.T);112 states = new State[4];113 states[0] = new State(0,0,0,-1,0,1,1,0);114 states[1] = new State(0,0,-1,0,1,0,0,-1);115 states[2] = new State(0,0,0,1,0,-1,-1,0);116 states[3] = new State(0,0,1,0,-1,0,0,1);117 }118 }119 private static class I extendsTetromino{120 publicI(){121 cells[0] = new Cell(0,4,Tetris.I);122 cells[1] = new Cell(0,3,Tetris.I);123 cells[2] = new Cell(0,5,Tetris.I);124 cells[3] = new Cell(0,6,Tetris.I);125 states = new State[2];126 states[0] = new State(0,0,0,-1,0,1,0,2);127 states[1] = new State(0,0,-1,0,1,0,2,0);128 }129

130 }131 private static class S extendsTetromino{132 publicS(){133 cells[0] = new Cell(0,4,Tetris.S);134 cells[1] = new Cell(0,5,Tetris.S);135 cells[2] = new Cell(1,3,Tetris.S);136 cells[3] = new Cell(1,4,Tetris.S);137 states = new State[2];138 states[0] = new State(0,0,1,0,-1,-1,0,-1);139 states[1] = new State(0,0,0,1,1,-1,1,0);140

141 }142

143 }144 private static class Z extendsTetromino{145 publicZ(){146 cells[0] = new Cell(1,4,Tetris.Z);147 cells[1] = new Cell(0,3,Tetris.Z);148 cells[2] = new Cell(0,4,Tetris.Z);149 cells[3] = new Cell(1,5,Tetris.Z);150 states = new State[2];151 states[0] = new State(0,0,-1,1,0,1,1,0);152 states[1] = new State(0,0,-1,-1,-1,0,0,1);153 }154

155 }156 private static class L extendsTetromino{157 publicL(){158 cells[0] = new Cell(0,4,Tetris.L);159 cells[1] = new Cell(0,3,Tetris.L);160 cells[2] = new Cell(0,5,Tetris.L);161 cells[3] = new Cell(1,3,Tetris.L);162 states = new State[4];163 states[0] = new State(0,0,-1,0,1,0,-1,-1);164 states[1] = new State(0,0,0,1,0,-1,-1,1);165 states[2] = new State(0,0,1,0,-1,0,1,1);166 states[3] = new State(0,0,0,-1,0,1,1,-1);167 }168

169 }170 private static class J extendsTetromino{171 publicJ(){172 cells[0] = new Cell(0,4,Tetris.J);173 cells[1] = new Cell(0,3,Tetris.J);174 cells[2] = new Cell(0,5,Tetris.J);175 cells[3] = new Cell(1,5,Tetris.J);176 states = new State[4];177 states[0] = new State(0,0,-1,0,1,0,1,-1);178 states[1] = new State(0,0,0,1,0,-1,-1,-1);179 states[2] = new State(0,0,1,0,-1,0,-1,1);180 states[3] = new State(0,0,0,-1,0,1,1,1);181 }182

183 }184 private static class O extendsTetromino{185 publicO(){186 cells[0] = new Cell(0,4,Tetris.O);187 cells[1] = new Cell(0,5,Tetris.O);188 cells[2] = new Cell(1,4,Tetris.O);189 cells[3] = new Cell(1,5,Tetris.O);190 states = new State[1];191 states[0] = new State(0,0,0,1,1,0,1,1);192 }193

194 }195 }

Tetris.java(俄罗斯方块类【主类】)

1 packagecom.timmy.tetris;2 importjava.awt.Color;3 importjava.awt.Font;4 importjava.awt.Graphics;5 importjava.awt.Image;6 importjava.awt.event.KeyAdapter;7 importjava.awt.event.KeyEvent;8 importjava.awt.event.KeyListener;9 importjava.util.Arrays;10 importjava.util.Timer;11 importjava.util.TimerTask;12 importjavax.imageio.ImageIO;13 importjavax.swing.JPanel;14 importjavax.swing.JFrame;15 //JPanel 图形界面上能够显示的空白面板(空白矩形区域)16 //扩展了面板为 俄罗斯方块,扩展出 分数 和 正在下落的17 //方块,以及下一个下落的方块

18 public class Tetris extendsJPanel{19 /**

20 * 俄罗斯方块类,继承于JPanel21 */

22 public static final int ROWS = 20;23 public static final int COLS = 10;24 //格子的绘制大小

25 public static final int CELL_SIZE = 26;26 //行数

27 private intlines;28 //分数

29 private intscore;30 //字体颜色

31 public static final int FONT_COLOR =0x667799;32 public static final int FONT_SIZE = 30;33

34 private booleanpause;35 private booleangameOver;36 privateTimer timer;37 //时间间隔

38 private int inteval = 500;39 //墙

40 private Cell[][] wall = new Cell[20][10];41 //正在下落的方块

42 privateTetromino tetromino;43 //下一个方块

44 privateTetromino nextOne;45 //分数表,用于针对一次性消除不同行数,给不同分数

46 private int[] scoreTable= {0,1,5,10,20};47 //利用静态代码块静态加载图片资源48 //将磁盘上的图片文件,加载到内存中的图片对象

49 public staticImage background;50 public staticImage gameOverImg;51 public staticImage I;52 public staticImage T;53 public staticImage S;54 public staticImage Z;55 public staticImage L;56 public staticImage J;57 public staticImage O;58

59 static {//静态代码块,只执行一次60 //Class类提供了方法getResource()可以定位61 //package中的文件位置62 //图片文件到内存中的对象63 //tetris.png 文件与Tetris.class 在同一个包中

64 try{65 Class cls = Tetris.class;66 background = ImageIO.read(cls.getResource("tetris.png"));67 gameOverImg = ImageIO.read(cls.getResource("game-over.png"));68 I = ImageIO.read(cls.getResource("I.png"));69 L = ImageIO.read(cls.getResource("L.png"));70 J = ImageIO.read(cls.getResource("J.png"));71 O = ImageIO.read(cls.getResource("O.png"));72 S = ImageIO.read(cls.getResource("S.png"));73 T = ImageIO.read(cls.getResource("T.png"));74 Z = ImageIO.read(cls.getResource("Z.png"));75 }catch(Exception e){76 e.printStackTrace();77 }78 }79

80 /**画界面*/

81 //重写父类JPanel 类的 paint方法(绘图方法)82 //重写之后修改了父类的paint方法,目的是实现自定义绘制83 //Graphics 理解为一个绑定到当前面板的画笔

84 public voidpaint(Graphics g){85 g.drawImage(background, 0, 0, null);86 //坐标系平移

87 g.translate(15,15);88 //画墙

89 paintWall(g);90 //画下落方块

91 paintTetromino(g);92 //画下一个下落的方块

93 paintnextOne(g);94 //画分数

95 paintScore(g);96 if(gameOver){97 g.translate(-5, -5);98 g.drawImage(gameOverImg,0,0,null);99 }100 }101

102 /**绘制分数*/

103 private voidpaintScore(Graphics g) {104

105 int x = 289;106 int y = 165;107 g.setColor(newColor(FONT_COLOR));108 Font font = getFont();//获得系统字体

109 font = newFont(font.getFontName(),font.BOLD,FONT_SIZE);110 g.setFont(font);111 String str = "SCORE:" +score;112 g.drawString(str, x, y);113 y+= 54;114 str = "LINES:" +lines;115 g.drawString(str, x, y);116 y+= 54;117 str = "[P]Pause";118 if(pause){119 str = "[C]CONTINUE";120 }121 if(gameOver){122 str = "[S]RESTART";123 }124 g.drawString(str, x, y);125 }126

127 /**绘制墙,就是将Wall数组的内容绘制到界面*/

128 private voidpaintWall(Graphics g){129 for(int row=0;row

131 Cell[] line =wall[row];132 for(int col=0;col

134 Cell cell =line[col];135 int x = col*CELL_SIZE;136 int y = row*CELL_SIZE;137 if(cell==null){138 g.setColor(new Color(0));//黑色139 //画方块

140 g.drawRect(x, y,CELL_SIZE, CELL_SIZE);141 }else{142 g.drawImage(cell.getImage(), x-1, y-1, null);143 }144 }145 }146 }147

148 /**启动软件*/

149 public voidaction(){150 startAction();151 repaint();//JPanel 中的重绘方法,会尽快调用paint152 //键盘按键监听器,KeyListener是KeyAdapter的父类153 //利用匿名内部类

154 KeyListener l = newKeyAdapter() {155 //如果有按键按下,就会执行

156 public voidkeyPressed(KeyEvent e){157 int key =e.getKeyCode();158 if(key ==KeyEvent.VK_Q){159 System.exit(0);//结束程序

160 }161 if(gameOver){162 if(key ==KeyEvent.VK_S){163 startAction();164 repaint();165 }166 return;167 }168 if(pause){169 if(key ==KeyEvent.VK_C){170 continueAction();171 }172 return; //提前结束方法,不再处理后续事件

173 }174 switch(key){175 caseKeyEvent.VK_DOWN:softDropAction();176 break;177 caseKeyEvent.VK_RIGHT:moveRightAction();178 break;179 caseKeyEvent.VK_LEFT:moveLeftAction();180 break;181 caseKeyEvent.VK_UP:rotateRightAction();182 break;183 caseKeyEvent.VK_SPACE:hardDropAction();184 break;185 caseKeyEvent.VK_P:pauseAction();186 break;187 }188 repaint();//重绘

189 }190 };191 //将键盘监听器对象,添加到面板上

192 this.addKeyListener(l);//this 代表当前俄罗斯方块面板

193 this.requestFocus();//获得焦点

194 }195

196 /**方块旋转*/

197 private voidrotateRightAction() {198 tetromino.rotateRight();199 if(outOfBounds() ||coincide()){200 tetromino.rotateLeft();201 }202 }203

204 /**画正在下落块*/

205 public voidpaintTetromino(Graphics g){206 //如果没有正在下落的方块,就不绘制

207 if(tetromino==null){208 return;209 }210 Cell[] cells =tetromino.cells;211 for(int i=0;i

219 /**画下一个方块*/

220 public voidpaintnextOne(Graphics g){221 //如果没有正在下落的方块,就不绘制

222 if(tetromino==null){223 return;224 }225 Cell[] cells =nextOne.cells;226 for(int i=0;i

234 /**下落方法*/

235 private voidsoftDropAction(){236 if(canDrop()){237 tetromino.softDrop();238 }else{239 landToWall();240 destroyLines();241 checkGameOver();242 tetromino =nextOne;243 nextOne =Tetromino.randomOne();244 }245 }246

247 /**检查当前方块是否能下落*/

248 private booleancanDrop(){249 Cell[] cells =tetromino.cells;250 //检查当前方块是否到达底部

251 for(Cell cell: cells){252 int row =cell.getRow();253 if(row==ROWS-1){254 return false;255 }256 }257 //检查是否到墙

258 for(Cell cell:cells){259 int row =cell.getRow();260 int col =cell.getCol();261 if(wall[row+1][col]!=null){262 return false;263 }264 }265 return true;266 }267 /**着陆到墙*/

268 private voidlandToWall(){269 Cell[] cells =tetromino.cells;270 for(Cell cell:cells){271 int row =cell.getRow();272 int col =cell.getCol();273 wall[row][col] =cell;274 }275 }276

277 /**硬下落*/

278 public voidhardDropAction(){279 while(canDrop()){280 tetromino.softDrop();281 }282 landToWall();283 destroyLines();284 checkGameOver();285 tetromino =nextOne;286 nextOne =Tetromino.randomOne();287 }288

289 /**消除行*/

290 private voiddestroyLines(){291 int lines = 0;292 for(int row=0;row

302 /**检查是否这行是否满*/

303 private boolean fullCells(introw){304 Cell[] line =wall[row];305 for(Cell cell:line){306 if(cell==null){307 return false;308 }309 }310 return true;311 }312

313 /**删除行*/

314 private void deleteLine(introw){315 for(int i=row;i>=1;i--){316 //wall[i-1]->wall[i]

317 System.arraycopy(wall[i-1], 0, wall[i], 0, COLS);318 }319 Arrays.fill(wall[0], null);//第零行归零

320 }321

322 /**检查是否游戏结束*/

323 private voidcheckGameOver(){324 if(wall[0][4] != null){325 gameOver = true;326 timer.cancel();327 repaint();328 }329 }330

331 /**向左移动*/

332 private voidmoveLeftAction(){333 tetromino.moveLeft();334 if(outOfBounds() ||coincide()){335 tetromino.moveRight();336 }337 repaint();338 }339

340 /**向右移动*/

341 private voidmoveRightAction(){342 tetromino.moveRight();343 //检查顺序一定是先检查是否出界,再检查是否重合

344 if(outOfBounds() ||coincide()){345 tetromino.moveLeft();346 }347 repaint();348 }349

350 /**检查出界*/

351 private booleanoutOfBounds(){352 Cell[] cells =tetromino.cells;353 for(Cell cell : cells){354 int col =cell.getCol();355 if(col<0 || col>=COLS){356 return true;357 }358 }359 return false;360 }361

362 /**检查格子是否会重合*/

363 private booleancoincide(){364 Cell[] cells =tetromino.cells;365 for(Cell cell : cells){366 int row =cell.getRow();367 int col =cell.getCol();368 if(row>=0 && row=0 && col

375 /**开始*/

376 public voidstartAction(){377 pause = false;378 gameOver = false;379 score = 0;380 lines = 0;381 for(Cell[] line : wall){382 Arrays.fill(line, null);383 }384 tetromino =Tetromino.randomOne();385 nextOne =Tetromino.randomOne();386 TimerTask task = newTimerTask() {387 public voidrun(){388 softDropAction();389 repaint();390 }391 };392 timer = newTimer();393 timer.schedule(task, inteval, inteval);394 }395

396 /**暂停*/

397 public voidpauseAction(){398 timer.cancel();399 pause = true;400 }401

402 /**继续*/

403 public voidcontinueAction(){404 pause = false;405 timer = newTimer();406 timer.schedule(newTimerTask(){407 public voidrun(){408 softDropAction();409 repaint();410 }411 },inteval,inteval);412 pause = false;413 }414

415 /**main 方法*/

416

417 public static voidmain(String[] args) {418 JFrame frame = new JFrame("俄罗斯方块");//窗口框

419 Tetris tetris = new Tetris();//Tetris 继承了JPanel420 //Tetris 也是面板,面板可以放到frame中显示

421

422 frame.add(tetris);423 //去处窗口装饰

424 frame.setUndecorated(true);425 frame.setSize(530,580);426 //设置窗口的默认关闭操作是退出程序

427 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);428 //设置窗口可见,frame在显示的时候会尽快的调用 paint方法

429 frame.setVisible(true);430 //设置窗口居中

431 frame.setLocationRelativeTo(null);432 //开始动作

433 tetris.action();434 }435 }

java写俄罗斯方块难吗_用JAVA写的俄罗斯方块相关推荐

  1. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  2. java校验参数防止攻击_程序员写接口参数校验,总是太多if else?一招让你避免体力活...

    对于写Java的程序员来说,不管是写单纯的接口.还是页面后台一把梭,后端参数校验的功能都是整个代码不可或缺的一部分,它可以从系统入口过滤掉一些不合法的数据,以确保我们的系统稳定. 还记得我刚入行Jav ...

  3. java比go难学_为什么Go比Java快这么多?看完这个例子就懂

    一,前言 本次小测试并不是试图说明Go是java的替代,Go lang和Java本就不是实现相同类型任务的语言 :Java是企业开发语言,而Go是系统编程语言.为什么Go比Java快这么多?看完这个例 ...

  4. java 取栈顶元素_《Java实战之内存模型》详解篇

    内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行 不同的JV ...

  5. java 中文域名转码_转换java方法

    java date String 类型相互转换 这种转换要用到java.text.SimpleDateFormat类 字符串转换成日期类型: 方法1: 也是最简单的方法 Date date=new D ...

  6. java代码读写者问题_一整套Java线上故障排查技巧,爱了!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 来源:fredal.xin/ ...

  7. java计分系统编程代码_使用Java代码对实时系统进行编程

    由于许多重要原因,Java语言在实时系统中的使用并不广泛. 这些包括Java语言设计固有的不确定性性能影响,例如动态类加载,以及Java Runtime Environment(JRE)本身,例如垃圾 ...

  8. java ug二次开发_使用Java进行UG二次开发:简单的例子(上) | 学步园

    最近因为要进行TeamCenter二次开发(胖客户端定制),所有要开始研究Java了.因此突发奇想为什么不能使用Java进行二次开发呢?现在对UG进行的开发以C/C++应用为主.大多数使用的是原来的U ...

  9. java字符串拆分成数组_用Java实现JVM第八章《数组和字符串》

    小傅哥 | https://bugstack.cn 沉淀.分享.成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获.目前已完成的专题有:Netty4.x实战专题案例.用J ...

  10. java状态模式例子答案_[转载]java设计模式_状态模式(带例子)

    状态模式(STATE) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编 ...

最新文章

  1. 利用计算机技术执行去自动化,计算机技术和自动化的关系.doc
  2. 区块链项目实战 - 使用以太坊/智能合约solidity,全栈开发区块链借贷记账小应用,含完整源码
  3. formZ Pro 9(3D绘图软件)中文版
  4. python英文语义角色标注_八款中文词性标注工具使用及在线测试
  5. 基于相干解调法和基于相位比较法的2DPSK数字通信系统 MATLAB Simulink仿真
  6. 数据结构学习笔记:时间复杂度
  7. LTE技术对PTN的影响
  8. 如何在 Word 的方框中打勾 √ ?☑ ☒
  9. 利用matlab实现AM调制解调
  10. BeAlert 一款alert和confirm美化插件(优化)
  11. 揭秘前端工程师未来就业方向,年薪50w不是梦!
  12. 当老板让程序员换灯泡…… | 每日趣闻
  13. Robot Framework(3)——RIDE工具详解
  14. wpf toolbar右对齐_侧方停车是与旁车对齐还是反光镜对B柱?有什么停车技巧吗
  15. 面试官:线上环境 FGC 频繁,如何解决?
  16. 计算机一级ppt定位,课件全国计算机一级基础知识.ppt
  17. 团队Github实战训练
  18. C语言程序设计第六章例题(数组)
  19. 什么手机浏览器比较好用些?
  20. android 解锁图案代码,Android图案解锁code.docx

热门文章

  1. Unable to find instance for XXXX
  2. 金融直播营销,主播必须这样做!
  3. 计算机学硕和专硕,应该怎么选?
  4. 计算机硕士毕业论文范文,计算机论文:精选计算机硕士毕业论文范文十篇.docx...
  5. NOIP模拟19/07/22
  6. js实现漂亮的雪花飘落效果
  7. html网站背景雪花飘落效果代码,超酷html5雪花飘落特效源码
  8. 精细化用电侧能源管控 解码光伏电站运维痛点
  9. Inception-V3论文翻译——中文版
  10. [CF1538E] Funny Substrings (模拟)