Square.cs :

public class Square : MonoBehaviour
{
  public int row, col;
  public Rect rect;
  public Texture texture;   /// <summary>
  /// 1向上 2向右 3向下 4向左
  /// </summary>
  public int nextDir = ;   /// <summary>
  /// 0背景 1蛇身 2食物
  /// </summary>
  public int state = ;   public Square() { }   public Square(int row, int col, Rect rect, Texture texture)
  {
    this.row = row;
    this.col = col;
    this.rect = rect;
    this.texture = texture;
  }
} SnakeEating.cs: public class SnakeEating : MonoBehaviour
{
  public int row, col;//行数和列数
  public Texture black, white, yellow;//三种背景图   public float speed = 0.5f;//移动的时间间隔 秒   private Square[][] Squares;//二维数组
  private bool isGameOver = true;//游戏状态   List<Square> snake;//蛇的节点集合   void Start()
  {
    StartGame();
  }   /// <summary>
  /// 开始游戏
  /// </summary>
  void StartGame()
  {
    int w = (Screen.height / row);//由于一般屏幕宽度大于高度,所以用高度除以行数得出每一个方块的边长
    int x = (Screen.width / - (w * col) / );//设置整体的方块的x轴居中
    int y = (Screen.height / - (w * row) / );//设置整体的方块的Y轴居中     Squares = new Square[row][];//初始化二维数组     Rect tempRect = new Rect(x, y, w, w);//初始化第一个方块的位置和大小
    for (int i = ; i < row; i++)
    {
      Squares[i] = new Square[col];//实例化一行数组
      for (int j = ; j < col; j++)
      {
        Squares[i][j] = new Square(i, j, tempRect, black);//实例化一个节点
        tempRect.x += w;//x轴加上一个方块的宽度
      }
      tempRect.x = x;//x轴回到最左边
      tempRect.y += w;//y轴加上一个方块的宽度到达下一行
    }     snake = new List<Square>();//初始化蛇的集合
    Square head = Squares[(int)row / ][(int)col / ];//设置头结点为正中央的一个方块
    head.texture = white;//白色
    head.state = ;//蛇身
    head.nextDir = Random.Range(, );//随机给出前进的方向
    snake.Add(head);//添加到集合     isGameOver = false;//游戏没有结束     StartCoroutine("snakeMove");//启动协同程序
  }   IEnumerator snakeMove()
  {
    SetFood();
    while (!isGameOver)
    {
      Square head = snake[];//获取头结点
      int newRow = head.row, newCol = head.col;//获取头结点的行列下标
      switch (snake[].nextDir)//根据头结点的方向找到下一个节点的下标
      {
        case :
          newRow -= ;
        break;
        case :
          newCol += ;
        break;
        case :
          newRow += ;
        break;
        case :
          newCol -= ;
        break;
      }       //如果下一个节点的下标超出了二维数组的边界则游戏结束
      if (newRow < || newRow >= row || newCol < || newCol >= col)
      {
        isGameOver = true;
        break;
      }
      else if (Squares[newRow][newCol].state == )//如果下一个节点是蛇身则说明吃到自己了,因此游戏结束
      {
        isGameOver = true;
        break;
      }
      else
      {
        snake.Insert(, Squares[newRow][newCol]);//将下一个节点加入集合的开头
        snake[].texture = white;//设置它的颜色
        snake[].nextDir = head.nextDir;//设置方向为上一个头结点的方向
        if (snake[].state != )//如果新的头结点不是是食物则将最后一个节点设置为黑色,状态为0(空白),从列表中移除
        {
          Square end = snake[snake.Count - ];
          end.texture = black;
          end.state = ;
          snake.RemoveAt(snake.Count - );
        }
        else
        {
          SetFood();//如果是食物则重新设置一个食物
        }
        snake[].state = ;//设置头结点的状态为1(蛇身)
      }       yield return new WaitForSeconds(speed);//等待speed秒
      speed -= Time.deltaTime / ;//缩短移动的时间提高速度
    }
  }   /// <summary>
  /// 布置食物
  /// 找到一个随机行列的上的节点
  /// 判断结点如果不是的state(0空白,1蛇身,2食物)不是0则继续随机选择行列
  /// 设置找到的节点的state为2,颜色设置为黄色
  /// </summary>
  public void SetFood()
  {
    int foodRow = Random.Range(, row);
    int foodCol = Random.Range(, col);     while (Squares[foodRow][foodCol].state != )
    {
      foodRow = Random.Range(, row);
      foodCol = Random.Range(, col);
    }     Squares[foodRow][foodCol].state = ;//蛇身
    Squares[foodRow][foodCol].texture = yellow;//黄颜色
  }   void Update()
  {
    if (!isGameOver)
    {
      if (Input.GetKeyDown(KeyCode.UpArrow))
      {
        if (snake.Count > )
        {
          if (snake[].row == snake[].row - && snake[].col == snake[].col)//判断用于防止反方向行走
            return;
        }
        snake[].nextDir = ;//设置头结点的下一个方向 1上 2右 3下 4左
      }
      if (Input.GetKeyDown(KeyCode.RightArrow))
      {
        if (snake.Count > )
        {
          if (snake[].col == snake[].col + && snake[].row == snake[].row)
            return;
        }
        snake[].nextDir = ;
      }
      if (Input.GetKeyDown(KeyCode.DownArrow))
      {
        if (snake.Count > )
        {
          if (snake[].row == snake[].row + && snake[].col == snake[].col)
            return;
        }
        snake[].nextDir = ;
      }
      if (Input.GetKeyDown(KeyCode.LeftArrow))
      {
        if (snake.Count > )
        {
          if (snake[].col == snake[].col - && snake[].row == snake[].row)
            return;
        }
        snake[].nextDir = ;
      }
    }
  }   void OnGUI()
  {
    if (!isGameOver)
    {
      //绘制二维数组中每一项
      for (int i = ; i < row; i++)
      {
        for (int j = ; j < col; j++)
        {
          Square square = Squares[i][j];
          GUI.DrawTexture(square.rect, square.texture);
        }
      }
    }
  }
}

