吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 3080|回复: 10

[源码] .NET C#贪吃蛇游戏课程设计项目

[复制链接]
zx2cwf 发表于 2015-7-18 22:51 | 显示全部楼层 |阅读模式

这是写了三天的小游戏,大家下载玩玩,自己暂未发现任何bug


搜狗截图20150718224221.png

源码下载:


贪吃蛇.zip (229.18 KB, 下载次数: 4)

主要源码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Media;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using 贪吃蛇.Entities;
  12. using 贪吃蛇.Util;
  13. using System.Runtime.InteropServices;// 使用MCI Command String多媒体设备程序接口

  14. namespace 贪吃蛇.Controller
  15. {
  16.     /// <summary>
  17.     /// 游戏控制器 用来控制整个游戏的逻辑
  18.     /// </summary>
  19.     class GameController
  20.     {
  21.         private Ground ground;//游戏控制器所控制的背景对象
  22.         public Snake snake;//游戏控制器所控制的蛇对象

  23.         private MainForm mForm;//主窗体类

  24.         private Thread snakeMoveThread;//线程控制

  25.         private Graphics graphics;//Gdi+对象


  26.         /// <summary>
  27.         /// 构造函数,初始化当前对象的背景字段和蛇字段
  28.         /// </summary>
  29.         public GameController(Graphics g, MainForm mForm)
  30.         {
  31.             this.mForm = mForm;
  32.             this.graphics = g;
  33.             this.ground = new Ground();
  34.             this.snake = new Snake();
  35.         }

  36.         /// <summary>
  37.         /// 初始化地图、蛇以及食物
  38.         /// </summary>
  39.         public void InitMap()
  40.         {
  41.             //绘制背景
  42.             this.ground.DrawMe(graphics);

  43.             //绘制蛇
  44.             this.snake.DrawMe(graphics);

  45.             //在地图上随机的产生一个食物
  46.             this.ground.MakeFood(graphics, snake);
  47.         }


  48.         /// <summary>
  49.         /// 开始新游戏的方法
  50.         /// </summary>
  51.         public void NewGame()
  52.         {


  53.             //让蛇动起来
  54.             snakeMoveThread = new Thread(SnakeAutoMoveThread);//创建线程
  55.             snakeMoveThread.IsBackground = true;//设置为后台线程
  56.             snakeMoveThread.Start();//开启线程

  57.         }


  58.         #region 蛇移动的线程方法
  59.         /// <summary>
  60.         /// 蛇移动的线程方法
  61.         /// </summary>
  62.         private void SnakeAutoMoveThread()
  63.         {

  64.             //判断蛇头是否能继续移动
  65.             //取出蛇头的坐标 判断蛇头的坐标是否越界

  66.             while (ground.IsMoveable(snake))
  67.             {
  68.                 if (snake.IsEatSelf())//判断蛇头是否吃到自己
  69.                 {
  70.                     break;
  71.                 }

  72.                 if (ground.IsEatFood(snake))//判断一下蛇是否吃到了食物
  73.                 {
  74.                     snake.AddBody();//如果吃到了食物 增加蛇的身体
  75.                     ground.MakeFood(graphics, snake);//再次随机的产生一个食物
  76.                     CommonHelper.Score++;//加分数
  77.                     mForm.ShowScore();
  78.                 }
  79.                 this.snake.AutoMove(graphics);
  80.                 Thread.Sleep(CommonHelper.GetSpeed());
  81.             }
  82.             CommonHelper.SoundPlayer.Stop();
  83.             SoundPlayer sp = new SoundPlayer();
  84.             sp.SoundLocation = Directory.GetCurrentDirectory() + @"\sound\gameover.wav";
  85.             sp.Play();
  86.             graphics.DrawString("GameOver", new Font("宋体", 50), new SolidBrush(Color.Yellow), new Point(30, 30));
  87.         }
  88.         #endregion

  89.         #region 处理用户传递过来的按键
  90.         /// <summary>
  91.         /// 处理用户传递过来的按键
  92.         /// </summary>
  93.         /// <param name="keyData"></param>
  94.         public void ProcessDialogKey(Keys keyData)
  95.         {
  96.             switch (keyData)
  97.             {
  98.                 case Keys.Up:
  99.                     snake.SnakeHead.Dir = Direction.Up;
  100.                     break;
  101.                 case Keys.Down:
  102.                     snake.SnakeHead.Dir = Direction.Down;
  103.                     break;
  104.                 case Keys.Right:
  105.                     snake.SnakeHead.Dir = Direction.Right;
  106.                     break;
  107.                 case Keys.Left:
  108.                     snake.SnakeHead.Dir = Direction.Left;
  109.                     break;
  110.             }
  111.         }
  112.         #endregion

  113.         #region 暂停线程 暂停游戏
  114.         /// <summary>
  115.         /// 暂停线程 暂停游戏
  116.         /// </summary>
  117.         public void PauseThread()
  118.         {
  119.             try
  120.             {
  121.                 CommonHelper.SoundPlayer.Stop();
  122.                 snakeMoveThread.Suspend();
  123.             }
  124.             catch
  125.             {
  126.             }

  127.         }
  128.         #endregion

  129.         #region 恢复线程 恢复游戏
  130.         /// <summary>
  131.         /// 恢复线程 恢复游戏
  132.         /// </summary>
  133.         public void RecoverThread()
  134.         {
  135.             try
  136.             {
  137.                 CommonHelper.SoundPlayer.PlayLooping();
  138.                 snakeMoveThread.Resume();
  139.             }
  140.             catch
  141.             {


  142.             }
  143.         }
  144.         #endregion

  145.     }
  146. }
