java写小游戏贪吃蛇

效果图

首先用java写贪吃蛇,思路要清晰

第一步:窗口 初始化一个蛇,一个食物
第二步: 动起来(移动)吃食物;
第三步:添加控制 :显示分数;速度;开始暂停等;

难点1设置继承jpanl时添加到窗口时,不知如何设置背景颜色;
难点2如何控制一条蛇的长度,并且上下移动;

难点3线程的运用以及线程启动时机;

以下仅给部分关键的代码;

窗口要用JFrame类,用来实现游戏窗口的大小以及相关特性;
public YuanSnake(){
SnakeGame snakegame=new SnakeGame();
setTitle("袁庆的贪吃蛇游戏");//设置窗口标题
setSize(650,480);//设置的窗口大小
setResizable(false);//不可以调动
setVisible(true);//显示窗口
//this.getContentPane().setBackground(Color.red);
add(snakegame);
//System.out.println(snakegame.getBackground());
setDefaultCloseOperation(EXIT_ON_CLOSE);//设置用户关闭窗口,关闭程序;
}

class SnakeGame extends JPanel{
/**
* 继承父类绘制一条蛇图
* @param g
*/
public void paint(Graphics g){   //此时一定要用paint不能用paintComponent;如果用了是不会显示背景颜色的。
super.paint(g);//开始画图;
//g.setColor(Color.decode("#86A6A4"));
g.setColor(Color.ORANGE);//表示画笔的颜色;JPanel是画板;
g.fillRect(0, 0,450, 450);
//添加竖线;
            g.setColor(Color.blue);
for(int i=0;i<=30;i++){
g.drawLine(0, i*width, 450, i*width);//画一条横线;
g.drawLine(i*width, 0, i*width, 450);//画一条竖线
}


}

}

其中snakegame是另外一个类的实例,这个类中除了以上一些外,应该还有其他的方法,

如下方法

/**
* 移动蛇的算法;产生一个新的头部。身体,
* @param direction
*/
private void moveSnake(int direction){
ArrayList<SnakeNode> newSnake=new ArrayList<SnakeNode>();
//新的头部;
SnakeNode newhead=new SnakeNode(head.getX(),head.getY(),head.getD());
for(int i=1;i<snake.size();i++){
newSnake.add(i-1,snake.get(i));
}
switch(direction){
case up:
newhead.setY(newhead.getY()-1);
break;
case dow:
newhead.setY(newhead.getY()+1);
break;
case left:
newhead.setX(newhead.getX()-1);
break;
case right:
newhead.setX(newhead.getX()+1);
break;
}
newhead.setD(direction);
newSnake.add(newhead);
head=newhead;
snake=newSnake;
if(isgameover()){
autoMove=null;
JOptionPane.showMessageDialog(this,"Game Over!");
}
repaint();


}//判断是否结宿

private boolean isgameover(){
//判断是否超出范围
if(head.getX()<0||head.getY()<0||head.getX()>=30||head.getY()>=30){
return true;
}
//判断是否身体;
for(int i=0;i<snake.size()-1;i++){
if(head.getX()==snake.get(i).getX()&&head.getY()==snake.get(i).getY()){
return true;
}
}
return false;
}

public void run() {//让蛇动起来;需要一个方向;
while(autoMove!=null){
moveSnake(head.getD());
try{
autoMove.sleep(speed);
}catch(InterruptedException e){
e.printStackTrace();
}
}

//产生一个随机的食物;

private void initFoodxy(){
foodx=random.nextInt(30);//0-29的随机数[0,30);
foody=random.nextInt(30);
for(SnakeNode node:snake){
if(foodx==node.getX()&&foody==node.getY()){
initFoodxy();//递归产生;
}
}
}

/**

键盘敲击事件的回应

**/

public void keyPressed(KeyEvent e) {
int keyCode=e.getKeyCode();//键盘放回值;
int direction=0;//方向
switch(keyCode){
case KeyEvent.VK_UP:
direction=up;
break;
case KeyEvent.VK_DOWN:
direction=dow;
break;
case KeyEvent.VK_LEFT:
direction=left;
break;
case KeyEvent.VK_RIGHT:
direction=right;
break;
case KeyEvent.VK_SPACE:
//autoMove=null;说明已经gomeoveer或者没开始;
if(autoMove==null){
initSnake();
autoMove=new Thread(this);
autoMove.start();
}
else{
if(isPaused){
autoMove.resume();
isPaused=false;
}
else{
autoMove.suspend();
isPaused=true;
}
}
default:
break;
}

以上基本上是贪吃蛇的大概代码,要想完全做成还是需要更多的理解以及时间去了解,


需要改进 :1其中还用到两个过时的方法resume();(恢复)suspend();(挂起)需要改进。

             2里面还需要添加一些障碍物,以及改善速度的按钮。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值