实现贪吃蛇部分功能

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

知识点:

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个小时,期间是因为蛇跑着跑着分叉了啊,或者是被一个白色的框子给框住了,或者蛇只能上下移动,等等,这些问题,还好最后对着老师原来给的项目,慢慢的调试好,但是,这就是效率问题,所以在今后编写的程序中一定要注意有所收获,而且要强加练习,不然效率还是上不去,好在这次我都理解了,不然效率没跟上,好多东西都没有理解,这才真正的说不过去。

时间: 2024-11-09 03:45:12

实现贪吃蛇部分功能的相关文章

C语言实现贪吃蛇之结构链表篇

之前的两篇博客将运用的C语言知识限定在了一般的数组上,但如果已经完整地了解过C语言的话,运用结构和链表会让程序的结构更明了,逻辑更清晰.这篇博客就将介绍如何用结构和链表改善之前的程序. 首先,我们为蛇的节点定义一个结构: typedef struct node{ COORD cor; struct node *next; }node; COORD结构我在上一篇已经介绍过,这里就直接借用了. COORD food = { 3,5 }; node *head; food也相应地由COORD来定义,并

我也来写一个贪吃蛇

最近工作量好大,好忙,趁周末练练手,花了近3小时写了一个贪吃蛇. 实现贪吃蛇的功能很简单. 我就分享一下我实现贪吃蛇看起来在界面上移动并且吃食物长大的原理. 我建了一个数组list_arr[]来保存贪吃蛇所在的每个格子的id,并建了2个全局变量x和y,监听贪吃蛇头的位置,当然x和y也是贪吃蛇的起始位置. 那么贪吃蛇移动实际上就是每次从list_arr[]里取出第一个元素(list_arr.shift()方法),取出的第一个元素也可以认为是贪吃蛇的尾巴,然后把这个元素(也就是格子的id)代表的格子

功能超级丰富的彩色贪吃蛇,有道具,有等级!

彩色的贪吃蛇实现,功能强大,有等级模块,道具功能,后面有效果预览,先上代码: console.h #include <windows.h> //颜色定义 #define FWHITE FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE //白色前景 #define FRED FOREGROUND_INTENSITY|FOREGROUND_RED //红色前景 #define FBLUE FOREGROUND_

用C写一个功能较为完善的贪吃蛇小游戏

主要功能: 方向控制-食物与增长-变速 1 #include<stdio.h> 2 #include<time.h>//种子-随机数 3 #include<windows.h>//system函数,控制台句柄 4 #include<conio.h>//按键 5 //界面(欢迎界面-游戏界面-结束得分界面)-驱动-方向控制-食物 6 //位置锁定-打印-删除 7 int snake_x[520]={0}; 8 int snake_y[520]={0}; 9 i

游戏开发(一)——控制台 贪吃蛇

贪吃蛇游戏设计中主要需要注意的几点: 1:坐标的定义:定义为左上角为(0,0),向右为x正方向,向下为y正方向 2:蛇的设计, 蛇身:m_body,这里用的是链表(是之前写好的双链表),一个节点就是蛇身的一节 每节蛇身的属性包括x,y坐标:column_x,row_y,x表示在地图上的第几列,y表示在地图上的第几行 蛇有一个属性叫朝向,也就是当前在往上.下.左.右的哪个方向移动:m_forward 蛇的动作有:Turn,转向.转向有个判断,就是不能向相反的方向转,比如本来向上运动,按向下键,是无

用Java开发贪吃蛇游戏

贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始提示:按空格键开始游戏 让蛇动起来:监听Timer事件,平移数据 实现游戏暂停 实现转向功能 Part 3: 添加食物 吃掉食物 添加死亡条件 实现“重新开始”功能 添加分数和长度 游戏图纸如下: 蛇及游戏框的素材如下:                              Snake主类: 1

贪吃蛇C++实现

1 #include <windows.h> 2 #include <stdlib.h> 3 #include <conio.h> 4 #include <time.h> 5 #include <cstring> 6 #include <cstdio> 7 #include <iostream> 8 #define N 22 9 using namespace std; 10 11 int gameover; 12 13

俄罗斯方块和贪吃蛇游戏软件:C语言应用初始感受

C语言课程设以一节课,老师提供了一个C语言的飞俄罗斯方块让我们感受,我们所学的C语言课程,主要是各种语句的练习,这次是用我们所学过的知识来感受一个实际的系统. 首先安装c-free,然后是将代码贴进去运行 界面虽然有点简单,但这确实使用C语言做出来的游戏. 分析一下程序,感觉没有太复杂的,就是上学期学习的简单语句的组合,但是用的非常好.首先看看用到了几种语句: 1.首先是在屏幕上显示的语句printf, 2.另外一个就是多条件判断switch--case 应用方法 switch(tetris->

JS的小游戏&quot;贪吃蛇&quot;

贪吃蛇儿时的回忆,今天刚好学习到这了,就刚好做了一个,也是学习了吧,需要掌握的知识: 1,JS函数的熟练掌握, 2,JS数组的应用, 3,JS小部分AJAX的学习 4,JS中的splice.shift等一些函数的应用, 基本上就这些吧,下面提重点部分: 前端的页面,这里可自行布局,我这边提供一个我自己的布局: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org