贪吃蛇的创建
1:声明地图
通过声明一个40x40的地图 把边界都表示为墙 为55
private int[,] Map = new int[40, 40];//地图 我把0作为当前位置为空,可以行走,1作为蛇的位置 2,作为果子的位置
private void Show()
{
for(int i = 0; i < 40; i++)
{
for(int j = 0; j < 40; j++)
{
if (i == 0 || i == 39 || j == 0 || j == 39) Console.Write("55");
else Console.Write(" ");
}
Console.WriteLine();
}
}//输出地图
2:创建蛇 通过创建一个蛇类 来放 蛇的x和y坐标
class Snake
{
public int x, y;
public Snake(int x,int y)
{
this.x = x;
this.y = y;
}
public Snake(Snake S)
{
this.x = S.x;
this.y = S.y;
}
}
在游戏类中存放一个List《蛇》的链表 然后初始化3个蛇。由于添加是添加到末尾,所以末尾为蛇头 ,List[0]为蛇尾
private List<Snake> Listarr = new List<Snake>() {new Snake(10,10), new Snake(11, 10), new Snake(12, 10) };//蛇的位置
然后写一个方法让蛇在地图上显示出来,因为如果每次通过闪屏来刷新画面不好看,可以通过C#的Console.SetCursorPosition()方法来覆盖地图 来实现地图的更新
方法如下
private void Crose(int x,int y,int z)
{
if (z == -1)#当z==-1 时 输出当前分数
{
Console.SetCursorPosition(x * 2, y);
Console.Write(Sec);
}
#z==0时 输出蛇身体,初始化
if (z == 0)
{
Console.SetCursorPosition(x*2, y);
Map[x, y] = 1;
Console.Write("□");
}
#当z==3时 输出蛇的身体 同时做判断 是否需要删除尾巴
if (z == 3)
{
Console.SetCursorPosition(x * 2, y);
Console.Write("□");
if (Map[x, y] != 2) Remove_tail();#判断当前位置有没有果子 如果有就不执行删除尾巴
else RandFrite();
Map[x, y] = 1;
}#输出果子的位置
if (z == 1)
{
Console.SetCursorPosition(x * 2, y);
Console.Write("◆");
}#让当前格子重新变成空白
if (z == 2)
{
Console.SetCursorPosition(x * 2, y);
Console.Write(" ");
Map[x, y] = 0;
}#让光标停在下面 不然会对地图有影响
Console.SetCursorPosition(0,40);
}
private void Remove_tail()
{
Snake tail = Listarr[0];#获取蛇的尾巴
Crose(tail.x, tail. y, 2);把地图上尾巴的位置清理
Listarr.RemoveAt(0);#删除尾巴
}//删除蛇的尾部
通过z的值来让函数在选中位置输入想要更新的图标
3:蛇的移动
蛇的移动就是通过蛇头位置来确定的,然后创建一个默认的移动方向,当键盘无操作时,选择移动默认的方向 ,可以创建一个枚举
enum Move
{
up,#上
down,#下
left,#左
right#右
}
private Move Movement=Move.right;#默认移动
private void MoveSnake(Move move)#通过传参数来确定默认的移动
{
Snake Head = new Snake(Listarr[Listarr.Count - 1]);#获取蛇头位置
switch (move)#判断下一步方向
{
case Move.up:#向上走为 y轴-1 判断地图位置有没有蛇 如果有执行GameOver
#如果没有 则将该位置添加到蛇的头部
if (Head.y != 1 && Map[Head.x, Head.y - 1] != 1)
{
Head.y--;#更新头部的坐标
Listarr.Add(Head);
}
else GameOver();
break;
case Move.down:
if (Head.y != 38 && Map[Head.x, Head.y+1] != 1)
{
Head.y++;
Listarr.Add(Head);
}
else GameOver();
break;
case Move.left:
if (Head.x != 1 && Map[Head.x-1, Head.y] != 1)
{
Head.x--;
Listarr.Add(Head);
}
else GameOver();
break;
case Move.right:
if (Head.x != 38 && Map[Head.x+1, Head.y] != 1)
{
Head.x++;
Listarr.Add(Head);
}
else GameOver();
break;
default:
break;
}
Crose(Head.x, Head.y, 3);
}
private void GameOver() {
Console.WriteLine("游戏结束");
Environment.Exit(0);
}//结束游戏
4:随机果子的位置
void RandFrite()
{
int x = R.Next(1, 39);#随机x坐标
int y = R.Next(1, 39);#随机y坐标
if (Map[x, y] == 0)#判断当前位置有没有蛇
{
Crose(x, y, 1);#更新果子地图
Map[x, y] = 2;#更新Map地图
location.x = x;
location.y = y;
Sec++;
Crose(49, 0, -1);
if (Sec != 0 && Sec % 10 == 0) Col();
}
else this.RandFrite();#如果当前位置有蛇 则继续调用该函数重新随机 直到随机出空位置
}
5:获取键盘录入
private void PlayKeyBoard()
{
while (true)#一直读取键盘录入来改变方向 当方向相反则不改变
{
char a = Console.ReadKey().KeyChar;
if (a == 'w' || a == 'W')
{
Snake Head = Listarr[Listarr.Count - 1];
if (Map[Head.x, Head.y-1] != 1)
{
this.Movement = Move.up;
}
}if (a == 's' || a == 'S')
{
Snake Head = Listarr[Listarr.Count - 1];
if (Map[Head.x, Head.y +1] != 1)
{
this.Movement = Move.down;
}
}
if (a == 'a' || a == 'A')
{
Snake Head = Listarr[Listarr.Count - 1];
if (Map[Head.x-1, Head.y ] != 1)
{
this.Movement = Move.left;
}
}
if (a == 'D' || a == 'd')
{
Snake Head = Listarr[Listarr.Count - 1];
if (Map[Head.x+1, Head.y ] != 1)
{
this.Movement = Move.right;
}
}
}
}//获取键盘移动
6:写初始化程序
public void Play()
{
this.Show();#输出地图
Console.SetCursorPosition(85, 0);
Console.Write("当前分数为:");
this.initialize();
RandFrite(); #初始化第一个果子
Thread T = new Thread(PlayKeyBoard);#开启键盘录入线程
T.Start();
while (true)
{#每等待sPeed秒 移动一次
Thread.Sleep(Speed);
this.MoveSnake(Movement);
}
就是这样
源码 蛇类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace New_Snake
{
class Snake
{
public int x, y;
public Snake(int x,int y)
{
this.x = x;
this.y = y;
}
public Snake(Snake S)
{
this.x = S.x;
this.y = S.y;
}
}
}
自动寻路 后面补充
class wall
{
public int x, y;
public List<int> A = new List<int>();
public wall() { }
public wall(wall w1)
{
foreach (var item in w1.A)
{
this.A.Add(item);
}
this.x = w1.x;
this.y = w1.y;
}
static public bool operator==(wall w1,wall w2){
//if (w1 == null || w2 == null) return false;
if (w1.x == w2.x && w1.y == w2.y) return true;
else return false;
}
static public bool operator !=(wall w1, wall w2)
{
return !(w1 == w2);
}
}
游戏类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace New_Snake
{
class Player
{
#region 字段
enum Move
{
up,
down,
left,
right
}//移动方向
private wall location=new wall();
int Speed = 20;//速度
wall W;
private int[,] Map = new int[40, 40];//地图
ConsoleColor Color=ConsoleColor.White;
private int Sec = -1;
private Move Movement=Move.right;//默认移动
private Random R = new Random();//随机果子
private List<Snake> Listarr = new List<Snake>() {new Snake(10,10), new Snake(11, 10), new Snake(12, 10) };//蛇的位置
#endregion
#region 方法
private void Remove_tail()
{
Snake tail = Listarr[0];
Crose(tail.x, tail. y, 2);
Listarr.RemoveAt(0);
}//删除蛇的尾部
void Col()
{
int i = R.Next(0, 14);
switch (i)
{
case 0:
Color = ConsoleColor.Red;
break;
case 1:
Color = ConsoleColor.Yellow;
break;
case 2:
Color = ConsoleColor.Green;
break;
case 3:
Color = ConsoleColor.Cyan;
break;
case 4:
Color = ConsoleColor.White;
break;
case 5:
Color = ConsoleColor.Black;
break;
case 6:
Color = ConsoleColor.Gray;
break;
case 7:
Color = ConsoleColor.Blue;
break;
case 8:
Color = ConsoleColor.DarkBlue;
break;
case 9:
Color = ConsoleColor.DarkCyan;
break;
case 10:
Color = ConsoleColor.DarkMagenta;
break;
case 11:
Color = ConsoleColor.Magenta;
break;
case 12:
Color = ConsoleColor.DarkGreen;
break;
case 13:
Color = ConsoleColor.DarkYellow;
break;
default:
break;
}
Console.BackgroundColor = Color;
}
void RandFrite()
{
int x = R.Next(1, 39);
int y = R.Next(1, 39);
if (Map[x, y] == 0)
{
Crose(x, y, 1);
Map[x, y] = 2;
location.x = x;
location.y = y;
Sec++;
Crose(49, 0, -1);
if (Sec != 0 && Sec % 10 == 0) Col();
}
else this.RandFrite();
}//生成果子
void AiFindWall()
{
W = new wall( way_finding());
foreach (var item in W.A)
{
this.Mo(item);
Thread.Sleep(Speed);
this.MoveSnake(Movement);
}
this.AiFindWall();
}
private void Game()
{
bool B = false;
wall W;
W = new wall(way_finding());
while (true)
{
this.MoveSnake(Movement);
Thread.Sleep(Speed);
}
}//让蛇每Speed毫秒后移动
public void Mo(int i)
{
if (i == 0) this.Movement = Move.up;
if (i == 1) this.Movement = Move.down;
if (i == 2) this.Movement = Move.left;
if (i == 3) this.Movement = Move.right;
}
public wall way_finding()//寻路
{
List<wall> wo = new List<wall>();
int[,] FindMap = new int[40, 40];
for (int i = 0; i < Listarr.Count; i++)
{
FindMap[Listarr.ElementAt(i).x, Listarr[i].y] = 1;
}
wall Head = new wall();
Head.x = Listarr[Listarr.Count - 1].x;
Head.y = Listarr[Listarr.Count - 1].y;
wo.Add(new wall(Head));
for (int i = 0; i < wo.Count; i++)
{
wall W = wo.ElementAt(i);
int A = i;
if (W.x != 38 && FindMap[W.x + 1, W.y] == 0)
{
FindMap[W.x + 1, W.y] = 1;
wall NewAI = new wall(W);
NewAI.x = W.x + 1;
NewAI.A.Add(3);
wo.Add(NewAI);
}
if (W.x != 1 && FindMap[W.x - 1, W.y] == 0)
{
FindMap[W.x - 1, W.y] = 1;
wall NewAI = new wall(W);
NewAI.x = W.x - 1;
NewAI.A.Add(2);
wo.Add(NewAI);
}
if (W.y != 38 && FindMap[W.x, W.y + 1] == 0)
{
FindMap[W.x, W.y + 1] = 1;
wall NewAI = new wall(W);
NewAI.y = W.y + 1;
NewAI.A.Add(1);
wo.Add(NewAI);
}
if (W.y != 1 && FindMap[W.x, W.y - 1] == 0)
{
FindMap[W.x, W.y - 1] = 1;
wall NewAI = new wall(W);
NewAI.y = W.y - 1;
NewAI.A.Add(0);
wo.Add(NewAI);
}
for (int z = A; z < wo.Count; z++)
{
if (wo.ElementAt(z) == location) return wo.ElementAt(z);
}
}
if (wo.Count > 5)
return wo.ElementAt(wo.Count / 2);
else
{
GameOver();
return null;
}
}
private void Crose(int x,int y,int z)
{
if (z == -1)
{
Console.SetCursorPosition(x * 2, y);
Console.Write(Sec);
}
if (z == 0)
{
Console.SetCursorPosition(x*2, y);
Map[x, y] = 1;
Console.Write("□");
}
if (z == 3)
{
Console.SetCursorPosition(x * 2, y);
Console.Write("□");
if (Map[x, y] != 2) Remove_tail();
else RandFrite();
Map[x, y] = 1;
}
if (z == 1)
{
Console.SetCursorPosition(x * 2, y);
Console.Write("◆");
}
if (z == 2)
{
Console.SetCursorPosition(x * 2, y);
Console.Write(" ");
Map[x, y] = 0;
}
Console.SetCursorPosition(0,40);
}//设置光标
private void PlayKeyBoard()
{
while (true)
{
char a = Console.ReadKey().KeyChar;
if (a == 'w' || a == 'W')
{
Snake Head = Listarr[Listarr.Count - 1];
if (Map[Head.x, Head.y-1] != 1)
{
this.Movement = Move.up;
}
}if (a == 's' || a == 'S')
{
Snake Head = Listarr[Listarr.Count - 1];
if (Map[Head.x, Head.y +1] != 1)
{
this.Movement = Move.down;
}
}
if (a == 'a' || a == 'A')
{
Snake Head = Listarr[Listarr.Count - 1];
if (Map[Head.x-1, Head.y ] != 1)
{
this.Movement = Move.left;
}
}
if (a == 'D' || a == 'd')
{
Snake Head = Listarr[Listarr.Count - 1];
if (Map[Head.x+1, Head.y ] != 1)
{
this.Movement = Move.right;
}
}
}
}//获取键盘移动
private void GameOver() {
Console.WriteLine("游戏结束");
Environment.Exit(0);
}//结束游戏
private void MoveSnake(Move move)
{
Snake Head = new Snake(Listarr[Listarr.Count - 1]);
switch (move)
{
case Move.up:
if (Head.y != 1 && Map[Head.x, Head.y - 1] != 1)
{
Head.y--;
Listarr.Add(Head);
}
else GameOver();
break;
case Move.down:
if (Head.y != 38 && Map[Head.x, Head.y+1] != 1)
{
Head.y++;
Listarr.Add(Head);
}
else GameOver();
break;
case Move.left:
if (Head.x != 1 && Map[Head.x-1, Head.y] != 1)
{
Head.x--;
Listarr.Add(Head);
}
else GameOver();
break;
case Move.right:
if (Head.x != 38 && Map[Head.x+1, Head.y] != 1)
{
Head.x++;
Listarr.Add(Head);
}
else GameOver();
break;
default:
break;
}
Crose(Head.x, Head.y, 3);
}//蛇的移动
private void initialize()
{
if (Listarr.Count != 0)
{
foreach (var item in Listarr)
{
}
}
}//蛇的初始化
private void Show()
{
for(int i = 0; i < 40; i++)
{
for(int j = 0; j < 40; j++)
{
if (i == 0 || i == 39 || j == 0 || j == 39) Console.Write("55");
else Console.Write(" ");
}
Console.WriteLine();
}
}//输出地图
public void Play()
{
this.Show();
Console.SetCursorPosition(85, 0);
Console.Write("当前分数为:");
this.initialize();
RandFrite();
Thread.Sleep(50);
Thread T = new Thread(PlayKeyBoard);
T.Start();
while (true)
{
Thread.Sleep(Speed);
this.MoveSnake(Movement);
}
//AiFindWall();
}//开始程序
#endregion
}
}
main类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace New_Snake
{
class Program
{
static void Main(string[] args)
{
Player P=new Player();
P.Play();
}
}
}
新手多多包含 ,有什么问题可以说。