复制代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using 贪吃蛇.Util;

  8. namespace 贪吃蛇.Entities
  9. {
  10.     /// <summary>
  11.     /// 贪吃蛇类 表示一条贪吃蛇
  12.     /// </summary>
  13.     class Snake
  14.     {
  15.         //蛇的身体单元集合,使用链表集合可以最快得到蛇头以及蛇尾
  16.         public LinkedList<SnakeUnit> body = new LinkedList<SnakeUnit>();

  17.         /// <summary>
  18.         /// 蛇头属性 取到body集合中的第一个元素
  19.         /// </summary>
  20.         public SnakeUnit SnakeHead
  21.         {
  22.             get
  23.             {
  24.                 return this.body.First.Value;
  25.             }
  26.         }
  27.         /// <summary>
  28.         /// 构造函数,为body链表集合中新增3个身体单元
  29.         /// </summary>
  30.         public Snake()
  31.         {
  32.             //蛇头:
  33.             //1.创建一个身体单元对象
  34.             SnakeUnit unit = new SnakeUnit(CommonHelper.ColCount / 2, CommonHelper.RowCount / 2);
  35.             //2.将这个身体单元对象添加到链表集合中去,当做蛇头
  36.             body.AddFirst(unit);
  37.             AddBody();
  38.             AddBody();
  39.         }

  40.         /// <summary>
  41.         /// 为当前蛇对象新增一个身体单元
  42.         /// </summary>
  43.         public void AddBody()
  44.         {
  45.             //创建一个身体单元对象,这个身体单元对象的坐标应在最后1个身体单元的基础上行不变
  46.             //列加1
  47.             Position pos = body.Last.Value.Pos;//取到最后一个节点的坐标

  48.             //行不变,列+1 对pos的修改不会影响最后一个节点的位置,因为pos为结构体(值类型)
  49.             pos.colIndex++;

  50.             //创建身体1个单元对象,坐标就是pos
  51.             SnakeUnit unit = new SnakeUnit(pos,RandomMaker.GetRandomColor());
  52.             body.AddLast(unit);

  53.         }

  54.         /// <summary>
  55.         /// 蛇自己画自己的方法
  56.         /// </summary>
  57.         /// <param name="g"></param>
  58.         public void DrawMe(Graphics g)
  59.         {
  60.             //蛇自己画自己的方法,只需要遍历body链表集合中的每个元素
  61.             //调用每个元素的DrawMe方法
  62.             foreach (SnakeUnit u in body)
  63.             {
  64.                 u.DrawMe(g);
  65.             }
  66.         }

  67.         /// <summary>
  68.         /// 蛇自动移动的方法
  69.         /// </summary>
  70.         public void AutoMove(Graphics g)
  71.         {
  72.             //擦除整条蛇
  73.             this.WipeMe(g);

  74.             //根据每一个单元的前进方法 改变身体单元的坐标
  75.             LinkedListNode<SnakeUnit> node = body.First;
  76.             while (node!=null)
  77.             {
  78.                 //先将遍历出来的元素按照现在的方向更改坐标
  79.                 switch (node.Value.Dir)
  80.                 {
  81.                     case Direction.Left:
  82.                         node.Value.MoveToLeft();
  83.                         break;
  84.                     case Direction.Right:
  85.                         node.Value.MoveToRight();
  86.                         break;
  87.                     case Direction.Down:
  88.                         node.Value.MovetoDown();
  89.                         break;
  90.                     case Direction.Up:
  91.                         node.Value.MoveToUp();
  92.                         break;
  93.                     default:
  94.                         break;
  95.                 }
  96.                 //将刚才移动的方向保存起来
  97.                 node.Value.OldDir = node.Value.Dir;

  98.                 //设置下一次前进的方向
  99.                 if (node.Previous!=null)
  100.                 {
  101.                     node.Value.Dir = node.Previous.Value.OldDir;
  102.                 }

  103.                 node = node.Next;
  104.             }
  105.             


  106.             //根据坐标绘制整条蛇
  107.             this.DrawMe(g);

  108.         }

  109.         /// <summary>
  110.         /// 蛇自己擦除自己的方法
  111.         /// </summary>
  112.         /// <param name="g"></param>
  113.         private void WipeMe(Graphics g)
  114.         {
  115.             //遍历链表集合,调用每一个身体单元自己擦除自己的方法
  116.             foreach (SnakeUnit u in body)
  117.             {
  118.                 u.WipeMe(g);
  119.             }
  120.         }
  121.         /// <summary>
  122.         /// 判断蛇头是否吃到了自己
  123.         /// </summary>
  124.         /// <returns></returns>
  125.         public bool IsEatSelf()
  126.         {
  127.             //取出蛇头的坐标
  128.             Position pos = this.SnakeHead.Pos;

  129.             //将其他身体单元遍历出来 做对比
  130.             LinkedListNode<SnakeUnit> node = body.First.Next;
  131.             
  132.             while (node!=null)
  133.             {
  134.                 if (node.Value.Pos.colIndex==pos.colIndex&&node.Value.Pos.rowIndex==pos.rowIndex)
  135.                 {
  136.                     return true;
  137.                 }
  138.                 node = node.Next;
  139.             }
  140.             return false;

  141.         }
  142.     }

  143. }
