1. Square.cs :
  2.  
  3. public class Square : MonoBehaviour
  4. {
  5.   public int row, col;
  6.   public Rect rect;
  7.   public Texture texture;
  8.  
  9.   /// <summary>
  10.   /// 1向上 2向右 3向下 4向左
  11.   /// </summary>
  12.   public int nextDir = ;
  13.  
  14.   /// <summary>
  15.   /// 0背景 1蛇身 2食物
  16.   /// </summary>
  17.   public int state = ;
  18.  
  19.   public Square() { }
  20.  
  21.   public Square(int row, int col, Rect rect, Texture texture)
  22.   {
  23.     this.row = row;
  24.     this.col = col;
  25.     this.rect = rect;
  26.     this.texture = texture;
  27.   }
  28. }
  29.  
  30. SnakeEating.cs:
  31.  
  32. public class SnakeEating : MonoBehaviour
  33. {
  34.   public int row, col;//行数和列数
  35.   public Texture black, white, yellow;//三种背景图
  36.  
  37.   public float speed = 0.5f;//移动的时间间隔 秒
  38.  
  39.   private Square[][] Squares;//二维数组
  40.   private bool isGameOver = true;//游戏状态
  41.  
  42.   List<Square> snake;//蛇的节点集合
  43.  
  44.   void Start()
  45.   {
  46.     StartGame();
  47.   }
  48.  
  49.   /// <summary>
  50.   /// 开始游戏
  51.   /// </summary>
  52.   void StartGame()
  53.   {
  54.     int w = (Screen.height / row);//由于一般屏幕宽度大于高度,所以用高度除以行数得出每一个方块的边长
  55.     int x = (Screen.width / - (w * col) / );//设置整体的方块的x轴居中
  56.     int y = (Screen.height / - (w * row) / );//设置整体的方块的Y轴居中
  57.  
  58.     Squares = new Square[row][];//初始化二维数组
  59.  
  60.     Rect tempRect = new Rect(x, y, w, w);//初始化第一个方块的位置和大小
  61.     for (int i = ; i < row; i++)
  62.     {
  63.       Squares[i] = new Square[col];//实例化一行数组
  64.       for (int j = ; j < col; j++)
  65.       {
  66.         Squares[i][j] = new Square(i, j, tempRect, black);//实例化一个节点
  67.         tempRect.x += w;//x轴加上一个方块的宽度
  68.       }
  69.       tempRect.x = x;//x轴回到最左边
  70.       tempRect.y += w;//y轴加上一个方块的宽度到达下一行
  71.     }
  72.  
  73.     snake = new List<Square>();//初始化蛇的集合
  74.     Square head = Squares[(int)row / ][(int)col / ];//设置头结点为正中央的一个方块
  75.     head.texture = white;//白色
  76.     head.state = ;//蛇身
  77.     head.nextDir = Random.Range(, );//随机给出前进的方向
  78.     snake.Add(head);//添加到集合
  79.  
  80.     isGameOver = false;//游戏没有结束
  81.  
  82.     StartCoroutine("snakeMove");//启动协同程序
  83.   }
  84.  
  85.   IEnumerator snakeMove()
  86.   {
  87.     SetFood();
  88.     while (!isGameOver)
  89.     {
  90.       Square head = snake[];//获取头结点
  91.       int newRow = head.row, newCol = head.col;//获取头结点的行列下标
  92.       switch (snake[].nextDir)//根据头结点的方向找到下一个节点的下标
  93.       {
  94.         case :
  95.           newRow -= ;
  96.         break;
  97.         case :
  98.           newCol += ;
  99.         break;
  100.         case :
  101.           newRow += ;
  102.         break;
  103.         case :
  104.           newCol -= ;
  105.         break;
  106.       }
  107.  
  108.       //如果下一个节点的下标超出了二维数组的边界则游戏结束
  109.       if (newRow < || newRow >= row || newCol < || newCol >= col)
  110.       {
  111.         isGameOver = true;
  112.         break;
  113.       }
  114.       else if (Squares[newRow][newCol].state == )//如果下一个节点是蛇身则说明吃到自己了,因此游戏结束
  115.       {
  116.         isGameOver = true;
  117.         break;
  118.       }
  119.       else
  120.       {
  121.         snake.Insert(, Squares[newRow][newCol]);//将下一个节点加入集合的开头
  122.         snake[].texture = white;//设置它的颜色
  123.         snake[].nextDir = head.nextDir;//设置方向为上一个头结点的方向
  124.         if (snake[].state != )//如果新的头结点不是是食物则将最后一个节点设置为黑色,状态为0(空白),从列表中移除
  125.         {
  126.           Square end = snake[snake.Count - ];
  127.           end.texture = black;
  128.           end.state = ;
  129.           snake.RemoveAt(snake.Count - );
  130.         }
  131.         else
  132.         {
  133.           SetFood();//如果是食物则重新设置一个食物
  134.         }
  135.         snake[].state = ;//设置头结点的状态为1(蛇身)
  136.       }
  137.  
  138.       yield return new WaitForSeconds(speed);//等待speed秒
  139.       speed -= Time.deltaTime / ;//缩短移动的时间提高速度
  140.     }
  141.   }
  142.  
  143.   /// <summary>
  144.   /// 布置食物
  145.   /// 找到一个随机行列的上的节点
  146.   /// 判断结点如果不是的state(0空白,1蛇身,2食物)不是0则继续随机选择行列
  147.   /// 设置找到的节点的state为2,颜色设置为黄色
  148.   /// </summary>
  149.   public void SetFood()
  150.   {
  151.     int foodRow = Random.Range(, row);
  152.     int foodCol = Random.Range(, col);
  153.  
  154.     while (Squares[foodRow][foodCol].state != )
  155.     {
  156.       foodRow = Random.Range(, row);
  157.       foodCol = Random.Range(, col);
  158.     }
  159.  
  160.     Squares[foodRow][foodCol].state = ;//蛇身
  161.     Squares[foodRow][foodCol].texture = yellow;//黄颜色
  162.   }
  163.  
  164.   void Update()
  165.   {
  166.     if (!isGameOver)
  167.     {
  168.       if (Input.GetKeyDown(KeyCode.UpArrow))
  169.       {
  170.         if (snake.Count > )
  171.         {
  172.           if (snake[].row == snake[].row - && snake[].col == snake[].col)//判断用于防止反方向行走
  173.             return;
  174.         }
  175.         snake[].nextDir = ;//设置头结点的下一个方向 1上 2右 3下 4左
  176.       }
  177.       if (Input.GetKeyDown(KeyCode.RightArrow))
  178.       {
  179.         if (snake.Count > )
  180.         {
  181.           if (snake[].col == snake[].col + && snake[].row == snake[].row)
  182.             return;
  183.         }
  184.         snake[].nextDir = ;
  185.       }
  186.       if (Input.GetKeyDown(KeyCode.DownArrow))
  187.       {
  188.         if (snake.Count > )
  189.         {
  190.           if (snake[].row == snake[].row + && snake[].col == snake[].col)
  191.             return;
  192.         }
  193.         snake[].nextDir = ;
  194.       }
  195.       if (Input.GetKeyDown(KeyCode.LeftArrow))
  196.       {
  197.         if (snake.Count > )
  198.         {
  199.           if (snake[].col == snake[].col - && snake[].row == snake[].row)
  200.             return;
  201.         }
  202.         snake[].nextDir = ;
  203.       }
  204.     }
  205.   }
  206.  
  207.   void OnGUI()
  208.   {
  209.     if (!isGameOver)
  210.     {
  211.       //绘制二维数组中每一项
  212.       for (int i = ; i < row; i++)
  213.       {
  214.         for (int j = ; j < col; j++)
  215.         {
  216.           Square square = Squares[i][j];
  217.           GUI.DrawTexture(square.rect, square.texture);
  218.         }
  219.       }
  220.     }
  221.   }
  222. }

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. TCP/IP协议原理与应用笔记11:TCP/IP中地址与层次关系

    1. 网络中常用的地址: 2. TCP/IP中地址与层次关系 :

  2. 使用CSS、JS的几种方法

    引用CSS到html网页里的4种方法 1.行内式 在标记的style属性中设定CSS样式,这种方式本质上没有体现出CSS的优势,因此不推荐使用     <div style="widt ...

  3. 关于C#中get和set

    在看书的时候看见了一段代码,有两个类person: public class person { public string name; } public class person { public s ...

  4. angularjs项目中关于服务的应用

    /** *普通ajax请求公共服务 */ mainModule.factory('myService',function($http,$q){ var service = {}; var baseUr ...

  5. HTML (1)href与Action,get post

    1.   href与Action的区别 href只能get参数,action能get参数又能post参数 href一般用于单个连接,可以带参数(URL重写),是采用get方式请求的,在地址栏中可以看到 ...

  6. Notification封装(没做从网络下载)

    1.Notification作为消息通知,这里简单封装了使用 建立一个bean package com.jcut.view; /** * Author:JsonLu * DateTime:2016/2 ...

  7. MeasureSpec

    在自定义View和ViewGroup的时候,我们经常会遇到int型的MeasureSpec来表示一个组件的大小,这个变量里面不仅有组件的尺寸大小,还有大小的模式. 这个大小的模式,有点难以理解.在系统 ...

  8. My.Ioc 代码示例——注册项的注销和更新

    当您需要从 Ioc 容器中注销/删除一个注册项的时候,您会怎么做呢? 有人曾经在 stackoverflow 上提问“如何从 Unity 中注销一个注册项”.对于这个问题,有人的回答是“有趣.你为什么 ...

  9. WMI概述

    关于wmi的定义可以在网上和msdn中查询,我在这里想说说自己对wmi的理解.Wmi是Windows Management Instrumentation(windows管理方法)的缩写.在wmi中微 ...

  10. Xml解析之——Java/Android/Python

    Xml解析之——Java/Android/Python 一.Xml文件 test.xml <note> <to>George</to> <from>Jo ...