本篇笔记是跟着老师一起实现的贪吃蛇小游戏,可以和自己做的贪吃蛇比较一下,总结出不足的地方!
方向控制:WSAD
确定键:J
场景类型枚举 ---- E_SceneType
将Game类中的nowScene 改为静态的
将Game类中的场景切换方法也改静态的
Game中的调用也改
在GameScene实现Map中的方法
到这里可以实现的功能有:三个场景
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 贪吃蛇.Lesson3;
using 贪吃蛇.Lesson4;
namespace 贪吃蛇.Lesson6
{
///
/// 蛇的移动方向
///
enum E_MoveDir
{
Up,
Down,
Left,
Right,
}
class Snake : IDraw
{
SnakeBody[] bodys;
//记录当前蛇的长度
int nowNum;
//当前移动方向
E_MoveDir dir;
public Snake(int x, int y)
{
//粗暴的方法 直接申明200个空间 来装蛇身体的数组
bodys = new SnakeBody[200];
bodys[0] = new SnakeBody(E_SnakeBody_Type.Head, x, y);
nowNum = 1;
dir = E_MoveDir.Down;
}
public void Draw()
{
//画一节一节的身子
for (int i = 0; i < nowNum; i++)
{
bodys[i].Draw();
}
}
#region Lesson7 蛇的移动
public void Move()
{
//移动前
//擦除最后一个位置
Console.SetCursorPosition(bodys[nowNum - 1].pos.x, bodys[nowNum - 1].pos.y);
Console.WriteLine(" ");
//再移动
switch (dir)
{
case E_MoveDir.Up:
--bodys[0].pos.y;
break;
case E_MoveDir.Down:
++bodys[0].pos.y;
break;
case E_MoveDir.Left:
bodys[0].pos.x -= 2;
break;
case E_MoveDir.Right:
bodys[0].pos.x += 2;
break;
default:
break;
}
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 贪吃蛇.Lesson3;
using 贪吃蛇.Lesson4;
namespace 贪吃蛇.Lesson6
{
///
/// 蛇的移动方向
///
enum E_MoveDir
{
Up,
Down,
Left,
Right,
}
class Snake : IDraw
{
SnakeBody[] bodys;
//记录当前蛇的长度
int nowNum;
//当前移动方向
E_MoveDir dir;
public Snake(int x, int y)
{
//粗暴的方法 直接申明200个空间 来装蛇身体的数组
bodys = new SnakeBody[200];
bodys[0] = new SnakeBody(E_SnakeBody_Type.Head, x, y);
nowNum = 1;
dir = E_MoveDir.Down;
}
public void Draw()
{
//画一节一节的身子
for (int i = 0; i < nowNum; i++)
{
bodys[i].Draw();
}
}
#region Lesson7 蛇的移动
public void Move()
{
//移动前
//擦除最后一个位置
Console.SetCursorPosition(bodys[nowNum - 1].pos.x, bodys[nowNum - 1].pos.y);
Console.WriteLine(" ");
//再移动
switch (dir)
{
case E_MoveDir.Up:
--bodys[0].pos.y;
break;
case E_MoveDir.Down:
++bodys[0].pos.y;
break;
case E_MoveDir.Left:
bodys[0].pos.x -= 2;
break;
case E_MoveDir.Right:
bodys[0].pos.x += 2;
break;
default:
break;
}
}
#endregion
#region Lesson8 改变方向
public void ChangeDir(E_MoveDir dir)
{
//只有头部的时候 可以直接左转右 右转左 上转下 下转上
//有身体时 这些情况就不能直接转
if (this.dir == dir ||
nowNum > 1 &&
(this.dir == E_MoveDir.Up && dir == E_MoveDir.Down ||
this.dir == E_MoveDir.Down && dir == E_MoveDir.Up ||
this.dir == E_MoveDir.Left && dir == E_MoveDir.Right ||
this.dir == E_MoveDir.Right && dir == E_MoveDir.Left))
{
return;
}
//只要没有 return 就记录外面传入的方向 之后就会按照这个方向去移动
this.dir = dir;
}
#endregion
}
}
在GameScene里面实现调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 贪吃蛇.Lesson3;
using 贪吃蛇.Lesson4;
using 贪吃蛇.Lesson5;
namespace 贪吃蛇.Lesson6
{
///
/// 蛇的移动方向
///
enum E_MoveDir
{
Up,
Down,
Left,
Right,
}
class Snake : IDraw
{
SnakeBody[] bodys;
//记录当前蛇的长度
int nowNum;
//当前移动方向
E_MoveDir dir;
public Snake(int x, int y)
{
//粗暴的方法 直接申明200个空间 来装蛇身体的数组
bodys = new SnakeBody[200];
bodys[0] = new SnakeBody(E_SnakeBody_Type.Head, x, y);
nowNum = 1;
dir = E_MoveDir.Down;
}
public void Draw()
{
//画一节一节的身子
for (int i = 0; i < nowNum; i++)
{
bodys[i].Draw();
}
}
#region Lesson7 蛇的移动
public void Move()
{
//移动前
//擦除最后一个位置
Console.SetCursorPosition(bodys[nowNum - 1].pos.x, bodys[nowNum - 1].pos.y);
Console.WriteLine(" ");
//再移动
switch (dir)
{
case E_MoveDir.Up:
--bodys[0].pos.y;
break;
case E_MoveDir.Down:
++bodys[0].pos.y;
break;
case E_MoveDir.Left:
bodys[0].pos.x -= 2;
break;
case E_MoveDir.Right:
bodys[0].pos.x += 2;
break;
default:
break;
}
}
#endregion
#region Lesson8 改变方向
public void ChangeDir(E_MoveDir dir)
{
//只有头部的时候 可以直接左转右 右转左 上转下 下转上
//有身体时 这些情况就不能直接转
if (this.dir == dir ||
nowNum > 1 &&
(this.dir == E_MoveDir.Up && dir == E_MoveDir.Down ||
this.dir == E_MoveDir.Down && dir == E_MoveDir.Up ||
this.dir == E_MoveDir.Left && dir == E_MoveDir.Right ||
this.dir == E_MoveDir.Right && dir == E_MoveDir.Left))
{
return;
}
//只要没有 return 就记录外面传入的方向 之后就会按照这个方向去移动
this.dir = dir;
}
#endregion
#region Lesson9 撞墙撞身体结束逻辑
public bool CheckEnd(Map map)
{
for (int i = 0; i < map.walls.Length; i++)
{
if (bodys[0].pos == map.walls[i].pos)
{
return true;
}
}
for (int i = 1; i < nowNum; i++)
{
if (bodys[0].pos == bodys[i].pos)
{
return true;
}
}
return false;
}
#endregion
}
}
GameScene中调用
Snake类里面添加的相关方法 -- (Lesson10 部分)
GameScene类中调用
Snake类中添加方法
(加了Lesson11--长身体AddBody方法,在Lesson10吃食物方法里面调用了AddBody方法,然后在Lesson7中添加了蛇尾跟着蛇头移动的逻辑处理)
至此跟着老师进行的制作的功能都已实现
C#核心实践--贪吃蛇(老师实现的)
还是得多敲多练,多想想怎么让代码更精简,逻辑怎么更清晰!
多挤些时间啊!