⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nextframe.java

📁 一个经典的贪吃蛇游戏源码看看吧
💻 JAVA
字号:
/*
 * 创建日期 2005-6-24
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
package game;

import java.util.Random;
import java.util.TimerTask;

/**
 * @author Administrator
 *
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
public class NextFrame extends TimerTask {
	private GameCtrl gameCtrl;
	private Random rand = new Random();
	
	// 每局时长
	public long tickcount = 0;
	
	// 食物最大停留时间
	private long foodtime = 25;
	
	// 食物图像的宽度高度
	private int foodwidth = 0;
	private int foodheight = 0;
	
	/**
	 * 
	 */
	public NextFrame(GameCtrl gameCtrl) {
		super();
		this.gameCtrl = gameCtrl;	
		foodwidth = gameCtrl.foodImage.getWidth();
		foodheight = gameCtrl.foodImage.getHeight();
	}
	
	/* (非 Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	public void run() {
		// 食物位置调整
		foodtime--;
		if (foodtime == 0){
			foodtime = 25;
			getNextPos();
		}
	
		// 移动蛇身
		switch(gameCtrl.direction){
			case 0:
				// 蛇身位置处理				
				for (int i = 19; i > 0 ; i--){
					gameCtrl.snakeX[i] = gameCtrl.snakeX[i - 1];
					gameCtrl.snakeY[i] = gameCtrl.snakeY[i - 1];
				}			
				// 蛇头处理
				if (gameCtrl.snakeY[0] > 3){
					gameCtrl.snakeY[0] -= 4;					
				}else{
					if (gameCtrl.snakeX[0] > gameCtrl.width / 2){
						// 如果已到屏幕上界则左移
						gameCtrl.direction = 2;
						gameCtrl.snakeX[0] -= 4; 
						
					}else{
						// 如果已到屏幕上界则右移
						gameCtrl.direction = 3;						
						gameCtrl.snakeX[0] += 4; 
					}
				}	
				break;
			case 1:
				// 蛇身处理
				for (int i = 19; i > 0 ; i--){
					gameCtrl.snakeX[i] = gameCtrl.snakeX[i - 1];
					gameCtrl.snakeY[i] = gameCtrl.snakeY[i - 1];
				}
				
				// 蛇头处理
				if (gameCtrl.snakeY[0] < gameCtrl.height - 5){
					gameCtrl.snakeY[0] += 4;					
				}else{
					if (gameCtrl.snakeX[0] > gameCtrl.width / 2){
						// 如果已到屏幕上界则左移
						gameCtrl.direction = 2;
						gameCtrl.snakeX[0] -= 4; 
						
					}else{
						// 如果已到屏幕上界则右移
						gameCtrl.direction = 3;						
						gameCtrl.snakeX[0] += 4; 
					}
				}	
				break;
			case 2:
				// 蛇身处理
				for (int i = 19; i > 0 ; i--){
					gameCtrl.snakeX[i] = gameCtrl.snakeX[i - 1];
					gameCtrl.snakeY[i] = gameCtrl.snakeY[i - 1];
				}					

				// 蛇头处理
				if (gameCtrl.snakeX[0] > 3){
					gameCtrl.snakeX[0] -= 4;					
				}else{
					if (gameCtrl.snakeY[0] > gameCtrl.height / 2){
						// 如果已到屏幕上界则左移
						gameCtrl.direction = 0;
						gameCtrl.snakeY[0] -= 4; 
						
					}else{
						// 如果已到屏幕上界则右移
						gameCtrl.direction = 1;						
						gameCtrl.snakeY[0] += 4; 
					}
				}	
				break;
			case 3:
				// 蛇身处理
				for (int i = 19; i > 0 ; i--){
					gameCtrl.snakeX[i] = gameCtrl.snakeX[i - 1];
					gameCtrl.snakeY[i] = gameCtrl.snakeY[i - 1];
				}					

				// 蛇头处理
				if (gameCtrl.snakeX[0] < gameCtrl.width - 5){
					gameCtrl.snakeX[0] += 4;					
				}else{
					if (gameCtrl.snakeY[0] > gameCtrl.height / 2){
						// 如果已到屏幕上界则左移
						gameCtrl.direction = 0;
						gameCtrl.snakeY[0] -= 4; 
						
					}else{
						// 如果已到屏幕上界则右移
						gameCtrl.direction = 1;						
						gameCtrl.snakeY[0] += 4; 
					}
				}	
				break;				
		}
				
		// 碰撞检测
		if (gameCtrl.snakeX[0] > gameCtrl.foodX - foodwidth / 2 &&
			gameCtrl.snakeX[0] < gameCtrl.foodX + foodwidth / 2 &&
			gameCtrl.snakeY[0] > gameCtrl.foodY - foodheight / 2 &&
			gameCtrl.snakeY[0] < gameCtrl.foodY + foodheight / 2){

			// 计分
			gameCtrl.score += 10;
			
			// 生成新的食物位置
			getNextPos();			
		}
				
		// 计时
		tickcount++;
		if (tickcount == 300)
			gameCtrl.isGameOver = true;
		
		// 重绘画面
		gameCtrl.repaint();
	}
	
	public void getNextPos(){
		// 在屏幕内随机设置位置
		int x = (int)(rand.nextLong());
		gameCtrl.foodX = (int)(x % gameCtrl.width);
		int y = (int)(rand.nextLong());
		gameCtrl.foodY = (int)(y % gameCtrl.height);
		
		//  使图像限定在屏幕内
		if (gameCtrl.foodX < foodwidth / 2)
			gameCtrl.foodX = foodwidth / 2;
		if (gameCtrl.foodX > gameCtrl.width - foodwidth / 2)
			gameCtrl.foodX = gameCtrl.width - foodwidth / 2;			
		if (gameCtrl.foodY < foodheight / 2)
			gameCtrl.foodY = foodheight / 2;				
		if (gameCtrl.foodY > gameCtrl.height - foodheight / 2)
			gameCtrl.foodY = gameCtrl.height - foodheight / 2;
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -