贪吃蛇的创建

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();}}
}

新手多多包含 ,有什么问题可以说。

C#简单小游戏之贪吃蛇相关推荐

  1. Scratch图形化编程之简单小游戏(贪吃蛇)

    目录 一.前言介绍 二.对象及其背景 三.面向对象的模块程序 3.1 贪吃蛇头 3.2 贪吃蛇身 3.3 Apple 四.成果展示 一.前言介绍 运用Scratch图像编程化编程,制作了一个能够通过按 ...

  2. cocos creator开发微信小游戏(五)贪吃蛇大作战

    目录 小游戏介绍 小游戏cocos creator场景图 小游戏部分JS代码 开发中碰到的问题 工程及说明 小游戏介绍 贪吃蛇小游戏:贪吃蛇试玩(首次加载比较慢),类似贪吃蛇大作战的小游戏.当玩家的蛇 ...

  3. 超级详细的注释C语言简单实现童年小游戏:贪吃蛇

    引言: 记得小时候还没有现在超级高端的智能手机,当时的诺基亚类型的老人机是我的最爱,而里面的贪吃蛇小游戏我总是能玩很久,所以今天就用C语言简单实现一下贪吃蛇这一个小游戏吧. 一. 准备工作: 1.VS ...

  4. Python小游戏:贪吃蛇——turtle的使用

    突然想把去年写的小游戏练习整合一下,写一个简单的教学文章吧. 该篇主要讲解利用python中turtle包制作小游戏,不涉及pygame的使用,仅用pycharm就可实现 0.理清游戏思路 要实现的效 ...

  5. C语言 小游戏之贪吃蛇

    还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...

  6. 基于RT-Thread实现的小游戏(贪吃蛇、俄罗斯方块)

    前言:本实现基于stm32芯片,移植RT_Thread Nano系统源码,实现两个小游戏(贪吃蛇/俄罗斯方块).本实验提供完整的IAR工程源码并且有很多注释,是一个不错的参考例程.关键知识点:OLED ...

  7. 贪吃蛇html网页小游戏,网页贪吃蛇HTML5小游戏制作

    贪吃蛇是以前我们经常在手机里玩的一个小游戏,现在要是把它搬到网页上也会让人更回味.这是一款非常有趣的HTML5响应式网页贪吃蛇小游戏.在游戏中你可以使用键盘的上下左右来控制蛇的运动方向.现在要列出的是 ...

  8. JavaScript+ Canvas开发趣味小游戏《贪吃蛇》

    一.效果展示 二.<贪吃蛇>基本实现思路 蛇头部分+蛇身体部分:采用对象形式来存储坐标,并将每个坐标对象放到一个snake数组中,方便使用.设置每个方格宽度30px,高度30px,画布高度 ...

  9. python写的贪吃蛇小游戏_Python贪吃蛇小游戏

    贪吃蛇 1. 导入游戏库 # 1.导入库 import pgzrun import random 2.游戏初始化 # 2.初始化 # 窗口大小 WIDTH = 600 HEIGHT = 480 # 贪 ...

最新文章

  1. cv2.fillConvexPoly填充多边形
  2. JAVA总结之数组篇
  3. github上fork原项目,如何将本地仓库代码更新到最新版本?
  4. 作为软件设计师的2013年终总结
  5. mysql主库宕机能写吗_MYSQL主主切换(主库宕机)_MySQL
  6. Nmap流量特征修改(NTA、IDS、IPS、流量审计)
  7. 【激活函数】Mish激活函数详解
  8. 远程出发jenkins jobs
  9. leetcode之旋转链表
  10. 如何导出微信的小视频
  11. Mugeda(木疙瘩)H5案例课—模拟朋友圈-岑远科-专题视频课程
  12. 计算机根号函数,excel公式中开根号是哪一个函数啊(excel开根号的公式)
  13. STM32F030F4P6单片机由外部时钟改为内部时钟
  14. [前端三剑客之CSS]display:none opacity:0 visibility:hidden三角恋的爱恨情仇
  15. android 适配红米,小米MIUI放出Android Q适配计划,11款手机参与,包括红米Note 7
  16. 2020中国移动OneNET之星物联网创客马拉松大赛
  17. python 通过ftp自动 上传指定excel文件
  18. 聊聊kafka consumer offset lag increase异常
  19. threejs旋转模型动画教程
  20. 运算器和控制器在计算机的作用,运算器和控制器功能作用(修改版).ppt

热门文章

  1. gps有几个轨道面_关于GPS系统你知道的有多少?
  2. 语音去噪深度学习模型论文总结(大多基于transformer)
  3. (19)C#传智:CSS,选择器,样式(第19天)
  4. 【Linux高频命令专题(5)】rmdir
  5. 来自一位应届生的建议
  6. java连锁o2o_全渠道java b2b b2c o2o平台
  7. C语言printf重入,单片机中printf函数的重映射
  8. CCRC认证和ISO27001认证有哪些不同?企业该如何申请?
  9. JAVA计算机毕业设计成都某4S店销售管理系统Mybatis+系统+数据库+调试部署
  10. vue移动端项目如何在真机测试