java简单游戏贪吃蛇_java写的简易贪吃蛇游戏

前言:上周偶然关注了下WCG2011,很久没有关注这个了,很遗憾sky没有夺冠,毕竟从学校就开始关注;也很遗憾fly100%没有加冕,有实力;也相当遗憾,moon没有进半决赛。而是韩国兽王lyn登顶。看着视频,想打几把,周末和朋友high了下,操作依旧那么飘逸,呵呵~。不知不觉中,有点想写游戏程序的想法,来点带动感的程序,于是花了半天写了这个简易游戏。

代码及注释如下:

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import java.util.*;

public class Snake extends JFrame implements KeyListener{

private int direction,snakeLength = 6,positionX = 5,positionY = 6,foodX,foodY,queueLength;

private int [] savePositionX = new int [20];//存放snakeLength长度的positionX值

private int [] savePositionY = new int [20];//存放snakeLength长度的positionY值

private boolean start = true;

private final int EAST = 1, WEST = 2, SOUTH = 3, NORTH = 4;

public Snake(){

super("贪吃蛇  by envi");

setSize(500,500);//设置窗口大小

setVisible(true);//设定窗口属性

addKeyListener(this);//添加按键监听

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

queueLength = snakeLength;//

direction = EAST;//方向初始化的设置

for(int count = 0; count < snakeLength; count++){

savePositionX[count] = positionX++;

savePositionY[count] = positionY;

}

locateFood();

while(start == true){

startToRun();

}

//匿名类用于注册监听器

this.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

}//Snake()

//按键与方向选择

public void keyPressed(KeyEvent event){

switch(event.getKeyCode()){

case KeyEvent.VK_UP:

if(direction!=SOUTH)

direction = NORTH;

break;

case KeyEvent.VK_DOWN:

if(direction!=NORTH)

direction = SOUTH;

break;

case KeyEvent.VK_LEFT:

if(direction!=EAST)

direction = WEST;

break;

case KeyEvent.VK_RIGHT:

if(direction!=WEST)

direction = EAST;

break;

}

}

public void keyReleased(KeyEvent event) {

}

public void keyTyped(KeyEvent event) {

}

//获取按键后的坐标

public void getSnakePosition(){

if(start == true){

switch(direction){

case EAST:

positionX++;

break;

case WEST:

positionX--;

break;

case SOUTH:

positionY++;

break;

case NORTH:

positionY--;

break;

}

//每前进一步 坐标均有改变

queueLength++;

savePositionX[queueLength] = positionX;

savePositionY[queueLength] = positionY;

}

}

//随机数据产生food的坐标位置

public void locateFood(){

Random random = new Random();

foodX = random.nextInt(20);

foodY = random.nextInt(20);

}

//贪吃蛇获取食物

public void getFood(){

if(foodX == positionX && foodY == positionY){

if(snakeLength < 20){

snakeLength++;

}

locateFood();//吃到食物后,重新随机生成食物坐标点

}

try{

Thread.sleep(100);

}

catch(InterruptedException e){}//延迟

}

//运行

public void startToRun(){

getSnakePosition();//蛇头前进位置

try{

Thread.sleep(150);

}

catch(InterruptedException e){}//延迟

getFood();

//超出实际长度 消除尾影,更新蛇身

System.out.println("queueLength "+ queueLength +" snakeLength "+ snakeLength);

//其实此时的queueLength等于snakeLength + 1

if(queueLength > snakeLength){

for(int i = 1; i <= queueLength; i++){

savePositionX[i-1] = savePositionX[i];//更新坐标,保持显示snakeLength个蛇身格子

savePositionY[i-1] = savePositionY[i];

}

queueLength = snakeLength;//更新长度

}

//更新绘图  repaint()是回调函数

repaint();

}

public void paint(Graphics g){

super.paint(g);

//绘制蛇身

g.setColor(Color.BLACK);

for(int temp = 0; temp < snakeLength; temp++){

//g.fillRect(25*savePositionX[temp] + 5, 25*savePositionY[temp] + 5, 24, 24);

if(temp == 0){

g.fillRoundRect(25*savePositionX[temp] + 5, 25*savePositionY[temp] + 5, 24, 24, 360, 360);

}

else if(temp == snakeLength - 1){

g.fillRoundRect(25*savePositionX[temp] + 5, 25*savePositionY[temp] + 5, 24, 24, 10, 10);

}

else{

g.fill3DRect(25*savePositionX[temp] + 5, 25*savePositionY[temp] + 5, 24, 24, true);

}

}

//绘制随机食物点

g.setColor(Color.RED);

g.fillRect(25*foodX + 5, 25*foodY + 5, 24, 24);

}

//主函数

public static void main(String args[]){

new Snake();//通过匿名类加载其构造函数

}

}

后记:实现基本算法,但设计过于简单,而且按键滞后,用线程会有所改善,有空再完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值