基于java se的贪吃蛇程序

这个程序主要是对Eclipse这个程序的初次使用,熟悉练手的一个小游戏程序.

  • 首先,我们要清楚的知道awt的用法,用于画我们的画面承载

  • 其次,我们要了解数组中当时用到的"小孩拉手"的循环链接的算法(动态)

  • 还有匿名类方法的应用以及内部类的应用.public和private的使用

  • 其中掺杂中多线程的的使用以及对屏幕闪烁的解决.
    这个项目是对所有基础的一个小总结,值得用心去学习,总结

      构建我们的基本类以及画面.
      我们需要的类有三个,YARD,SNAKE,EGG.
      通过面向对象的构建过程,我们首先要对我们的画面大小进行规定.
            
        这时候,我们需要的有ROWS(行多少个小格)
        COLS(列多少个小格),以及BLOCK_SIZE(每个小格的尺寸)...  
      int COLS = 100;int ROWS =100 ;int BLOCK_SIZE = 5;//(全部为public) 
    
      其次是我们的awt框架,使用的是Frame形式,我们有了以上数据之后,调用java.awt.Frame.
      this.Location(200,200);//这个Frame窗口的初次出现位置
      this.setSize(长,宽);//通过以上定义,对这个画面尺寸进行规定
      this.setVisible(boolean)//是否取用Frame为默认调用
      通过上面的定义我们可以画出一个空白大小的画面.
    
      我们需要考虑的是,把这些画面分割个一个个小格子,这样更好的直观.需要调用的是java.awt.Graphics(一个抽象的接口)
      这个时候,一个重要的用法出现了,paint对我们的画面进行修改
      public void paint(Graphics g) {
      Color c = g.getColor(); //用一个java.awt.Color类中的方法,定义一个c.把当前颜色保存在c中
      g.setColor(Color.*);//对我的画笔颜色进行改变.
      g.fillRect(0, 0, COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE);//画出我们的矩形的尺寸(需要用到Frame中的)
      g.setColor(Color.*);//画完上述矩形的颜色之后,我们对画笔颜色再次改变进行画线
      for(int i=1; i<ROWS; i++) {
      g.drawLine(0, BLOCK_SIZE * i, COLS * BLOCK_SIZE, BLOCK_SIZE * i);//对横向画线
      for(int i=1; i<COLS; i++) {//对纵向画线
      g.drawLine(BLOCK_SIZE * i, 0, BLOCK_SIZE * i, BLOCK_SIZE * ROWS);
      通过上述方法,我们对我们的院子进行了勾画.
    
      通过以上方法对我们的snake以及egg,进行Run命令,对我们的画面进行模拟,是否需要调整,
      以上为awt的画法.当我们的界面画出来之后,我们需要对关闭发方式进行定义
    引用WindowAdapter添加监听addWindowListener()引用里面的windowClosing进行重写
    this.addWindowListener(new WindowAdapter()){//匿名类方法定义
        public void windowClosing(WindowEvent e){System.exit(0);}
     这个代码为界面关闭Window事件,也需要引用
      import  java.awt.event.WindowAdapter;
      import java.awt.event.WindowEvent;
    
    此时,我们的界面窗口可以看到我们的一个蛇头,一个窗口,以及一个鸡蛋.
    private static Random r = new Random();//鸡蛋的随机出现定义.
    public Egg() {this(r.nextInt(Yard.ROWS-2) + 2, r.nextInt(Yard.COLS));}
    我们实现三者的实物出现之后,我们需要知道的是更多的属性去定义.
    对于Snake来说,他需要有蛇头,以及蛇头以外的蛇尾,我们需要对蛇头,以及蛇尾分别进行定义
    定义方法与我们之前的"小孩拉手"相似,为一个循环拉手问题.
    我们需要的有head(),tail().addTohead,addTotail,next,prev来解决蛇移动的问题.
    我们可以通过将尾巴替代蛇头,在移动方向添加新的蛇头来定义我们的移动.这样可以有deletetail方法.以及Node的定义蛇身的每一个点,
    通过循环画笔,对其进行绘画,这样可以实现移动过程中吃到鸡蛋的添加过程.
    我们还需要通过KeyPress()的指令,通过对键盘事件的监听,实现我们对方向的定义.
    通过方向的定义,我们在将蛇头变化的位置以及对应添加的位置对新出现的点进行位置定义.  
     private void move() {
      addToHead();
      deleteFromTail();
      checkDead();
    

    }
    以上我们实现的是,我们通过键盘实现对蛇的移动
    我们还需要对PantThread的多线程方法的定义,我们使这个蛇进行持续的循环方向运动,

     我们还要思考的是,如何实现蛇头跟鸡蛋发生碰撞时,如何实现这个过程.Rectangle函数,需要我们去了解.
    public void eat(Egg e) {
      if(this.getRect().intersects(e.getRect())) {
          e.reAppear();
          this.addToHead();
          y.setScore(y.getScore() + 5);
      }
    

    }

    private Rectangle getRect() {
    return new Rectangle();
    }
    这个时候,我们完成了碰撞增长,移动,持续移动的测试之后,我们还需要有的是游戏进程的判定,

    • 分为得分的判定,跟碰撞同步,以及撞墙和自己碰到自己身体时候的失败判定,以及游戏进程中的重新开始(暂停未涉及)的
      '多线程判定.游戏在进行中的进行的重新开始,为多线程.
      private class PaintThread implements Runnable {
      private boolean running = true;
      private boolean pause = false;
      public void run() {
      while(running) {
      if(pause) continue;
      else repaint();

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
      

      }

      public void pause() {
      this.pause = true;
      }

      public void reStart() {
      this.pause = false;
      s = new Snake(Yard.this);
      gameOver = false;
      }

      public void gameOver() {
      running = false;
      }
      }

      这样我们一个最简单的贪吃蛇就可以做完了,我们可以在其中继续添加功能,实现暂停等操作.

      PS:屏幕闪烁问题的解决
      public void update(Graphics g) {
      if(offScreenImage == null) {
      offScreenImage = this.createImage(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE);
      }
      Graphics gOff = offScreenImage.getGraphics();
      paint(gOff);
      g.drawImage(offScreenImage, 0, 0, null);
      }
      update指令的了解.以及对offScreenImage的了解. Image的了解.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,209评论 0 2
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,439评论 25 707
  • 我喜欢看电影,也喜欢在豆瓣记录自己看过的电影。 转发到朋友圈后,底下总有朋友问“好看吗?”我每次都期待自己可以直接...
    MozillaD阅读 233评论 0 0
  • 投资人投资企业多从以下维度进行分析: [同pm汇报产品模式的思路] 1.产品是什么? 对接的用户群体是谁? 产品服...
    污琳阅读 2,356评论 0 3