Unity中OnGUI绘制贪吃蛇的更多相关文章

  1. 关于Unity中OnGUI()的简单使用

    有时候想要输出一些数据到屏幕上方便查看,新建一个UI对象又挺麻烦,用OnGUI()在屏幕上直接绘制UI比较方便. GUI.Label(, , , ), “aaa", style); 这条语句 ...

  2. Unity中动态绘制圆柱体

    问题背景 上次写了动态绘制立方体,这最近又来了新功能,绘制圆柱(风筒),要求是给了很多节点,根据节点去动态绘制风筒,风筒就是圆柱连接而成的,可以理解为管道,还有就是拐角处注意倒角,圆润过度过来. 实现 ...

  3. Unity经典游戏教程之:贪吃蛇

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  4. python贪吃蛇

    代码地址如下:http://www.demodashi.com/demo/13335.html 一.先展示python贪吃蛇效果 二.操作说明 按键 功能 UP 向上移动 DOWN 向下移动 LEFT ...

  5. C项目实践--贪吃蛇(1)

    1.功能需求分析 1.1主要功能 i.游戏欢迎界面 ii.游戏执行功能,包括计算得分 iii.游戏结束界面 1.2游戏基本规则 游戏开始时蛇的长度是4个单位,并且按照当前方向不停地移动.移动范围是CO ...

  6. 用Python实现童年小游戏贪吃蛇

    贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中.

  7. python写一个能变身电光耗子的贪吃蛇

    python写一个不同的贪吃蛇 写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦) 第一 ...

  8. AI贪吃蛇(二)

    前言 之前写过一篇关于贪吃蛇AI的博客,当时虽然取得了一些成果,但是也存在许多问题,所以最近又花了三天时间重新思考了一下.以下是之前博客存在的一些问题: 策略不对,只要存在找不到尾巴的情况就可能失败, ...

  9. 是男人就下100层【第四层】——Crazy贪吃蛇(2)

    在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇能够绕着手机屏幕边线移动而且能够改变方向 一.加入状态并改动代码 首先我 ...

随机推荐

  1. Eclipse混淆文件导入Android Studio Gradle编译报input jar file is specified twice

    Eclipse项目中的混淆配置文件 复制到AS中 在混淆的过程中提示如下错误     Error:Execution failed for task ':app:proguardDemoRelease ...

  2. .net之页面生面周期

    # 事件或方法 功能 描述 1 Init 事件 页面初始化 页面生存周期中的第一个阶段是初始化.当 Init 事件发生时,在.aspx 源文件中静态声明的所有控件都已实例化并取其默认值.应该注意的是, ...

  3. Android应用程序开发之图片操作(一)——Bitmap,surfaceview,imageview,Canvas

    Android应用程序开发之图片操作(一)——Bitmap,surfaceview,imageview,Canvas   1,Bitmap对象的获取 首先说一下Bitmap,Bitmap是Androi ...

  4. 分析器错误消息: 未能加载文件或程序集“System.WEB.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。

    分析器错误消息: 未能加载文件或程序集“System.WEB.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=3 ...

  5. OD: RPC - MS06040 & MS08067

    RPC 漏洞简介 Remote Procedure Call,分布式计算中常用到的技术.两台计算机通信过程可以分为两种形式:一种是数据的交换,另一种是进程间通信.RPC 属于进程间通信. RPC 就是 ...

  6. 从零开始,在windows上用nodejs搭建一个静态文件服务器

    从零开始,在windows上用nodejs搭建一个静态文件服务器 首先安装nodejs: 新建一个node文件夹 下载node.exe到该文件夹 下载npm然后解压到该文件夹 现在node文件夹是这样 ...

  7. js中的同步与异步

    同步:提交后等待服务器的响应,接收服务器返回的数据后再执行下面的代码    异步:与上面相反,提交后继续执行下面的代码,而在后台继续监听,服务器响应后有程序做相应处理,异步的操作好处是不必等待服务器而 ...

  8. gis-矢量与栅格数据结构的比较

    2.5矢量与栅格数据结构的比较 在计算机辅助制图和地理信息系统发展早期,最初引用的是矢量处理技术,栅格数据处理始于70年 代中期.几年以前,这两种数据结构势不两立,很难兼容,因此给数据利用带来许多不便 ...

  9. CSS注释代码

    就像在Html的注释一样,在CSS中也有注释语句:用/*注释语句*/来标明(Html中使用<!--注释语句-->).就像下面代码: 示例: <!DOCTYPE HTML> &l ...

  10. 再谈CMake与RPATH

    之前写过一篇<探讨CMake中关于RPATH的使用>,只要针对的方面是在编译生成之后(不包括安装的make install)如何去除RPATH的问题.今天给大家主要介绍一下如何让CMake ...