码迷,mamicode.com
首页 > 其他好文 > 详细

实现贪吃蛇部分功能

时间:2015-01-15 18:12:15      阅读:400      评论:0      收藏:0      [点我收藏+]

标签:

     贪吃蛇又名贪食蛇,是一款经典的小游戏。玩家使用方向键操控一条长长的蛇不断吞下豆子,同时蛇身随着吞下的豆子不断变长,当蛇头撞到蛇身或障壁时游戏结束。贪吃蛇最初为人们所知的是诺基亚手机附带的一个小游戏,它伴随着诺基亚手机走向世界。现在的贪吃蛇出现了许多衍生版本,并被移植到各种平台上。但我今天所实现的功能是蛇的移动与增长。

知识点:

1.理解android应用的基本架构,面向对象的思想,以及代码的简洁明了。

2.了解整个程序的结构。

3.理解每一行代码的意思。

操作步骤:

1.首先创建一个类,类名Kuai.java,代码如下:

package com.cqvie;

import android.graphics.*;
import android.graphics.Paint.Style;

public  class Kuai
  {
    //public int HANG, LIE; //最大行、最大列
    public int hang, lie; //当前行、当前列
    public int BianChang; //方块的边长
    public int YanSe; //方块的颜色
    public void Hua(Bitmap bmp) //在画布上画方块
    {
        Canvas c=new Canvas(bmp);
        Rect rc=new Rect(
                lie * BianChang, hang * BianChang,
                (lie+1) * BianChang,(hang+1) * BianChang);
        Paint paint=new Paint();
        paint.setColor(YanSe);
        paint.setStyle(Style.STROKE); //空心
        paint.setStrokeWidth(2); //线宽
        
        c.drawRect(rc, paint);
    }
  }

2.创建一个关于蛇的类,类名:She.java,代码如下:

package com.cqvie;

import java.util.LinkedList;
import java.util.List;
import android.graphics.*;

public class She
  {
    private List<Kuai> k; //块的集合
    private int fangXiang; //蛇的运动方向(上下左右)
    private int BianChang; //蛇的块的边长(所有块都一样大)

    public She(int hang,int lie,int fangxiang,int BianChang) //构造函数
    {
      this.fangXiang = fangxiang;
      this.BianChang = BianChang;
      k = new LinkedList<Kuai>(); //产生存放块的集合
      Kuai tou = new Kuai();
      tou.hang = hang;
      tou.lie = lie;
      k.add(tou); //把蛇头加入到集合中
      Kuai shen = new Kuai();
      shen.hang = tou.hang;
      shen.lie = tou.lie + 1;
      k.add(shen); //把蛇身加入到集合中
    }
    public void hua(Bitmap bmp) //画蛇
    {
      //用黑色填充画布
      Canvas c=new Canvas(bmp);
      c.drawColor(Color.BLACK);
      for (int i = 0; i < k.size(); i++) //k.size()是集合中块的数量
      {
        k.get(i).BianChang = BianChang; //块的边长等于蛇的边长
        k.get(i).YanSe = Color.WHITE;
        k.get(i).Hua(bmp);
      }

    }

    public void ZengZhang()
    {
      Kuai kk = new Kuai();
      Kuai k1 = k.get(k.size() - 1); //倒数第一个块(尾巴)
      Kuai k2 = k.get(k.size() - 2); //倒数第二个块
      kk.hang = k1.hang + (k1.hang - k2.hang);
      kk.lie = k1.lie + (k1.lie - k2.lie);
      k.add(kk);
    }

    public void YiDong() //前一个块的旧坐标,即后一个块的新坐标
    {
      for (int i = k.size() - 1; i >= 1; i--) //除蛇头之外的其它块
      {
        k.get(i).hang = k.get(i-1).hang;
        k.get(i).lie = k.get(i-1).lie;
      }
      if (fangXiang == 1) //蛇头
          k.get(0).hang--;
      else if (fangXiang == 2)
          k.get(0).hang++;
      else if (fangXiang == 3)
          k.get(0).lie--;
      else
          k.get(0).lie++;
    }

    public void GaiBianFangXiang(int fx)
    {
      if (fangXiang==2 && fx == 1)
        return;
      if (fangXiang==1 && fx == 2)
        return;
      if (fangXiang==3 && fx == 4)
        return;
      if (fangXiang==4 && fx == 3)
        return;
      fangXiang = fx;
    }
  }

3.创建第三个类,类名:gameView

package com.cqvie;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Bitmap.Config;
import android.view.View;

public class gameView extends View implements Runnable
{
    Bitmap bmp;
    Thread thread;
    public She s;
    
    public gameView(Context context) {
        super(context);
        bmp=Bitmap.createBitmap(600,400,Config.ARGB_8888);
        s=new She(30, 30, 3, 6);
        //启动线程
        thread = new Thread(this);
        thread.start();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        s.YiDong();
        s.hua(bmp);
        canvas.drawBitmap(bmp, 0, 0, null);
    }

    @Override
    public void run() {
        while (thread != null)
        {
            //实现界面刷新(调用onDraw)
            this.postInvalidate();
            try
            {
                Thread.sleep(300);
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }

        }
    }


}

4.最后一步,在类TCSActivity中编写代码,实现功能,代码如下:

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class TCSActivity extends Activity implements OnClickListener {
    
    gameView game; //全局对象

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        game=new gameView(this);
        setContentView(game);

        game.setOnClickListener(this);
        
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch(keyCode)
        {
        case KeyEvent.KEYCODE_DPAD_UP:
            game.s.GaiBianFangXiang(1);
            return true;
        case KeyEvent.KEYCODE_DPAD_DOWN:
            game.s.GaiBianFangXiang(2);
            return true;
        case KeyEvent.KEYCODE_DPAD_LEFT:
            game.s.GaiBianFangXiang(3);
            return true;
        case KeyEvent.KEYCODE_DPAD_RIGHT:
            game.s.GaiBianFangXiang(4);
            return true;
        }
         return super.onKeyDown(keyCode, event);
    }

    @Override
    public void onClick(View v) {
        game.s.ZengZhang();
    }
}

5.运行程序,出现以下结果。

技术分享

总结:

      对于编写贪吃蛇这个程序,我还是费了不少力气,虽然老师有讲,也给了程序项目,但是重在理解,所以就不断的百度,问大神,最后才慢慢理解了,然后对着老师给的程序项目代码的注释,慢慢一点一点的理解,最后才算是真正的成功,收获也是很大的去哪,更重要的是练习,明显我练习的还不够,如果熟练的话,估计也就用30分钟就可以做完这个项目,但是我却整整用了2个小时,期间是因为蛇跑着跑着分叉了啊,或者是被一个白色的框子给框住了,或者蛇只能上下移动,等等,这些问题,还好最后对着老师原来给的项目,慢慢的调试好,但是,这就是效率问题,所以在今后编写的程序中一定要注意有所收获,而且要强加练习,不然效率还是上不去,好在这次我都理解了,不然效率没跟上,好多东西都没有理解,这才真正的说不过去。

实现贪吃蛇部分功能

标签:

原文地址:http://blog.csdn.net/sjian123/article/details/42744471

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!