Java迷宫小游戏,老程序员花一天时间完成,你可以吗?
Java迷宫,老程序员又来了
作者简介
作者名:编程界明世隐
简介:CSDN博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞!
系列目录
1. Java俄罗斯方块
2. Java五子棋小游戏
3. 老Java程序员花一天时间写了个飞机大战
4. Java植物大战僵尸
5. 老Java程序员花2天写了个连连看
6. Java消消乐(天天爱消除)
7. Java贪吃蛇小游戏
8. Java扫雷小游戏
9. Java坦克大战
效果图
实现思路
1.创建运行窗口。
2.创建菜单。
3.绘制迷宫的每个单元。
4.通过算法计算迷宫路径,并打通路径,形成迷宫。
5.绘制起点终点。
6.添加键盘事件控制起点方块移动。
7.收尾。
迷宫算法(网上参考的)
- 将起点作为当前迷宫单元并标记为已访问
- 当还存在未标记的迷宫单元,进行循环
1).如果当前迷宫单元有未被访问过的的相邻的迷宫单元
(1).随机选择一个未访问的相邻迷宫单元
(2).将当前迷宫单元入栈
(3).移除当前迷宫单元与相邻迷宫单元的墙
(4).标记相邻迷宫单元并用它作为当前迷宫单元
2).如果当前迷宫单元不存在未访问的相邻迷宫单元,并且栈不空
(1).栈顶的迷宫单元出栈
(2).令其成为当前迷宫单元
**这个算法叫做“深度优先”,简单来说,就是从起点开始走,寻找它的上下左右4个邻居,然后随机一个走,到走不通的时候就返回上一步继续走,直到全部单元都走完。 **
相关图示说明
- 每个单元的墙,分为上墙、右墙、下墙、左墙,把这些墙用长度为4的数组表示,元素的值为true则表示墙存在,否则墙不存在,代码里数组的下标方式来确定墙是否存在。
- 单元是根据行列来创建的,会用到双循环,类似表格,比如第二行用 i 来表示的话就是 1,第3列用 j 来表示就是2,那第二行第3列的元素组合起来就是(1,2)
- 那同理它的上邻居就是(0,2),右邻居(1,3),下邻居(2,2),左邻居(1,1),也就是上下邻居是 i 减加1,左右邻居是 j 减加1。
- 正方形4个点的坐标分别为(x1,y1)(x2,y2)(x3,y3)(x4,y4),计算坐标的公式为(其中start为相对偏移量,为了让迷宫两边有些空隙):
//i代表行 j代表列 h为单元高度
//左上角坐标
this.x1=start+j*h;
this.y1=start+i*h;
//右上角坐标
this.x2=start+(j+1)*h;
this.y2=start+i*h;
//右下角坐标
this.x3=start+(j+1)*h;
this.y3=start+(i+1)*h;
//左下角坐标
this.x4=start+j*h;
this.y4=start+(i+1)*h;
计算坐标,假如每个正方形的宽高都是40,那么(1,2)这个单元的坐标如下图:
5. 墙的处理,之前说到墙是以一个4个元素的数组来表示的,比如数组为:[true,true,true,true],则图为:
如果数组为[false,true,true,true],则图为:
6. 如果要联通右边的邻居要怎么做呢?当前单元去除右墙,右边单元去除左墙,这样就联通了。
去除后就这样,以此类推
代码实现
创建窗口
首先创建一个游戏窗体类GameFrame,继承至JFrame,用来显示在屏幕上(window的对象),每个游戏都有一个窗口,设置好窗口标题、尺寸、布局等就可以。
import javax.swing.JFrame;
/***窗体类*/
public class GameFrame extends JFrame {//构造方法public GameFrame(){setTitle("迷宫");//设置标题setSize(420, 470);//设置窗体大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭后进程退出setLocationRelativeTo(null);//居中setResizable(false);//不允许变大//setVisible(true);//设置显示窗体}
}
创建面板容器GamePanel继承至JPanel
import javax.swing.JMenuBar;
import javax.swing.JPanel;/** 画布类*/
public class GamePanel extends JPanel{private JMenuBar jmb = null;private GameFrame mainFrame = null;private GamePanel panel = null;private String gameFlag="start";//游戏状态//构造方法public GamePanel(GameFrame mainFrame){this.setLayout(null);this.setOpaque(false);this.mainFrame=mainFrame;this.panel =this;}
}
再创建一个Main类,来启动这个窗口。
//Main类
public class Main {public static void main(String[] args) {GameFrame frame = new GameFrame();GamePanel panel = new GamePanel(frame);frame.add(panel);frame.setVisible(true);}
}
右键执行这个Main类,窗口建出来了
创建菜单及菜单选项
创建菜单
private Font createFont(){return new Font("思源宋体",Font.BOLD,18);
}
//创建菜单
private void createMenu() {//创建JMenuBarjmb = new JMenuBar();//取得字体Font tFont = createFont(); //创建游戏选项JMenu jMenu1 = new JMenu("游戏");jMenu1.setFont(tFont);//创建帮助选项JMenu jMenu2 = new JMenu("帮助");jMenu2.setFont(tFont);JMenuItem jmi1 = new JMenuItem("新游戏");jmi1.setFont(tFont);JMenuItem jmi2 = new JMenuItem("退出");jmi2.setFont(tFont);//jmi1 jmi2添加到菜单项“游戏”中jMenu1.add(jmi1);jMenu1.add(jmi2);JMenuItem jmi3 = new JMenuItem("操作帮助");jmi3.setFont(tFont);JMenuItem jmi4 = new JMenuItem("胜利条件");jmi4.setFont(tFont);//jmi13 jmi4添加到菜单项“游戏”中jMenu2.add(jmi3);jMenu2.add(jmi4);jmb.add(jMenu1);jmb.add(jMenu2);mainFrame.setJMenuBar(jmb);//添加监听jmi1.addActionListener(this);jmi2.addActionListener(this);jmi3.addActionListener(this);jmi4.addActionListener(this);//设置指令jmi1.setActionCommand("restart");jmi2.setActionCommand("exit");jmi3.setActionCommand("help");jmi4.setActionCommand("win");
}
实现ActionListener并重写方法actionPerformed
此时GamePanel是报错的,需重写actionPerformed方法。
actionPerformed方法的实现
@Override
public void actionPerformed(ActionEvent e) {String command = e.getActionCommand();System.out.println(command);UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("思源宋体", Font.ITALIC, 18)));UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("思源宋体", Font.ITALIC, 18)));if ("exit".equals(command)) {Object[] options = { "确定", "取消" };int response = JOptionPane.showOptionDialog(this, "您确认要退出吗", "",JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null,options, options[0]);if (response == 0) {System.exit(0);} }else if("restart".equals(command)){restart();}else if("help".equals(command)){JOptionPane.showMessageDialog(null, "通过键盘的上下左右来移动","提示!", JOptionPane.INFORMATION_MESSAGE);}else if("win".equals(command)){JOptionPane.showMessageDialog(null, "移动到终点获得胜利","提示!", JOptionPane.INFORMATION_MESSAGE);}
}
此时的GamePanel代码如下:
package main;import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;/** 画布类*/
public class GamePanel extends JPanel implements ActionListener{private JMenuBar jmb = null;private GameFrame mainFrame = null;private GamePanel panel = null;private String gameFlag="start";//游戏状态//构造方法public GamePanel(GameFrame mainFrame){this.setLayout(null);this.setOpaque(false);this.mainFrame=mainFrame;this.panel =this;//创建菜单createMenu();}private Font createFont(){return new Font("思源宋体",Font.BOLD,18);}//创建菜单private void createMenu() {//创建JMenuBarjmb = new JMenuBar();//取得字体Font tFont = createFont(); //创建游戏选项JMenu jMenu1 = new JMenu("游戏");jMenu1.setFont(tFont);//创建帮助选项JMenu jMenu2 = new JMenu("帮助");jMenu2.setFont(tFont);JMenuItem jmi1 = new JMenuItem("新游戏");jmi1.setFont(tFont);JMenuItem jmi2 = new JMenuItem("退出");jmi2.setFont(tFont);//jmi1 jmi2添加到菜单项“游戏”中jMenu1.add(jmi1);jMenu1.add(jmi2);JMenuItem jmi3 = new JMenuItem("操作帮助");jmi3.setFont(tFont);JMenuItem jmi4 = new JMenuItem("胜利条件");jmi4.setFont(tFont);//jmi13 jmi4添加到菜单项“游戏”中jMenu2.add(jmi3);jMenu2.add(jmi4);jmb.add(jMenu1);jmb.add(jMenu2);mainFrame.setJMenuBar(jmb);//添加监听jmi1.addActionListener(this);jmi2.addActionListener(this);jmi3.addActionListener(this);jmi4.addActionListener(this);//设置指令jmi1.setActionCommand("restart");jmi2.setActionCommand("exit");jmi3.setActionCommand("help");jmi4.setActionCommand("win");}@Overridepublic void actionPerformed(ActionEvent e) {String command = e.getActionCommand();System.out.println(command);UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("思源宋体", Font.ITALIC, 18)));UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("思源宋体", Font.ITALIC, 18)));if ("exit".equals(command)) {Object[] options = { "确定", "取消" };int response = JOptionPane.showOptionDialog(this, "您确认要退出吗", "",JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null,options, options[0]);if (response == 0) {System.exit(0);} }else if("restart".equals(command)){restart();}else if("help".equals(command)){JOptionPane.showMessageDialog(null, "通过键盘的上下左右来移动","提示!", JOptionPane.INFORMATION_MESSAGE);}else if("win".equals(command)){JOptionPane.showMessageDialog(null, "移动到终点获得胜利","提示!", JOptionPane.INFORMATION_MESSAGE);} }void restart(){}}
运行它
绘制迷宫的每个单元
- 初始化相关参数
public final int ROWS=20;//行
public final int COLS=20;//列
public final int H=20;//每一块的宽高
Block[][] blocks = null;//存储每个单元的二维数组
- 创建迷宫单元类(如果对坐标计算不明白,可以往上翻,有图示说明解释)
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
/** 迷宫单元类*/
public class Block {private GamePanel panel = null;private int i=0;//二维数组的下标iprivate int j=0;//二维数组的下标jprivate int h=0;//宽高private int start=6;//偏移像素//4个顶点坐标private int x1=0;//x1坐标private int y1=0;//y1坐标private int x2=0;//x2坐标private int y2=0;//y2坐标private int x3=0;//x3坐标private int y3=0;//y3坐标private int x4=0;//x4坐标private int y4=0;//y4坐标//上下左右4个墙是否显示,true:显示,false:隐藏boolean[] walls=new boolean[4];private boolean visited=false;//是否被访问//构造public Block(int i,int j,int h,GamePanel panel){this.i=i;this.j=j;this.h=h;this.panel=panel;//计算4个顶点的坐标init();}//计算4个顶点的坐标private void init() {//i代表行 j代表列//左上角坐标this.x1=start+j*h;this.y1=start+i*h;//右上角坐标this.x2=start+(j+1)*h;this.y2=start+i*h;//右下角坐标this.x3=start+(j+1)*h;this.y3=start+(i+1)*h;//左下角坐标this.x4=start+j*h;this.y4=start+(i+1)*h; //默认上下左右4个墙都显示walls[0]=true;walls[1]=true;walls[2]=true;walls[3]=true;}//绘制指示器的方法public void draw(Graphics g) {//绘制迷宫块drawBlock(g);}//绘制迷宫块private void drawBlock(Graphics g) {//判断上、右、下、左 的墙,true的话墙就会有,否则墙就没有boolean top = walls[0];boolean right = walls[1];boolean bottom = walls[2];boolean left = walls[3];if(top){//绘制上墙g.drawLine(x1, y1, x2, y2);}if(right){//绘制右墙g.drawLine(x2, y2, x3, y3); }if(bottom){//绘制下墙g.drawLine(x3, y3, x4, y4); }if(left){//绘制左墙g.drawLine(x4, y4, x1, y1); }}
}
- 在GamePanel类中创建方法createBlocks
//创建数组内容
private void createBlocks() {blocks = new Block[ROWS][COLS];Block block ;for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {block = new Block(i, j,H,this);blocks[i][j]=block;}}
}
- 在构造函数中调用此方法
//构造方法
public GamePanel(GameFrame mainFrame){this.setLayout(null);this.setOpaque(false);this.mainFrame=mainFrame;this.panel =this;//创建菜单createMenu();//创建数组内容createBlocks();
}
- 在GamePanel中重新paint方法,绘制这些方块
public void paint(Graphics g) {super.paint(g);//绘制网格drawBlock(g);
}//绘制迷宫块
private void drawBlock(Graphics g) {Block block ;for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {block = blocks[i][j];if(block!=null){block.draw(g);}}}
}
运行可以看到一个个的方形绘制出来了
计算并打通迷宫
- 给每个单元都增加邻居查找方法(Block类中)
//查找当前单元是否有未被访问的邻居单元
public List<Block> findNeighbors() {//邻居分为上下左右List<Block> res= new ArrayList<Block>();//返回的数组Block top = this.getNeighbor(0,false);Block right = this.getNeighbor(1,false);Block bottom = this.getNeighbor(2,false);Block left = this.getNeighbor(3,false);if(top!=null){res.add(top);}if(right!=null){res.add(right);}if(bottom!=null){res.add(bottom);}if(left!=null){res.add(left);}return res;//返回邻居数组
}
//根据方向,获得邻居
public Block getNeighbor(int type,boolean lose_visited) {Block neighbor;int ti=0,tj=0;if(type==0){ti = this.i-1;tj = this.j;}else if(type==1){ti = this.i;tj = this.j+1;}else if(type==2){ti = this.i+1;tj = this.j;}else if(type==3){ti = this.i;tj = this.j-1;}Block[][] blocks = panel.blocks;if(ti<0 || tj<0 || ti>=panel.ROWS || tj>=panel.COLS){//超出边界了neighbor = null;}else{//首先找到这个邻居neighbor = blocks[ti][tj];//判断是否被访问,如果被访问了返回nullif(neighbor.visited && !lose_visited){//lose_visited等于true表示忽略访问neighbor = null;}}return neighbor;
}
- 计算
跟着算法来写的代码,唯一要注意的是我设置了一个值unVisitedCount,初始值为所有单元的数量,每当一个单元被标记为已访问后,这个值就递减1,当值为0后就终止循环,结束算法。
//线路的计算处理
private void computed(){/*1.将起点作为当前迷宫单元并标记为已访问2.当还存在未标记的迷宫单元,进行循环1).如果当前迷宫单元有未被访问过的的相邻的迷宫单元(1).随机选择一个未访问的相邻迷宫单元(2).将当前迷宫单元入栈(3).移除当前迷宫单元与相邻迷宫单元的墙(4).标记相邻迷宫单元并用它作为当前迷宫单元2).如果当前迷宫单元不存在未访问的相邻迷宫单元,并且栈不空(1).栈顶的迷宫单元出栈(2).令其成为当前迷宫单元*/Random random = new Random();Stack<Block> stack = new Stack<Block>();//栈Block current = blocks[0][0];//取第一个为当前单元current.setVisited(true);//标记为已访问int unVisitedCount=ROWS*COLS-1;//因为第一个已经设置为访问了List<Block> neighbors ;//定义邻居Block next;while(unVisitedCount>0){neighbors = current.findNeighbors();//查找邻居集合(未被访问的)if(neighbors.size()>0){//如果当前迷宫单元有未被访问过的的相邻的迷宫单元//随机选择一个未访问的相邻迷宫单元int index = random.nextInt(neighbors.size()); next = neighbors.get(index);//将当前迷宫单元入栈stack.push(current);//移除当前迷宫单元与相邻迷宫单元的墙this.removeWall(current,next);//标记相邻迷宫单元并用它作为当前迷宫单元next.setVisited(true);//标记一个为访问,则计数器递减1unVisitedCount--;//递减current = next;}else if(!stack.isEmpty()){//如果当前迷宫单元不存在未访问的相邻迷宫单元,并且栈不空/*1.栈顶的迷宫单元出栈2.令其成为当前迷宫单元*/Block cell = stack.pop();current = cell;}}
}
- 移除墙
//移除当前迷宫单元与相邻迷宫单元的墙
private void removeWall(Block current, Block next) {if(current.getI()==next.getI()){//横向邻居if(current.getJ()>next.getJ()){//匹配到的是左边邻居//左边邻居的话,要移除自己的左墙和邻居的右墙current.walls[3]=false;next.walls[1]=false;}else{//匹配到的是右边邻居//右边邻居的话,要移除自己的右墙和邻居的左墙current.walls[1]=false;next.walls[3]=false;}}else if(current.getJ()==next.getJ()){//纵向邻居if(current.getI()>next.getI()){//匹配到的是上边邻居//上边邻居的话,要移除自己的上墙和邻居的下墙current.walls[0]=false;next.walls[2]=false;}else{//匹配到的是下边邻居//下边邻居的话,要移除自己的下墙和邻居的上墙current.walls[2]=false;next.walls[0]=false;}}
}
- 在构造函数中调用computed方法
//构造方法
public GamePanel(GameFrame mainFrame){this.setLayout(null);this.setOpaque(false);this.mainFrame=mainFrame;this.panel =this;//创建菜单createMenu();//创建数组内容createBlocks();//计算处理线路computed();
}
- 运行效果
绘制起点终点
- 创建Rect类
package main;import java.awt.Color;
import java.awt.Graphics;//开始结束方块
public class Rect {private int i=0;//二维数组的下标iprivate int j=0;//二维数组的下标jprivate int x=0;//x坐标private int y=0;//y坐标private int h=0;//宽高private int start=6;//偏移像素private String type="";//start endpublic Rect(int i,int j,int h,String type){this.i=i;this.j=j;this.h=h;this.type=type;}//初始化private void init() {this.x=start+j*h+2;this.y=start+i*h+2;}//绘制void draw(Graphics g){//计算x、y坐标init();Color oColor = g.getColor();if("start".equals(type)){//红色g.setColor(Color.red);}else{g.setColor(Color.blue);}g.fillRect(x, y, h-3, h-3);g.setColor(oColor);}//移动public void move(int type, Block[][] blocks,GamePanel panel) {//根据当前start方形,获得对应的迷宫单元Block cur = blocks[this.i][this.j];boolean wall = cur.walls[type];//得到对应的那面墙if(!wall){//得到移动方块对应的单元Block next = cur.getNeighbor(type,true);if(next!=null){this.i = next.getI();this.j = next.getJ();panel.repaint();//判断如果i,j等于终点的,则表示获得成功if(this.i==panel.end.i && this.j==panel.end.j){panel.gameWin();}}}}public int getI() {return i;}public void setI(int i) {this.i = i;}public int getJ() {return j;}public void setJ(int j) {this.j = j;}
}
- 在GamePanel类中创建方法,并在构造中调用。
//创建开始结束的方形
private void createRects() {start = new Rect(0, 0, H, "start") ;end = new Rect(ROWS-1, COLS-1, H, "end") ;
}
//构造方法
public GamePanel(GameFrame mainFrame){this.setLayout(null);this.setOpaque(false);this.mainFrame=mainFrame;this.panel =this;//创建菜单createMenu();//创建数组内容createBlocks();//计算处理线路computed();//创建开始结束的方形createRects();
}
- 在paint方法中绘制
@Override
public void paint(Graphics g) {super.paint(g);//绘制网格drawBlock(g);//绘制开始结束方向drawRect(g);
}
//绘制开始结束方块
private void drawRect(Graphics g) {end.draw(g);start.draw(g);
}
- 运行一下
加入键盘移动监听
- 创建监听方法
//添加键盘监听
private void createKeyListener() {KeyAdapter l = new KeyAdapter() {//按下@Overridepublic void keyPressed(KeyEvent e) {if(!"start".equals(gameFlag)) return ;int key = e.getKeyCode();switch (key) {//向上case KeyEvent.VK_UP:case KeyEvent.VK_W:if(start!=null) start.move(0,blocks,panel);break;//向右case KeyEvent.VK_RIGHT:case KeyEvent.VK_D:if(start!=null) start.move(1,blocks,panel);break;//向下case KeyEvent.VK_DOWN:case KeyEvent.VK_S:if(start!=null) start.move(2,blocks,panel);break;//向左case KeyEvent.VK_LEFT:case KeyEvent.VK_A:if(start!=null) start.move(3,blocks,panel);break;}}//松开@Overridepublic void keyReleased(KeyEvent e) {}};//给主frame添加键盘监听mainFrame.addKeyListener(l);
}
- 在构造中调用
//构造方法
public GamePanel(GameFrame mainFrame){this.setLayout(null);this.setOpaque(false);this.mainFrame=mainFrame;this.panel =this;//创建菜单createMenu();//创建数组内容createBlocks();//计算处理线路computed();//创建开始结束的方形createRects();//添加键盘事件监听createKeyListener();
}
- 运行
收尾
此时代码已经基本完成,加入游戏胜利、重新开始等方法即可
//重新开始
void restart() {/*参数重置1.游戏状态2.迷宫单元重置3.重新计算线路*///1.游戏状态gameFlag="start";//2.迷宫单元重置Block block ;for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {block = blocks[i][j];if(block!=null){block.setVisited(false);block.walls[0]=true;block.walls[1]=true;block.walls[2]=true;block.walls[3]=true;}}}//3.计算处理线路computed();//开始方块归零start.setI(0);start.setJ(0);//重绘repaint();
}
看到这里的大佬,动动发财的小手 点赞 + 回复 + 收藏,能【 关注 】一波就更好了。
代码获取方式:
订阅我的专栏《Java游戏大全》后,可以查看专栏内所有的文章,并且联系博主免费获取其中1-3份你心仪的源代码,专栏的文章都是上过csdn热榜的,值得信赖!专栏内目前有[14]篇实例,未来2个月内专栏会更新到15篇以上,一般2周一更,了解一下我的专栏。
Java迷宫小游戏,老程序员花一天时间完成,你可以吗?相关推荐
- bat代码小游戏_程序员入职被27岁领导告诫:我被BAT录用过,是算法方面泰斗大哥...
现如今,如果你想要被对方尊重,想要获得更好的职位,除了有扎实的技能之外,还要学会包装,如果包装的好,还是能够起到很好的效果. 最近在职场论坛上看到这样一个帖子:程序员刚入职就被27岁的领导告诫,我被B ...
- Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
Java俄罗斯方块,老程序员花了一个周末,连接中学年代! 热门专栏推荐 [1]Java小游戏(俄罗斯方块.飞机大战.植物大战僵尸等) [2]JavaWeb项目实战(图书管理.在线考试.宿舍管理等) [ ...
- 一位 40 岁“老程序员”的经历,给你们说一些我的真实想法!
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...
- 8年web前端开发老程序员告诉你如何零基础学习web前端
随着web前端的飞速发展,学习web前端的人员也是越来越多,在移动 互联网 时代,相信我们每个人的手机上都装有数十个APP,这些APP的开发其实也和当下热门的 Web 前端开发息息相关. 事实上,如今 ...
- 黑马程序员--迷宫小游戏
------- android培训.java培训.期待与您交流! ---------- 在黑马ios的基础课视频上,有个迷宫小游戏,感觉挺有趣,然后我就在此基础上,稍稍改了点,记下,留着可以和别人共同 ...
- 不会玩游戏的程序员不是好作家,《深入理解Java虚拟机》周志明来了!
嘉宾:周志明.杨福川 采访.撰文:Satoh_AI 这次采访起源来自于我和豆瓣的一位读者有同样的好奇心,为什么网上搜不到周志明老师的更多信息?为什么"80后玩家"可以把本本书都维持 ...
- 一个半路出家十年Java老程序员的真实经历
我是一个老java程序员,现在基本告别编码时代了,当然我现在还在写代码,不是为了老板写了,是自己在创业.回想起这么多年的人生路,作为一名老程序员感慨颇多,尤其是作为一名半路出家的程序员,其中的滋味更是 ...
- 40岁老程序员失业半年,内心崩溃要哭了,能从C语言转JAVA吗?
今天看到某视频平台上一个300万播放的视频,一个40岁的老程序员哭诉自己失业后的遭遇,自己是C语言开发,找不到工作,想要转Java,不知道是否可行. 说实话,我认为40岁了,还在纠结开发语言,还是有点 ...
- 基于Java的迷宫小游戏
一.实验内容: 1)迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫: 2) 要求查找并理解迷宫生成的算法,并尝试用两种不同的算法来生成随机的迷宫. 要求迷宫游戏支持玩家走迷宫,和系 ...
- python迷宫小游戏代码_pygame简易迷宫游戏_mask应用示例程序
用pygame制作的迷宫小游戏.像这类碰撞检测用mask最好.下面是部分代码预览: """ 简易迷宫游戏.本程序演示一个非常简单的迷宫游戏原理. 采用mask进行碰撞检测 ...
最新文章
- hibernate mysql 自动建表_配置hibernate根据实体类自动建表功能
- Orchard Core 文档翻译 (六)HTML
- hashMap与hashTable区别
- Python装饰器学习笔记 1
- CV2 puttext不能显示中文问题
- Java描述设计模式(14):解释器模式
- splay详解(三)
- js系列教程9-表单元素全解
- Windows10下VB6.0开发——常用数值处理函数工具
- [转]DPM2012系列之十九:配置辅助备份服务器
- Win8 MSDN 简中/繁中/英文正式版下载(微软官方原版)
- IOUtils快速进行内容复制与常用方法
- JSON RPC API
- 教你怎么利用Matlab画散点图
- c语言 整数符号,c语言有符号整数
- 小程序源码:收款码三合一制作-多玩法安装简单
- 微信文件夹储存在什么位置?如何修改保存路径
- NoSQLBooster for MongoDB 算法注册机
- 在单端输入应用中连接差分放大器
- 学习Chrome Devtools 调试
热门文章
- 一代测序、二代测序以及三代测序的优缺点及应用对比?
- 【论文翻译】Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
- 一文讲透小石头Little Stone:Web3时代Gravatar、中国版BAYC、平台NFT、社区门票
- JSON.stringify(value, replacer, space)详解
- marshmallow之自定义Field
- Faulty Robot-(dfs或者dijkstra)
- 没有基础学习java编程,去培训机构怎么样?
- 量子纠缠:万物皆有默契
- 管理咨询公司全球前22排名
- 关于locahost:8080一直在等待却不报错