复制代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using 贪吃蛇.Util;


  8. namespace 贪吃蛇.Entities
  9. {
  10.     /// <summary>
  11.     /// 身体单元类 用来表示组成蛇的每一个身体单元
  12.     /// </summary>
  13.     class SnakeUnit
  14.     {
  15.         #region 身体单元的颜色 默认为红色

  16.         /// <summary>
  17.         /// 颜色
  18.         /// </summary>
  19.         private Color color = Color.Red;

  20.         public Color Color
  21.         {
  22.             get { return color; }
  23.             set { color = value; }
  24.         }

  25.         #endregion

  26.         #region 身体单元的坐标
  27.         /// <summary>
  28.         /// 坐标
  29.         /// </summary>
  30.         private Position pos;

  31.         internal Position Pos
  32.         {
  33.             get { return pos; }
  34.             set { pos = value; }
  35.         }
  36.         #endregion

  37.         #region 构造函数 用于各种方式创建对象
  38.         public SnakeUnit(int rowIndex, int colIndex)
  39.         {
  40.             this.pos.rowIndex = rowIndex;
  41.             this.pos.colIndex = colIndex;
  42.         }

  43.         public SnakeUnit(int rowIndex, int colIndex, Color color)
  44.             : this(rowIndex, colIndex)
  45.         {
  46.             this.color = color;
  47.         }
  48.         public SnakeUnit(Position pos)
  49.         {
  50.             this.pos = pos;
  51.         }
  52.         public SnakeUnit(Position pos, Color color)
  53.             : this(pos)
  54.         {
  55.             this.color = color;
  56.         }
  57.         #endregion

  58.         #region 将当前身体单元所在单元格的颜色填充为当前身体单元对象的颜色
  59.         /// <summary>
  60.         /// 当前身体单元根据自己的坐标和颜色将自己绘制出来
  61.         /// </summary>
  62.         /// <param name="g"></param>
  63.         public void DrawMe(Graphics g)
  64.         {
  65.             //将当前身体单元所在单元格的颜色填充为当前身体单元对象的颜色
  66.             Brush brush = new SolidBrush(this.color);
  67.             g.FillRectangle(brush, new Rectangle(
  68.                 this.pos.colIndex * CommonHelper.SquLength + 1,
  69.                 this.pos.rowIndex * CommonHelper.SquLength + 1,
  70.                 CommonHelper.SquLength - 1,
  71.                 CommonHelper.SquLength - 1
  72.                 ));
  73.         }
  74.         #endregion

  75.         #region 身体但单元的前进方向 默认向左
  76.         private Direction dir = Direction.Left;

  77.         internal Direction Dir
  78.         {
  79.             get { return dir; }
  80.             set { dir = value; }
  81.         }
  82.         #endregion

  83.         #region 身体单元向左移动
  84.         /// <summary>
  85.         /// 身体单元方向向走移动 其实就是身体单元的列坐标-1
  86.         /// </summary>
  87.         public void MoveToLeft()
  88.         {
  89.             this.pos.colIndex--;
  90.         }
  91.         #endregion
  92.         #region 身体单元向上移动
  93.         /// <summary>
  94.         /// 身体单元方向向上移动 其实就是身体单元的行坐标-1
  95.         /// </summary>
  96.         public void MoveToUp()
  97.         {
  98.             this.pos.rowIndex--;
  99.         }
  100.         #endregion
  101.         #region 身体单元向右移动
  102.         /// <summary>
  103.         /// 身体单元方向向右移动的方法 其实就是身体单元的列坐标+1
  104.         /// </summary>
  105.         public void MoveToRight()
  106.         {
  107.             this.pos.colIndex++;
  108.         }
  109.         #endregion
  110.         #region 身体单元向下移动
  111.         /// <summary>
  112.         /// 身体单元方向向下移动的方向 其实就是身体单元的行坐标+1
  113.         /// </summary>
  114.         public void MovetoDown()
  115.         {
  116.             this.pos.rowIndex++;
  117.         }
  118.         #endregion

  119.         #region 身体单元擦除自己的方法
  120.         /// <summary>
  121.         /// 身体单元自己擦除自己方法
  122.         /// </summary>
  123.         /// <param name="g"></param>
  124.         public void WipeMe(Graphics g)
  125.         {
  126.             //将当前身体单元所在的单元格的颜色填充为背景色
  127.             Brush brush = new SolidBrush(CommonHelper.GroundColor);
  128.             g.FillRectangle(brush, new Rectangle(
  129.                 this.pos.colIndex * CommonHelper.SquLength + 1,
  130.                 this.pos.rowIndex * CommonHelper.SquLength + 1,
  131.                 CommonHelper.SquLength - 1,
  132.                 CommonHelper.SquLength - 1
  133.                 ));
  134.         }
  135.         #endregion

  136.         #region 身体单元移动的旧方向
  137.         private Direction oldDir = Direction.Left;

  138.         internal Direction OldDir
  139.         {
  140.             get { return oldDir; }
  141.             set { oldDir = value; }
  142.         }
  143.         #endregion
  144.     }
  145. }
