根据学习狂神说的贪吃蛇游戏实现,基于对其代码的实现
一、贪吃蛇实现功能
小蛇根据键盘方向键控制小蛇的移动方向,按一定速率移动。当按下空格键时,开始游戏;再次按下空格键时,暂停游戏。
小蛇不能回头吃自己,小蛇碰到自己的身体时,游戏就显示失败。
二、功能代码实现
1.初始化各个数据
public void init(){
panel_Width = 850;//面板的宽度
panel_Height = 600;//面板的高度
length = 3;//小蛇初始时长度为3
snake_X[0] = 100;snake_Y[0] = 100;//头的坐标
snake_X[1] = 75;snake_Y[1] = 100;//第一节身体的坐标
snake_X[2] = 50;snake_Y[2] = 100;//第二节身体的坐标
snake_Orientation = "right";//初始头的方向为右
/*Random random = new Random();随机数据*/
//食物随机分布在界面上
food_X = 25 + 25*random.nextInt(33);//生成1到34的随机数
food_Y = 75 + 25*random.nextInt(23);//生成1到24的随机数
score = 0;//初始化分数为0
food_Value = 5;//每次吃到一个食物,则分数加5分
}
2.游戏状态,开始,停止(isStart表示是否开始游戏,默认为暂停游戏状态)
if (isStrat == false){
g.setColor(Color.white);
g.setFont(new Font("微软雅黑", Font.BOLD, 40)); //设置字体
g.drawString("按下空格开始游戏", 300, 300);
}
3.游戏失败(isFail表示游戏是否失败,默认为true,即成功状态)
//游戏失败
if (isFail == true){
g.setColor(Color.red);
g.setFont(new Font("微软雅黑", Font.BOLD, 40)); //设置字体
g.drawString("失败,按下空格重新开始", 220, 300);
}
4.失败判定,即小蛇撞到自己的身体,则游戏失败
for (int i = 1; i < length; i++) { //遍历所有身体坐标
if (snake_X[0] == snake_X[i] && snake_Y[0] == snake_Y[i]){
isFail = true;
break;
}
}
5.小蛇向前移动,每个身体部分的坐标就移动到上一节身体的坐标
for (int i = length-1; i > 0; i--) {//向前移动一节(每个身体都到上一节身体的坐标)
snake_X[i] = snake_X[i-1];
snake_Y[i] = snake_Y[i-1];
}
6.定时器,以ms为单位,小蛇移动一次的时间,刷新时间越大,小蛇移动的越慢
对于此地定时器的实现是在继承事件监听(ActionListener)之后,先对画面进行重画,再启动计时器。每继承一次,就会进行时间的刷新。
//定时器,以ms为单位
// Timer timer = new Timer(1000, this); //1000ms=1s,刷新时间(毫秒),1s执行一次
Timer timer = new Timer(snake_Speed, this); //刷新时间, 监听的目标对象
7.键盘监听事件
class keyboardListener extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();//获得按下的键
if (keyCode == KeyEvent.VK_SPACE){ //按下空格
if (isFail == true){
isFail = false;
init();//初始化
}else {
//当游戏不是处于失败状态时,按下空格按键,开始或暂停
isStrat = !isStrat; //isStart取反
}
repaint();//重绘组件
}
//控制小蛇移动不能往回走
if (keyCode == KeyEvent.VK_UP){
if (snake_Orientation != "down"){
snake_Orientation = "up"; //蛇头变向
}
}else if (keyCode == KeyEvent.VK_DOWN){
if (snake_Orientation != "up"){
snake_Orientation = "down";
}
}else if (keyCode == KeyEvent.VK_LEFT){
if (snake_Orientation != "right"){
snake_Orientation = "left";
}
}else if (keyCode == KeyEvent.VK_RIGHT){
if (snake_Orientation != "left"){
snake_Orientation = "right";
}
}
}
}
实现结果: