这是跟着B站教程一起做的,链接在此:点击即可


一个类包括属性和方法两种,我们首先定义MyFrame的属性。MyFrame的作用就是绘制最终的页面,所以在这个类里面要定义页面的大小、位置等等,主要目的就是将我们定义的图片绘制到窗口中去。

在游戏中我们有三个关卡,前两个关卡的背景图和第三个关卡的背景图是不一样的,所以设置了一个数组来保存我们所有的图片信息,因为在绘制的时候总要有一个场景吧,所以设置了nowbg对象,这里的background对象就是为了保存每一个场景中的所有要放置的图片,当我们在绘制的时候直接将nowbg里保存的图片画出即可。

游戏的绘制怎么能少得了主人公马里奥呢?所以我们这个时候定义一个Mario对象,并为它设置线程对象。

属性都定义好了以后我们就开始定义构造方法,绘制好游戏窗口,为定义的变量赋值,使用重定义的repaint方法,将图片显示在屏幕上。

重写paint方法的时候,先把图片放在缓冲区,等全部缓冲好以后我们再把它们一起绘制出来。

根据马里奥的坐标判断是否已经到达了场景的终点来进行场景的切换,根据bg里的障碍物坐标进行障碍物坐标的绘制。

对于主人公来说,我们需要控制的有他的位置即x、y坐标和当前的状态,由于要走路和跳跃,我们还要判断一下马里奥是否在空中,代码中的注释也写得很详细了,就是构造一些方法,通过方法去判断状态,重点是要提前判断好各点的坐标和位置关系从而设置限定条件,进行判断。

目录

  • MyFrame类
  • Mario类
  • Enemy类
  • Obstacle类
  • StaticValue类
  • BackGround类