复制代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using 贪吃蛇.Entities;
  8. using System.Media;


  9. namespace 贪吃蛇.Util
  10. {
  11.     /// <summary>
  12.     /// 游戏帮助类 这个类中提供整个程序中需要被共享的数据
  13.     /// </summary>
  14.     static class CommonHelper
  15.     {
  16.         #region 初始化游戏环境

  17.         /// <summary>
  18.         /// 初始化游戏环境的方法
  19.         /// </summary>
  20.         /// <param name="panelWidth">游戏面板的宽度</param>
  21.         /// <param name="panelHeight">游戏面板的高度</param>
  22.         public static Size InitializeEnvironment(int panelWidth, int panelHeight)
  23.         {
  24.             //根据游戏面板的宽度和高度以及游戏面板的总行数和总列数为squLength赋值
  25.             int width = panelWidth / colCount;//小方格的宽度
  26.             int height = panelHeight / rowCount;//小方格的高度

  27.             //取较短的一边作为小方格的边长
  28.             squLength = width > height ? height : width;//取得小方格的边长

  29.             Size size = new Size();
  30.             size.Width = squLength * colCount+1;
  31.             size.Height = squLength * rowCount+1;
  32.             return size;
  33.         }
  34.         #endregion

  35.         #region 游戏面板的总行数 默认14行
  36.         private static int rowCount = 14;

  37.         public static int RowCount
  38.         {
  39.             get { return CommonHelper.rowCount; }
  40.             set { CommonHelper.rowCount = value; }
  41.         }
  42.         #endregion

  43.         #region 游戏面板的总列数 默认12列
  44.         private static int colCount = 12;

  45.         public static int ColCount
  46.         {
  47.             get { return CommonHelper.colCount; }
  48.             set { CommonHelper.colCount = value; }
  49.         }
  50.         #endregion

  51.         #region 小方格的边长
  52.         private static int squLength;

  53.         public static int SquLength
  54.         {
  55.             get
  56.             {
  57.                 return CommonHelper.squLength;
  58.             }
  59.         }
  60.         #endregion

  61.         #region 线条颜色 默认是黑色
  62.         private static Color lineColor = Color.Black;

  63.         public static Color LineColor
  64.         {
  65.             get { return CommonHelper.lineColor; }
  66.             set { CommonHelper.lineColor = value; }
  67.         }
  68.         #endregion

  69.         #region 背景颜色 默认是天蓝色
  70.         private static Color groundColor = Color.SkyBlue;

  71.         public static Color GroundColor
  72.         {
  73.             get { return CommonHelper.groundColor; }
  74.             set { CommonHelper.groundColor = value; }
  75.         }

  76.         
  77.         #endregion

  78.         #region 食物的颜色 默认是白色
  79.         private static Color foodColor = Color.White;

  80.         public static Color FoodColor
  81.         {
  82.             get { return CommonHelper.foodColor; }
  83.             set { CommonHelper.foodColor = value; }
  84.         }
  85.         #endregion

  86.         #region 玩家的分数
  87.         private static int score;

  88.         public static int Score
  89.         {
  90.             get { return CommonHelper.score; }
  91.             set { CommonHelper.score = value; }
  92.         }
  93.         #endregion

  94.         #region 玩家的等级
  95.         private static GameLevel level;

  96.         internal static GameLevel Level
  97.         {
  98.             get { return CommonHelper.level; }
  99.             set { CommonHelper.level = value; }
  100.         }
  101.       
  102.         
  103.         #endregion

  104.         #region 游戏速度
  105.         public static int GetSpeed()
  106.         {
  107.             int time=300;
  108.             switch (level)
  109.             {
  110.                 case GameLevel.初级:
  111.                     time = 300;
  112.                     break;
  113.                 case GameLevel.中级:
  114.                     time = 200;
  115.                     break;
  116.                 case GameLevel.高级:
  117.                     time = 100;
  118.                     break;
  119.               
  120.             }
  121.             return time;
  122.         }

  123.         #endregion

  124.         #region 存放多媒体播放对象
  125.         /// <summary>
  126.         /// 存放背景音乐多媒体播放对象
  127.         /// </summary>
  128.         private static SoundPlayer soundPlayer;
  129.         public static SoundPlayer SoundPlayer
  130.         {
  131.             get { return CommonHelper.soundPlayer; }
  132.             set { CommonHelper.soundPlayer = value; }
  133.         }
  134.         #endregion
  135.     }
  136. }
