`
lbfhappy
  • 浏览: 83096 次
社区版块
存档分类
最新评论
阅读更多
以前写的一个贪吃蛇,比较适合初学者,并且里面用到了JDK1.5的很多新的东西,比如枚举,泛型,增强for循环,静态导入等等,希望能对初学者有一定的帮助.
<!---->import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import static java.lang.Math.*;//静态导入
/*

* 此类是贪吃蛇的简单实现方法
* 自己可以加入在开始时的设置,比如
* 选关,初始的蛇的长度等等
* 作者:千里冰封
* 日期:2006年6月25日15:47
*/
public class Snake extends JPanel{
private Direction dir;//要走的方向
private int blockWidth=10;//块大小
private int blockSpace=2;//块之间的间隔
private long sleepTime;//重画的进间间隔
private MySnake my;
private int total;//代表蛇的长度
private Rectangle food;//代表蛇的食物
private volatile boolean go;
private int round;//表示第几关
public Snake(JFrame jf){
  initOther();
  
//为顶级窗口类JFrame添加事件处理函数
  jf.addKeyListener(new KeyAdapter(){
   
public void keyReleased(KeyEvent ke){
    
int code=ke.getKeyCode();
    
if(code==KeyEvent.VK_RIGHT){
     
if(dir!=Direction.WEST)
      dir
=Direction.EAST;
    }
    
    
else if(code==KeyEvent.VK_LEFT){
     
if(dir!=Direction.EAST)
      dir
=Direction.WEST;
    }
    
    
else if(code==KeyEvent.VK_UP){
     
if(dir!=Direction.SOUTH)
      dir
=Direction.NORTH;
    }
    
    
else if(code==KeyEvent.VK_DOWN){
     
if(dir!=Direction.NORTH)
      dir
=Direction.SOUTH;
    }
    
else if(code==KeyEvent.VK_ENTER){
     
if(!go)
     initOther();
    }
   }
  });
  
this.setBounds(300,300,400,400);
  
this.setVisible(true);
}
//随机生成一个食物的位置
private void makeFood(){
  
int x=40+(int)(random()*30)*12;
  
int y=10+(int)(random()*30)*12;
  food
=new Rectangle(x,y,10,10);
}
//做一些初始化的工作
private void initOther(){
  dir
=Direction.EAST;
  sleepTime
=500;
  my
=new MySnake();
  makeFood();
  total
=3;
  round
=1;
  
new Thread(new Runnable(){
   
public void run(){
    go
=true;
    
while(go){
     
try{
      Thread.sleep(sleepTime);
      repaint();
     }
     
catch(Exception exe){
      exe.printStackTrace();
     }
    }
   }
  }).start();
}
//处理多少关的函数
private void handleRound(){
  
if(total==6){
   round
=2;
   sleepTime
=300;
  }
  
else if(total==10){
   round
=3;
   sleepTime
=200;
  }
  
else if(total==15){
   round
=4;
   sleepTime
=100;
  }
  
else if(total==18){
   round
=5;
   sleepTime
=50;
  }
  
else if(total==20){
   round
=6;
   sleepTime
=20;
  }
  
else if(total>21){
   round
=7;
   sleepTime
=15;
  }
}
//把自己的组件全部画出来
public void paintComponent(Graphics g){
   g.setColor(Color.PINK);
   g.fillRect(
0,0,this.getWidth(),this.getHeight());
   g.setColor(Color.BLACK);
   g.drawRect(
40,10,358,360);
   
if(go){
    my.move();
    my.draw(g);
    g.setFont(
new Font("黑体",Font.BOLD,20));
    g.drawString(
"您的得分:"+(total*10)+"      第"+round+"",40,400);
   }
   
else{
    g.setFont(
new Font("黑体",Font.BOLD,20));
    g.drawString(
"游戏结束,按回车(ENTER)键重玩!",40,440);
   }
   g.setColor(Color.RED);
   g.fillRect(food.x,food.y,food.width,food.height);
}
private class MySnake{
  
private ArrayList<Rectangle> list;
  
public MySnake(){
   list
=new ArrayList<Rectangle>();
   list.add(
new Rectangle(160+24,130,10,10));
   list.add(
new Rectangle(160+12,130,10,10));
   list.add(
new Rectangle(160,130,10,10));
  }
  
//蛇移动的方法
  public void move(){
   
if(isDead()){
    go
=false;
    
return;
   }
   
if(dir==Direction.EAST){
    Rectangle rec
=list.get(0);
    Rectangle rec1
=new Rectangle(rec.x+(blockWidth+blockSpace),rec.y,rec.width,rec.height);
    list.add(
0,rec1);
   }
   
else if(dir==Direction.WEST){
    Rectangle rec
=list.get(0);
    Rectangle rec1
=new Rectangle(rec.x-(blockWidth+blockSpace),rec.y,rec.width,rec.height);
    list.add(
0,rec1);
   }
   
else if(dir==Direction.NORTH){
    Rectangle rec
=list.get(0);
    Rectangle rec1
=new Rectangle(rec.x,rec.y-(blockWidth+blockSpace),rec.width,rec.height);
    list.add(
0,rec1);
   }
   
else if(dir==Direction.SOUTH){
    Rectangle rec
=list.get(0);
    Rectangle rec1
=new Rectangle(rec.x,rec.y+(blockWidth+blockSpace),rec.width,rec.height);
    list.add(
0,rec1);
   }
   
if(isEat()){
    handleRound();
    makeFood();
   }
   
else{
    list.remove(list.size()
-1);
   }
  
  }
  
//判断是否吃到了食物
  private boolean isEat(){
   
if(list.get(0).contains(food)){
    total
++;
    
return true;
   }
   
else
    
return false;
  }
  
//判断是否死了,如果碰壁或者自己吃到自己都算死了
  private boolean isDead(){
   Rectangle temp
=list.get(0);
   
if(dir==Direction.EAST){
    
if(temp.x==388)
     
return true;
    
else{
     Rectangle comp
=new Rectangle(temp.x+12,temp.y,10,10);
     
for(Rectangle rec:list){
      
if(rec.contains(comp))
       
return true;
     }
    }
     
return false;
   }
   
else if(dir==Direction.WEST){
    
if(temp.x==40)
     
return true;
    
else {
     Rectangle comp
=new Rectangle(temp.x-12,temp.y,10,10);
     
for(Rectangle rec:list){
      
if(rec.contains(comp))
       
return true;
     }
    }
     
return false;
   }
   
else if(dir==Direction.NORTH){
    
if(temp.y==10)
     
return true;
    
else{
     Rectangle comp
=new Rectangle(temp.x,temp.y-12,10,10);
     
for(Rectangle rec:list){
      
if(rec.contains(comp))
       
return true;
     }
    }
     
return false;
   }
   
else if(dir==Direction.SOUTH){
    
if(temp.y==358)
     
return true;
    
else{
     Rectangle comp
=new Rectangle(temp.x,temp.y+12,10,10);
     
for(Rectangle rec:list){
      
if(rec.contains(comp))
       
return true;
     }
    }
     
return false;
   }
   
else{
    
return false;
   }
  }
  
//把自己画出来
  public void draw(Graphics g){
   
for(Rectangle rec:list){
    g.fillRect(rec.x,rec.y,rec.width,rec.height);
   }
  }
  
}
public static void main(String arsg[]){
  JFrame jf
=new JFrame("贪吃蛇");
  Snake s
=new Snake(jf);
  jf.getContentPane().add(s,BorderLayout.CENTER);
  jf.setBounds(
300,300,500,500);
  jf.setVisible(
true);
  jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//定义一个枚举,在此也可以用接口或者常量值代替
enum Direction{
EAST,
SOUTH,
WEST,
NORTH;
}

分享到:
评论

相关推荐

    [Android游戏源码]-简单的贪吃蛇源码.rar_Android游戏源码_android_android 贪吃蛇_贪吃蛇_贪

    《简单的贪吃蛇源码分析与探讨》 贪吃蛇是一款经典的休闲游戏,深受各年龄段玩家的喜爱。在Android平台上,我们可以找到许多实现贪吃蛇的游戏源码,这为我们理解和学习移动游戏开发提供了宝贵的学习资源。这里我们...

    jQuery贪吃蛇网页版游戏代码

    jQuery贪吃蛇网页版游戏代码,贪吃蛇网页版游戏代码基于jquery.1.11.3.min.js制作,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.Query网页版贪吃蛇游戏,带得分排行榜,交互的贪吃蛇游戏...

    双人贪吃蛇源代码

    双人贪吃蛇源代码 作为一名 IT 行业大师,我将为您生成相关知识点,详细解释标题、描述、标签和部分内容中的知识点。 标题:双人贪吃蛇源代码 双人贪吃蛇源代码是指在计算机程序设计基础课程设计中,设计和实现的...

    贪吃蛇_贪吃蛇图片.ico_贪吃蛇游戏mfc_贪吃蛇_MFC_

    标题中的“贪吃蛇_贪吃蛇图片.ico_贪吃蛇游戏mfc_贪吃蛇_MFC_”表明这是一个关于使用Microsoft Foundation Classes (MFC)框架开发的贪吃蛇游戏项目,其中可能包含了游戏的图标资源(.ico文件)和其他相关文件。...

    32贪吃蛇_基于stm32的oled贪吃蛇游戏_贪吃蛇STM32_stm32f103ret6_stm32贪吃蛇_贪吃蛇htm_源

    《基于STM32的OLED贪吃蛇游戏详解》 贪吃蛇游戏,作为一个经典的电子游戏,自上世纪80年代以来就深受玩家喜爱。而如今,我们可以通过微控制器(MCU)实现这个游戏,例如STM32系列单片机。本文将深入探讨如何使用STM...

    自己制作的贪吃蛇的aia

    贪吃蛇的aia 贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。 [1] 另外还有一种名为“贪吃蛇”钻井测井技术,是运用旋转导向系统、...

    贪吃蛇-代码-uml设计

    《贪吃蛇游戏的UML设计与实现》 贪吃蛇是一款经典的电子游戏,它以其简单易懂的规则和无尽的游戏模式深受玩家喜爱。在软件工程领域,将这种游戏进行设计并编码时,通常会借助统一建模语言(UML)来规划和组织项目的...

    Labview贪吃蛇课程设计

    《Labview贪吃蛇课程设计:打造趣味性虚拟仪器》 Labview(Laboratory Virtual Instrument Engineering Workbench)是一款由美国国家仪器公司(NI)开发的图形化编程环境,专为构建虚拟仪器而设计。在“Labview...

    GUI贪吃蛇图片素材

    在这个系列中,"贪吃蛇"小游戏是一个常见的教学实例,它通过实现一个简单的游戏来帮助初学者理解和运用Java的基本概念。 贪吃蛇游戏通常涉及到图形用户界面(GUI)的创建,这是Java中的一个重要主题。GUI允许用户与...

    AD工程 贪吃蛇脚本.rar

    标题中的“AD工程 贪吃蛇脚本.rar”表明这是一个与Active Directory(AD)相关的项目,同时结合了“贪吃蛇”的元素,这通常意味着它是一个编程脚本,可能是用某种编程语言编写的,用于在Windows环境中进行自动化或者...

    贪吃蛇大战 cocoscreator

    《贪吃蛇大战》是一款基于Cocos Creator开发的多人在线竞技游戏,它的核心玩法是玩家控制一条不断增长的蛇,在地图上吞食食物,同时避免与其他玩家的蛇相撞,以此来获得分数并竞争排行榜。Cocos Creator是一个强大的...

    大作业python游戏编程课程设计魔改贪吃蛇之贪吃蛇捕蛙游戏源码.zip

    大作业python游戏编程课程设计魔改贪吃蛇之贪吃蛇捕蛙游戏源码,完整代码注释,开发文档。 基于贪吃蛇捕蛙的游戏,贪食蛇吃了青蛙并不会变长,当贪食蛇吃了一些青蛙之后,游戏关卡会升级,升级后蛇的行动速度会变快...

    greedysnake_QT5贪吃蛇_qt贪吃蛇_贪吃蛇_

    【标题】"greedysnake_QT5贪吃蛇_qt贪吃蛇_贪吃蛇_" 指的是一个使用QT5框架开发的贪吃蛇游戏项目。QT5是Qt库的一个版本,它是一个跨平台的应用程序开发框架,广泛用于创建桌面、移动和嵌入式系统的图形用户界面。这...

    C语言--贪吃蛇相关PPT(详细介绍相关贪吃蛇过程及问题).pptx

    "C语言贪吃蛇相关PPT详细介绍贪吃蛇过程及问题" 通过分析给定的文件信息,我们可以总结出以下知识点: 1. C语言编程:贪吃蛇游戏的开发过程中使用C语言编程,包括项目的建立、头文件的使用、预编译头文件的作用等...

    个人编写的贪吃蛇

    【贪吃蛇游戏详解】 贪吃蛇是一款经典的计算机游戏,起源于1976年的"Blockade",随后在各种早期计算机和手机平台上流行。在这个个人编写的版本中,我们有机会深入了解一个简单的贪吃蛇游戏是如何实现的。下面将详细...

    贪吃蛇源码eclipse开发

    贪吃蛇是一款经典的电子游戏,它的源码分析和学习对于初学者来说是非常有价值的。这个"贪吃蛇源码eclipse开发"项目是用Java语言在Eclipse集成开发环境中编写的,因此我们可以从中深入理解Java编程语言和Eclipse IDE...

    13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码

    13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码13...

    c语言 贪吃蛇!贪吃蛇 c语言贪吃蛇

    c语言 贪吃蛇!贪吃蛇 c语言贪吃蛇,c语言 贪吃蛇!贪吃蛇 c语言贪吃蛇,c语言 贪吃蛇!贪吃蛇 c语言贪吃蛇

    C#贪吃蛇(非常强悍的C#贪吃蛇游戏,你一定不会后悔的)

    《C#贪吃蛇》是一款基于C#编程语言开发的极具挑战性和趣味性的经典小游戏,其强大之处在于它不仅保留了传统贪吃蛇的基本玩法,还融入了丰富的关卡设计和多样化的游戏功能,给玩家带来了更为丰富的游戏体验。...

    贪吃蛇程序包含源码

    《贪吃蛇程序详解——基于MFC与C++的实现》 贪吃蛇游戏作为一款经典的游戏,其简单易懂的规则和丰富的可玩性深受玩家喜爱,同时也是初学者学习编程的良好实践项目。本篇文章将深入探讨一个由初学者用MFC(Microsoft...

Global site tag (gtag.js) - Google Analytics