MyFrame类

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;public class MyFrame extends JFrame implements KeyListener ,Runnable{//存储所有背景private List<BackGround> allBg = new ArrayList<>();//存储当前背景private BackGround nowBg = new BackGround();//双存储private Image offScreenImage=null;//马里奥对象private Mario mario=new Mario();//线程对象,用于实现马里奥的运动private Thread thread =new Thread(this);
public MyFrame(){//窗口大小this.setSize(800,600);//窗口居中显示this.setLocationRelativeTo(null);//设置窗口可见性this.setVisible(true);//设置点击窗口上的关闭键,结束程序this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口大小不可变this.setResizable(false);//向窗口对象添加键盘监听器this.addKeyListener(this);//设置窗口名称this.setTitle("马里奥");StaticValue.init();//初始化马里奥mario=new Mario(10,355);//创建所有场景for (int i = 1; i <=3 ; i++) {allBg.add(new BackGround(i,i==3?true:false));}nowBg=allBg.get(0);mario.setBackGround(nowBg);repaint();thread.start();
}@Overridepublic void paint(Graphics g) {if(offScreenImage==null){offScreenImage=createImage(800,600);}Graphics graphics = offScreenImage.getGraphics();//画布graphics.fillRect(0,0,800,600);//把图片绘制到缓冲区上graphics.drawImage(nowBg.getBgImage(), 0,0,this);//绘制敌人for(Enemy ob:nowBg.getEnemyList()){graphics.drawImage(ob.getShow(),ob.getX(),ob.getY(),this);}//绘制障碍物for(Obstacle ob: nowBg.getObstacleList())graphics.drawImage(ob.getShow(),ob.getX(),ob.getY(),this);//绘制城堡graphics.drawImage(nowBg.getTower(),620,270,this);//绘制旗杆graphics.drawImage(nowBg.getGan(), 500,220,this);//绘制马里奥graphics.drawImage(mario.getShow(),mario.getX(),mario.getY(),this);//绘制分数Color c=graphics.getColor();graphics.setColor(Color.black);graphics.setFont(new Font("黑体",Font.BOLD,25));graphics.drawString("当前的分数为"+mario.getScore(),300,100);graphics.setColor(c);//把缓冲区的图片绘制到窗口中g.drawImage(offScreenImage,0,0,this);}public static void main(String[] args) {MyFrame myFrame=new MyFrame();}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {//向右移动if(e.getKeyCode()==39){mario.rightMove();}//向左移动if(e.getKeyCode()==37)mario.leftMove();//跳跃if(e.getKeyCode()==38){mario.jump();}}@Overridepublic void keyReleased(KeyEvent e) {//向左停止if(e.getKeyCode()==37){mario.leftStop();}//向右停止if(e.getKeyCode()==39){mario.rightStop();}}@Overridepublic void run() {while(true){repaint();try {Thread.sleep(50);if(mario.getX()>=750){nowBg=allBg.get(nowBg.getSort());mario.setBackGround(nowBg);mario.setX(10);mario.setY(355);}//判断马里奥是否死亡if(mario.isDeath()){JOptionPane.showMessageDialog(this,"马里奥死亡");System.exit(0);}//判断游戏是否结束if(mario.isOK()){JOptionPane.showMessageDialog(this,"恭喜过关");System.exit(0);}} catch (InterruptedException e) {e.printStackTrace();}}}
}

Mario类

import java.awt.image.BufferedImage;public class Mario implements  Runnable{//用于存储横坐标private int x;//用于存储纵坐标private int y;//存储表示马里奥当前的状态private String status;//用于显示当前状态对应的图像private BufferedImage show =null;//定义一个BackGround对象,用于获取障碍物信息private BackGround backGround=new BackGround();//用来实现马里奥的动作private Thread thread=null;//马里奥的移动速度private int xSpeed;//马里奥的跳跃速度private int ySpeed;//取得马里奥的运动图像private int index;//表示马里奥的上升时间private int upTime=0;//表示积分private int  score=0;//判断马里奥是否死亡private boolean isDeath=false;//判断马里奥是否走到了城堡的门口private boolean isOK;public Mario(){}public void death(){isDeath=true;}public Mario(int x,int y){this.x=x;this.y=y;show=StaticValue.stand_R;this.status="stand--right";thread=new Thread(this);thread.start();}//马里奥向左移动public void leftMove(){xSpeed=-5;//判断马里奥1是否碰到了旗子if(backGround.isReach())xSpeed=0;//判断马里奥是否处于空中if(status.indexOf("jump")!=-1){status="jump--left";}else{status="move--left";}}//马里奥向右移动public void rightMove(){xSpeed=5;//判断马里奥1是否碰到了旗子if(backGround.isReach())xSpeed=0;//判断马里奥是否处于空中if(status.indexOf("jump")!=-1){status="jump--right";}else{status="move--right";}}//马里奥向左停止public void leftStop(){xSpeed=0;//判断马里奥是否处于空中if(status.indexOf("jump")!=-1){status="jump--left";}else{status="stop--left";}}//马里奥向右停止public void rightStop(){xSpeed=0;//判断马里奥是否处于空中if(status.indexOf("jump")!=-1){status="jump--right";}else{status="stop--right";}}//马里奥跳跃public void jump(){if(status.indexOf("jump")==-1){if(status.indexOf("left")!=-1){status="jump--left";}elsestatus="jump--right";ySpeed=-10;upTime=7;//判断马里奥1是否碰到了旗子if(backGround.isReach())ySpeed=0;}}//马里奥下落public void fall(){if(status.indexOf("left")!=-1){status="jump--left";}else{status="jump--right";}ySpeed=10;}@Overridepublic void run() {while(true){//判断是否处于障碍物上boolean onObstacle=false;//判断是否可以向右走boolean canRight=true;//判断是否可以往左走boolean canleft=true;//判断马里奥是否到达旗杆位置if(backGround.isFlag()&&this.x>=500){this.backGround.setReach(true);//判断旗子是否下落完成if(this.backGround.isBase()){status="move--right";if(x<690){x+=5;}else{isOK=true;}}else{if(y<395){xSpeed=0;this.y+=5;status="jump--right";}if(y>395){this.y=395;status="stop--right";}}}else {//遍历当前场景里所有的障碍物for (int i = 0; i < backGround.getObstacleList().size(); i++) {Obstacle ob = backGround.getObstacleList().get(i);//判断马里奥是否位于障碍物上if (ob.getY() == this.y + 25 && (ob.getX() > this.x - 30) && (ob.getX() < this.x + 25)) {onObstacle = true;}//判断是否跳起来顶到砖块if (ob.getY() >= this.y - 30 && (ob.getY() <= this.y - 20) && (ob.getX() > this.x - 30) && (ob.getX() < this.x + 25)) {if (ob.getType() == 0) {backGround.getObstacleList().remove(ob);upTime = 0;score+=1;}}//判断是否可以往右走if (ob.getX() == this.x + 25 && (ob.getY() > this.y - 30) && (ob.getY() < this.y + 25)) {canRight = false;}//判断是否可以往左走if (ob.getX() == this.x - 30 && (ob.getY() > this.y - 30) && (ob.getY() < this.y + 25))canleft = false;}//判断马里奥是否碰到敌人死亡或者踩死蘑菇敌人for(int i=0;i<backGround.getEnemyList().size();i++){Enemy e=backGround.getEnemyList().get(i);if(e.getY()==this.y+20&&(e.getX()-25<this.x)&&(e.getX()+35>=this.x)){if(e.getType()==1){e.death();upTime=3;ySpeed=-10;score+=2;}else if(e.getType()==2){//马里奥死death();}}if(e.getX()+35>this.x&&e.getX()-25<this.x&&e.getY()+35>this.y&&e.getY()-20<this.y){//马里奥死death();}}//进行马里奥跳跃的操作if (onObstacle && upTime == 0) {if (status.indexOf("left") != -1) {if (xSpeed != 0) {status = "move--left";} elsestatus = "stop--left";} else {if (xSpeed != 0) {status = "move--right";} elsestatus = "stop--right";}} else {if (upTime != 0) upTime--;else fall();y += ySpeed;}}if((canleft&&xSpeed<0)||(canRight&&xSpeed>0)) {x += xSpeed;//判断马里奥是否运动到了屏幕的最左边if (x < 0)x = 0;}//判断当前是否是移动状态if(status.contains("move")){index=index==0?1:0;}//判断是否向左移动if("move--left".equals(status)){show=StaticValue.run_L.get(index);}//判断是否向右移动if("move--right".equals(status)){show=StaticValue.run_R.get(index);}//判断是否向左停止if("stop--left".equals(status)){show=StaticValue.stand_L;}//判断是否向右停止if("stop--right".equals(status)){show=StaticValue.stand_R;}//判断是否向左跳跃if("jump--left".equals(status)){show=StaticValue.jump_L;}//判断是否向右跳跃if("jump--right".equals(status)){show=StaticValue.jump_R;}try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}public int getX() {return x;}public int getY() {return y;}public void setX(int x) {this.x = x;}public void setY(int y) {this.y = y;}public int getScore() {return score;}public void setShow(BufferedImage show) {this.show = show;}public BufferedImage getShow() {return show;}public void setBackGround(BackGround backGround) {this.backGround = backGround;}public boolean isOK() {return isOK;}public boolean isDeath() {return isDeath;}
}

Enemy类

import java.awt.image.BufferedImage;public class Enemy implements  Runnable{//存储当前坐标private int x,y;//存储敌人类型private int type;//判断敌人运动的方向private boolean face_to=true;//用于显示敌人的当前图像private BufferedImage show;//定义一个背景对象private BackGround bg;//食人花运动的极限范围private int max_up=0;private int max_down=0;//定义线程对象private Thread thread=new Thread(this);//表示当前的图片状态private int image_type=0;//蘑菇敌人的构造函数public Enemy(int x,int y,boolean face_to,int type,BackGround bg){this.x=x;this.y=y;this.face_to=face_to;this.bg=bg;this.type=type;show=StaticValue.mogu.get(0);thread.start();}//敌人的死亡方法public void death(){show=StaticValue.mogu.get(2);this.bg.getEnemyList().remove(this);}//蘑菇敌人的构造函数public Enemy(int x,int y,boolean face_to,int type,int max_up,int max_down,BackGround bg){this.x=x;this.y=y;this.face_to=face_to;this.max_up=max_up;this.max_down=max_down;this.bg=bg;this.type=type;show=StaticValue.flower.get(0);thread.start();}public int getX() {return x;}public int getY() {return y;}public BufferedImage getShow() {return show;}public int getType() {return type;}@Overridepublic void run() {while(true){if(type==1) {if (face_to)this.x -= 2;elsethis.x += 2;image_type = image_type == 1 ? 0 : 1;show = StaticValue.mogu.get(image_type);}//定义两个布尔变量boolean canLeft =true;boolean canRight =true;for (int i = 0; i < bg.getObstacleList().size(); i++) {Obstacle ob1 = bg.getObstacleList().get(i);//判断是否可以向右走if(ob1.getX()==this.x+36&&(ob1.getY()+65>this.y&&ob1.getY()-35<this.y)){canRight=false;}//判断是否可以向左走if(ob1.getX()==this.x-36&&(ob1.getY()+65>this.y)&&ob1.getY()-35<this.y){canLeft=false;}}if(face_to && !canLeft||this.x==0)face_to=false;else if (!face_to&& !canRight ||this.x==750)face_to=true;//判断是否是食人花敌人if(type==2){if(face_to)this.y-=2;elsethis.y+=2;image_type=image_type==1?0:1;//食人花是否移动到了极限位置if(face_to&&(this.y==max_up)){face_to=false;}else if(!face_to&&(this.y==max_down)){face_to=true;}show=StaticValue.flower.get(image_type);}try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}
}

Obstacle类

import java.awt.image.BufferedImage;public class Obstacle implements Runnable{//表示当前坐标private int x;private int y;//表示记录障碍物类型private int type;//用于显示图像private BufferedImage show = null;//定义当前的场景对象private  BackGround bg = null;//定义当前的场景对象private Thread thread=new Thread(this);public Obstacle(int x,int y,int type,BackGround bg){this.x=x;this.y=y;this.type=type;this.bg=bg;this.show=StaticValue.obstacle.get(type);if(type==8){thread.start();}}public int getX() {return x;}public int getY() {return y;}public int getType() {return type;}public BufferedImage getShow() {return show;}@Overridepublic void run() {while(true) {if(this.bg.isReach()){if(this.y<374)this.y+=5;elsethis.bg.setBase(true);}try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}
}

StaticValue类

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class StaticValue {//背景public static BufferedImage bg = null;public static BufferedImage bg2 = null;//马里奥向左跳跃public static BufferedImage jump_L = null;//马里奥向右跳跃public static BufferedImage jump_R = null;//马里奥向左站立public static BufferedImage stand_L = null;//马里奥向右站立public static BufferedImage stand_R = null;//城堡public static BufferedImage tower = null;//旗杆public static BufferedImage gan = null;//障碍物public static List<BufferedImage> obstacle = new ArrayList<>();//马里奥向左跑public static List<BufferedImage> run_L = new ArrayList<>();//马里奥向右跑public static List<BufferedImage> run_R = new ArrayList<>();//蘑菇敌人public static List<BufferedImage> mogu = new ArrayList<>();//食人花敌人public static List<BufferedImage> flower = new ArrayList<>();//路径的前缀,方便后续调用public static String path = System.getProperty("user.dir")+"/src/images/";//初始化方法public static void init(){try {//加载背景图bg= ImageIO.read(new File(path+"bg.png"));bg2= ImageIO.read(new File(path+"bg2.png"));//加载马里奥向左站立stand_L=ImageIO.read(new File(path+"s_mario_stand_L.png"));//加载马里奥向右站立stand_R=ImageIO.read(new File(path+"s_mario_stand_R.png"));//加载城堡tower=ImageIO.read(new File(path+"tower.png"));//加载旗杆gan=ImageIO.read(new File(path+"gan.png"));//加载马里奥向左跳跃jump_L=ImageIO.read(new File(path+"s_mario_jump1_L.png"));//加载马里奥向右跳跃jump_R=ImageIO.read(new File(path+"s_mario_jump1_R.png"));} catch (IOException e) {e.printStackTrace();}for (int i = 1; i <=2 ; i++) {try {run_L.add(ImageIO.read(new File(path+"s_mario_run"+i+"_L.png")));} catch (IOException e) {e.printStackTrace();}}for (int i = 1; i <=2 ; i++) {try {run_R.add(ImageIO.read(new File(path+"s_mario_run"+i+"_R.png")));} catch (IOException e) {e.printStackTrace();}}//加载障碍物try {obstacle.add(ImageIO.read(new File(path+"brick.png")));obstacle.add(ImageIO.read(new File(path+"soil_up.png")));obstacle.add(ImageIO.read(new File(path+"soil_base.png")));} catch (IOException e) {e.printStackTrace();}//加载水管for (int i = 1; i <=4 ; i++) {try {obstacle.add(ImageIO.read(new File(path+"pipe"+i+".png")));} catch (IOException e) {e.printStackTrace();}}//加载不可破坏的砖块和旗帜try {obstacle.add(ImageIO.read(new File(path+"brick2.png")));obstacle.add(ImageIO.read(new File(path+"flag.png")));} catch (IOException e) {e.printStackTrace();}//加载蘑菇for (int i = 1; i <=3 ; i++) {try {mogu.add(ImageIO.read(new File(path+"fungus"+i+".png")));} catch (IOException e) {e.printStackTrace();}}//加载食人花敌人for (int i = 1; i <=2 ; i++) {try {flower.add(ImageIO.read(new File(path+"flower1."+i+".png")));} catch (IOException e) {e.printStackTrace();}}}
}

BackGround类

import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;public class BackGround {//当前背景private BufferedImage bgImage = null;//记录当前是第几个场景private int sort;//判断是否是最后一个场景private boolean flag;//用于存放所有的障碍物private  List<Obstacle> obstacleList = new ArrayList<>();//存放所有的敌人private List<Enemy> enemyList=new ArrayList<>();//显示旗杆private BufferedImage gan=null;//判断马里奥是否到了旗杆的位置private boolean isReach=false;//判断旗子是否落地private boolean isBase=false;//显示城堡private BufferedImage tower = null;public BackGround() {}public BackGround(int sort, boolean flag) {this.sort = sort;this.flag = flag;if (flag) {bgImage = StaticValue.bg2;} elsebgImage = StaticValue.bg;if (sort == 1) {//绘制第一关的地面for (int i = 0; i < 27; i++) {obstacleList.add(new Obstacle(i * 30, 420, 1, this));}for (int i = 0; i <= 120; i += 30) {for (int j = 0; j < 27; j++) {obstacleList.add(new Obstacle(j * 30, 570 - i, 2, this));}}//绘制砖块Afor (int i = 120; i <= 150; i += 30) {obstacleList.add(new Obstacle(i, 300, 7, this));}//绘制砖块B-Ffor (int i = 300; i <= 570; i += 30) {if (i == 360 || i == 390 || i == 480 || i == 510 || i == 540)obstacleList.add(new Obstacle(i, 300, 7, this));elseobstacleList.add(new Obstacle(i, 300, 0, this));}//绘制砖块Gfor (int i = 420; i <= 450; i += 30) {obstacleList.add(new Obstacle(i, 240, 7, this));}//绘制水管for (int i = 360; i <= 600; i += 25) {if (i == 360) {obstacleList.add(new Obstacle(620, i, 3, this));obstacleList.add(new Obstacle(645, i, 4, this));} else {obstacleList.add(new Obstacle(620, i, 5, this));obstacleList.add(new Obstacle(645, i, 6, this));}}//绘制第一关的蘑菇敌人enemyList.add(new Enemy(580,385,true,1,this));//绘制第一关的食人花敌人enemyList.add(new Enemy(635,420,true,2,328,418,this));}//判断是否是第二关if(sort==2){//绘制地面for (int i = 0; i < 27; i++) {obstacleList.add(new Obstacle(i * 30, 420, 1, this));}for (int i = 0; i <= 120; i += 30) {for (int j = 0; j < 27; j++) {obstacleList.add(new Obstacle(j * 30, 570 - i, 2, this));}}//绘制水管for (int i = 360; i <= 600; i += 25) {if (i == 360) {obstacleList.add(new Obstacle(60, i, 3, this));obstacleList.add(new Obstacle(85, i, 4, this));} else {obstacleList.add(new Obstacle(60, i, 5, this));obstacleList.add(new Obstacle(85, i, 6, this));}}for (int i = 330; i <= 600; i += 25) {if (i == 330) {obstacleList.add(new Obstacle(620, i, 3, this));obstacleList.add(new Obstacle(645, i, 4, this));} else {obstacleList.add(new Obstacle(620, i, 5, this));obstacleList.add(new Obstacle(645, i, 6, this));}}//绘制砖块CobstacleList.add(new Obstacle(300,330,0,this));//绘制砖块B、E、Gfor (int i = 270; i <=330 ; i+=30) {if(i==270||i==330)obstacleList.add(new Obstacle(i,360,0,this));elseobstacleList.add(new Obstacle(i,360,7,this));}//绘制砖块A,D,F,H,Ifor (int i = 270; i <=360 ; i+=30) {if(i==240||i==360){obstacleList.add(new Obstacle(i,390,0,this));}elseobstacleList.add(new Obstacle(i,390,7,this));}//绘制砖块1obstacleList.add(new Obstacle(240,300,0,this));//绘制空1-4砖块for (int i = 360; i <=540 ; i+=60) {obstacleList.add(new Obstacle(i,270,7,this));}//绘制第二关的蘑菇敌人enemyList.add(new Enemy(200,385,true,1,this));enemyList.add(new Enemy(500,385,true,1,this));//绘制第二关的食人花敌人enemyList.add(new Enemy(75,420,true,2,328,418,this));enemyList.add(new Enemy(635,420,true,2,328,418,this));}if(sort==3){//绘制地面for (int i = 0; i < 27; i++) {obstacleList.add(new Obstacle(i * 30, 420, 1, this));}for (int i = 0; i <= 120; i += 30) {for (int j = 0; j < 27; j++) {obstacleList.add(new Obstacle(j * 30, 570 - i, 2, this));}}//绘制A-O砖块int temp=290;for (int i = 390; i >=270 ; i-=30) {for (int j = temp; j <=410 ; j+=30) {obstacleList.add(new Obstacle(j,i,7,this));}temp+=30;}//绘制P-R砖块temp=60;for (int i = 390; i >=360 ; i-=30) {for (int j = temp; j <=90 ; j+=30) {obstacleList.add(new Obstacle(j,i,7,this));}temp+=30;}//绘制旗杆gan = StaticValue.gan;//绘制城堡tower=StaticValue.tower;//添加旗子到旗杆上obstacleList.add(new Obstacle(515,220,8,this));//蘑菇敌人enemyList.add(new Enemy(150,385,true,1,this));}}public BufferedImage getBgImage() {return bgImage;}public int getSort() {return sort;}public boolean isFlag() {return flag;}public List<Obstacle> getObstacleList() {return obstacleList;}public BufferedImage getTower() {return tower;}public BufferedImage getGan() {return gan;}public boolean isBase() {return isBase;}public void setBase(boolean base) {isBase = base;}public boolean isReach() {return isReach;}public void setReach(boolean reach) {isReach = reach;}public List<Enemy> getEnemyList() {return enemyList;}}

马里奥游戏 java相关推荐

  1. Java之马里奥游戏完整版

               Java版简单版马里奥游戏 ⭐本项目演示地址⭐ ⭐资源图片源代码私信博主⭐            马里奥类 import java.awt.image.BufferedImage ...

  2. 计算机毕设之基于Java的超级马里奥游戏设计与实现

    代码+论文下载链接: http://106.55.47.97/host-pictures/java.png 概述 随着时代的不断变化和发展,计算机互联网产业已经通过各种手段逐渐融入到人们的生活中.来自 ...

  3. Java之马里奥游戏

               Java版简单版马里奥游戏 更多项目

  4. 魔塔小游戏Java版项目

    这是一款童年游戏4399网站上的魔塔仿制版,回忆童年,入手开发项目,全方面的代码解析 更多项目: 1.飞机大战Java版(Java+JavaSwing+多线程结构) 2.Java之马里奥游戏 3.大鱼 ...

  5. 《LeetCode力扣练习》第55题 跳跃游戏 Java

    <LeetCode力扣练习>第55题 跳跃游戏 Java 一.资源 题目: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大 ...

  6. 别的AI还在打游戏,这个AI已经当上“超级马里奥”游戏策划了|GECCO最佳论文

    AI打游戏已经不是什么新鲜事了,"沉迷"Dota 2.星际争霸.LOL的AI一个接一个的出现. 但是你也许不知道,相比这些"游戏玩家"AI,还有一位优秀的AI, ...

  7. leetcode-292-Nim游戏(java|python)

    title: leetcode-292-Nim游戏(java|python) date: 2019-10-12 21:18:57 categories: leetcode tags: leetcode ...

  8. java实验2总结心得,打字小游戏JAVA实验总结及心得体会

    篇一:扫雷游戏实验报告 课程设计 班 级: 姓 名: 学 号: 指导教师: 成 绩: 电子与信息工程学院信息与通信工程系 目录 1.任务概述------------------------------ ...

  9. java小游戏-java小游戏-大鱼吃小鱼

    java小游戏-java小游戏-大鱼吃小鱼 1 创建窗口 2 添加背景图 3 启动封面 4 启动页面的点击事件 5 游戏开始时的背景添加 6 双缓存解决闪屏问题 7 地方第一条小鱼的添加 8 敌方左方 ...

最新文章

  1. 五种开源协议(GPL,LGPL,BSD,MIT,Apache)介绍
  2. 黄聪:说说JSON和JSONP,也许你会豁然开朗(转)
  3. 免费的python课程-自学Python的10门免费课程,已学完
  4. 手机耗电统计app_华为手机有哪些功能关掉比较好?
  5. MySQL04WHERE关键字
  6. 和整数相乘_小学数学基础概念归纳总结:整数篇
  7. 《王者荣耀》回应故障:3个工作日内补发排位赛星积分丢失
  8. 招聘 集群研发工程师
  9. 摘录一些介绍Linux DKMS的博客文章
  10. vegan稀释曲线 基因丰度_R语言 vegan包计算物种累计曲线
  11. 云服务器升级系统,centos云服务器系统升级
  12. 百度语音合成data:audio/x-mpeg;base64转mp3
  13. Windows Server 2012 之NIC组合(NIC Teaming)介绍
  14. 群英传内推第001期
  15. ADMIN云计算系统管理
  16. Ubuntu 20.04.2.0 LTS 下安装Geany 1.36的命令列表
  17. STM32HAL库-移植mbedtls开源库示例(一)
  18. HTML中的JavaScript——<script>
  19. chroot的使用方法
  20. 校招总结—FPGA从入门到放弃

热门文章

  1. 全国计算机等级考试一级教程讲义资料,全国计算机等级考试一级教程讲义资料.pdf...
  2. ESafeKiller 亿赛通
  3. JAVA高级篇之Java Reflection详解
  4. P84-前端基础动画效果-动画3D复仇者联盟练习
  5. 百度amp;高德地图小区景点边界轮廓实现
  6. jQuery入门实操-css操作,鼠标点击事件,页面计算器
  7. 广和通FM650 5G模块连接Ubuntu不显示USB串口问题解决
  8. ANSYS中关于质量矩阵 刚度矩阵的提取【1】
  9. linux4==阿里云ECS centos8部署redis6.2.6伪集群
  10. 周志华老师报告Boasting 25years