贪吃蛇2.0

命令行贪吃蛇2.0

实现过程 & 遇到的问题
  1. 最开始想用动态数组来记录蛇,后来改成只记录头尾,发现只记录头尾没办法实现, 所以用队列来记录蛇。

  2. 地图Map为X行Y列,但是Console.SetCursorPoisition()函数的X轴是横,y轴是纵轴。Console.SetCursorPosition(HeadY, HeadX);

  3. Console.KeyAvailable 用来检测按键是否按下,如果没按下保持现方向不变。

  4. private int[] MoveTo=new int[8] { -1, 0, 1, 0, 0, -1, 0, 1 };根据输入将wasd映射为整数对应,前四个为HeadX的改变量,后四个为HeadY的改变量。将不同方向的函数整合为一个函数

5.定义了 LastFoodX 和 LastFoodY 来实现 吃近食物的效果,当食物到了蛇尾时,蛇长度加一。

链接: http://pan.baidu.com/s/1jIsOZrS 密码: qq8u

玩家体验

根据玩家建议加入了可重新开始和蛇反方向移动时游戏该结束。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Threading;



namespace Snake
{


  class snake
  {
      private int x;
      private int y;
      public bool isHead;
      public snake(int a,int b,bool h)
      {
          x = a;
          y = b;
          isHead = h;
      }
      public int getx()
      {
          return x;
      }
      public int gety()
      {
          return y;
      }
  }
  class Map
  {
      const int WALL = -1;
      const int BODY = 1;
      const int HEAD = 2;
      const int FOOD = 3;
      const int MapHeight = 20;
      const int MapWidth = 40;
      private int [,] map =new int [50,50];
      private int HeadX = 5;
      private int HeadY = 6;
      private int dir = 3;
      private int FoodX;
      private int FoodY;
      private int LastFoodX = -1;
      private int LastFoodY = -1;
      private bool end = false ;
      private int[] MoveTo=new int[8] { -1, 0, 1, 0, 0, -1, 0, 1 };
      private Queue <snake >s = new Queue<snake>();

      public Map()
      {
          int i, j;
          snake a = new snake(HeadX, HeadY-2, false);
          snake b = new snake(HeadX, HeadY-1, false);
          snake c = new snake(HeadX, HeadY, true);
          s.Enqueue(a);
          s.Enqueue(b);
          s.Enqueue(c);
          for (i = 0; i <=MapHeight; i++)
              for (j = 0; j <= MapWidth; j++)
              {
                  if (i == 0 || i == MapHeight || j == 0 || j == MapWidth)
                      map[i,j] = WALL ;
              }
          foreach (snake item in s)
          {
              if (item.isHead)
                  map[item.getx(), item.gety()] = HEAD ;
              else map[item.getx(), item.gety()] = BODY ;
          }
      }
      public void AddFood()
      {
          Random rnd = new Random();
          do
          {
              FoodX =rnd.Next(1,MapHeight);
              FoodY = rnd.Next (1,MapWidth);
          } while (map[FoodX, FoodY] != 0);
          map[FoodX, FoodY] = FOOD;
          Console.SetCursorPosition(FoodY, FoodX);
          Console.Write("$");
      }
      public void show()
      {
          Console.SetCursorPosition(0, 0);
          int i, j;
          for (i = 0; i <= MapHeight; i++)
          {
              for (j = 0; j <= MapWidth; j++)
              {
                  if (map[i, j] == WALL)
                      Console.Write("#");
                  else if (map[i, j] == HEAD)
                      Console.Write("O");
                  else if (map[i, j] == BODY)
                      Console.Write("o");
                  else Console.Write(" ");
              }
              Console.WriteLine();
          }
          AddFood();
      }
      public void HandleInput()
      {
          ConsoleKeyInfo op = new ConsoleKeyInfo();
          if (Console.KeyAvailable)
          {
              op = Console.ReadKey(true);
              switch (op.KeyChar)
              {
                  case 'w':
                  case 'W':
                      dir = 0;
                      break;
                  case 'a':
                  case 'A':
                      dir = 1;
                      break;
                  case 's':
                  case 'S':
                      dir = 2;
                      break;
                  case 'd':
                  case 'D':
                      dir = 3;
                      break;
              }
          }
      }
      public void Move()
      { 

          if (map[HeadX+MoveTo[dir] ,HeadY + MoveTo[dir+4] ]!= WALL  && map[HeadX + MoveTo[dir], HeadY + MoveTo[dir + 4]] != BODY )
          {
              Console.SetCursorPosition(HeadY, HeadX);
              Console.Write("o");
              map[HeadX, HeadY] = BODY ;
              if (LastFoodX > 0 && LastFoodY>0)
              {
                  Console.SetCursorPosition(LastFoodY, LastFoodX);
                  Console.Write("0");
              }
              HeadX += MoveTo[dir];
              HeadY += MoveTo[dir + 4];
              map[HeadX, HeadY] = HEAD ;
              snake newHead = new snake(HeadX, HeadY, true);
              s.Enqueue(newHead);
              Console.SetCursorPosition(HeadY, HeadX);
              Console.Write("O");
              if(HeadX==FoodX && HeadY==FoodY)
              {
                  LastFoodX = HeadX;
                  LastFoodY = HeadY;
                  AddFood();

              }
              snake tail = s.Peek();
              if (LastFoodX== tail.getx() && LastFoodY== tail.gety())
              { 
                  LastFoodX = -1;
                  LastFoodY = -1;
              }
              else
              {
                  s.Dequeue();
                  Console.SetCursorPosition(tail.gety(), tail.getx());
                  map[tail.getx(), tail.gety()] = 0;
                  Console.Write(" ");
              }
          }
          else
          {
              end = true;
              Console.SetCursorPosition((MapWidth-9)/2, MapHeight/2-1);
              Console.Write("Game Over");
              Console.SetCursorPosition( 8, MapHeight / 2);
              Console.Write("Press any key to restart...");
          }
      }
      public bool isEnd()
      {
          return end;
      }
  }
  class Program
  {
      static void Main(string[] args)
      {
          while(true )
          {
              Map m = new Map();
              m.show();
              while (!m.isEnd())
              {
                  m.HandleInput();
                  m.Move();
                  Thread.Sleep(200);
              }
              Console.ReadKey(true);
          }
      }
  }

}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值