复制代码




评分

参与人数 13HB +33 THX +11 收起 理由
消逝的过去 + 1
飞刀梦想 + 1
zxjzzh + 2 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
agan8888 + 1
playboy + 1
哨兵51号 + 1 [快捷评语] - 评分=感恩!简单却充满爱!感谢您的作品!
xiaogui + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!
Mrsin + 8 + 1 评分=感恩!简单却充满爱!感谢您的作品!
kangda666 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
723853985 + 6 + 1 评分=感恩!简单却充满爱!感谢您的作品!
胡一飞 + 1 + 1 每小时限制次数!先评分再说!
壮哥 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
Shark恒 + 10 + 1 快搬板凳来学习

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
壮哥 发表于 2015-7-18 23:03 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
able0 发表于 2015-7-18 23:05 | 显示全部楼层

学习学习 楼主好厉害
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
kangda666 发表于 2015-7-19 00:08 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
学破处 该用户已被删除
学破处 发表于 2015-7-19 00:31 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
JuStkK 发表于 2015-7-19 02:13 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
xiaogui 发表于 2016-2-21 11:24 | 显示全部楼层

我要成品啊
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
阿軒同學 发表于 2017-7-24 03:19 | 显示全部楼层

下載來看看先~~~
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
a2655968658 发表于 2017-7-27 09:22 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
哨兵51号 发表于 2017-8-5 10:14 | 显示全部楼层

厉害了,可以学习学习。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表