------------恢复内容开始------------

新手学习c# 在博客园上看到后自己模仿打出来的第一个程序  开心,纪念一下

bean :食物类

block :蛇块类

snake :蛇类

Map :地图 图形类

食物类:

class bean
{
private Point _origin;//用于画食物顶端坐标 public Point Origin//封装字段
{
get { return _origin; }
set { _origin = value; }
}
//显示食物方法
public void showBean(Graphics g)
{
//定义红色画笔
SolidBrush brush = new SolidBrush(Color.Red);
//用实心矩形画食物
g.FillRectangle(brush, _origin.X, _origin.Y, , );
}
//食物消失方法
public void unShowBean(Graphics g)
{
//定义背景色画笔
SolidBrush brush = new SolidBrush(Color.Red);
//用实心矩形画食物
g.FillRectangle(brush, _origin.X, _origin.Y, , );
}
}

蛇块类:2020-02-16

  public class block
{
//是否是蛇头
private bool _isHead; public bool IShead
{
get { return _isHead; }
set { _isHead = value; }
}
//蛇块编号
private int _blockNumber; public int BlockNumber
{
get { return _blockNumber; }
set { _blockNumber = value; }
}
//蛇块在左上角的位置
private Point _origin; public Point Origin
{
get { return _origin; }
set { _origin = value; }
} //根据指定位置画蛇块
public void showBlock(Graphics g)
{
Bitmap bitMap;
if (IShead)
{
bitMap = new Bitmap(Image.FromFile("blue.gif"));
}
else
{
bitMap = new Bitmap(Image.FromFile("Yellow.gif"));
}
g.DrawImage(bitMap, Origin.X, Origin.Y, , );
}
//蛇块消除
public void UnShowBlock(Graphics g)
{
SolidBrush brush = new SolidBrush(Color.Silver);
g.FillRectangle(brush,Origin.X,Origin.Y,,);
}
}

蛇类:

  public class Snake
{
//用于存放蛇的集合
private List<block> blockList;
//0-1-2-3 上-右-下-左
private int direction = ;
//蛇运动方向属性
public int Direction
{
get { return direction; }
set { direction = value; }
}
//蛇右的编号 蛇头的长度 private int headNumber;
//蛇头左上角坐标
private Point headPoint;
//蛇头坐标只读属性
public Point HeadPoint
{
get { return headPoint; }
} private Point mapLeft;
//游戏开始时初始的蛇
public Snake(Point map, int count)//填充Blocklist
{
mapLeft = map;
block blockSnake;
//定义蛇的起始位置
Point p = new Point(map.X + , map.Y + );
blockList = new List<block>();
//循环画蛇 用于填充集合
for (int i = ; i < count; i++)
{
//X坐标加15
p.X += ;
//实例化蛇块
blockSnake = new block();
//定义蛇块左上角的位置
blockSnake.Origin = p;
//定义蛇块编号1,2,3,4
blockSnake.BlockNumber = i + ;
if (i == count - )
{
//蛇头
headPoint = blockSnake.Origin;
//给蛇头赋值
blockSnake.IShead = true;
}
blockList.Add(blockSnake); }
}
//蛇边长函数
public void snakeGrowth()
{
//找到蛇头坐标
Point head = blockList[blockList.Count - ].Origin;
int x = head.X;
int y = head.Y;
switch (direction)
{
case : y = y - ; break;
case : x = x + ; break;
case : y = y + ; break;
case : x = x - ; break;
}
//先把原先蛇块变为普通蛇块
blockList[blockList.Count - ].IShead = false;
//实例化新蛇头
block headNew = new block();
headNew.IShead = true;
headNew.BlockNumber = blockList.Count + ;
headNew.Origin = new Point(x, y);
blockList.Add(headNew);
headNumber++;
headPoint = headNew.Origin;
}
//蛇先前运动 没有吃到食物
public void Go(Graphics g)
{
block snakeTail = blockList[];
//消除蛇块
snakeTail.UnShowBlock(g);
//集合中移除尾巴
blockList.RemoveAt();
//序号全部减1
foreach (var item in blockList)
{
item.BlockNumber--;
}
headNumber--;
snakeGrowth();
}
//蛇的方向转换
public void turnDriction(int pDriction)
{
switch (direction)
{
//原来向上运动
case :
{
//希望想做运动
if (pDriction == )
direction = ;
else if (pDriction == )
direction = ;
}
break;
case :
{
if (pDriction == )
direction = ;
else if (pDriction == )
direction = ;
break;
}
case :
{
if (pDriction == )
direction = ;
else if (pDriction == )
direction = ;
break;
}
case :
{
if (pDriction == )
direction = ;
else if (pDriction == )
direction = ;
break;
}
}
}
//蛇显示函数
public void ShowSnake(Graphics g)
{
foreach (var item in blockList)
{
item.showBlock(g);
}
}
//隐藏蛇
public void unShowSnake(Graphics g)
{
foreach (var item in blockList)
{
item.UnShowBlock(g);
}
}
//自己是否会碰到自己
public bool IsTouchMyself()
{
bool isTouch = false;
for (int i = ; i < blockList.Count - ; i++)
{
if (headPoint == blockList[i].Origin)
{
isTouch = true;
break;
}
}
return isTouch;
}
//重置蛇
public void Reset(Point Map, int count)
{
block blockSnake;
//定义蛇的起始位置
Point p = new Point(mapLeft.X + , mapLeft.Y + );
blockList = new List<block>();
//循环画蛇块用于填充集合
for (int i = ; i < count; i++)
{
//x坐标加15
p.X += ;
//实例化蛇块
blockSnake = new block();
//定义蛇块左上角位置
blockSnake.Origin = p;
//定义蛇块编号
blockSnake.BlockNumber = i + ;
if (i == count - )
{
//蛇头
//给蛇头位置赋值
headPoint = blockSnake.Origin;
blockSnake.IShead = true;
}
blockList.Add(blockSnake);
}
}
}

地图类:

 public class Map
{
private Point mapLeft;
private static int unit = ;
//定义地图长度为28个蛇块
private readonly int length = * unit;
//定义地图宽度为20个蛇块
private readonly int width = * unit;
//定义分数
public int score = ;
//定义蛇
private readonly Snake snake;
public bool victory = false;
public Snake Snake
{
get { return snake; }
}
bean food;
public Map(Point start)
{
//把地图左上角的点赋值给全局变量
mapLeft = start;
//实例化蛇
snake = new Snake(start, );
//实例化食物
food = new bean();
food.Origin = new Point(start.X + , start.Y + );
}
//产生一个新食物
private bean foodRandom()
{
Random d = new Random();
int x = d.Next(, length / unit);
int y = d.Next(, width / unit);
Point Origin = new Point(mapLeft.X+x*,mapLeft.Y+y*);
bean food = new bean();
food.Origin = Origin;
return food;
}
//显示新食物方法
public void showNewFood(Graphics g)
{
//消除原先食物
food.unShowBean(g);
//产生随机位置的食物
food = foodRandom();
//显示新食物
food.showBean(g);
}
//画地图
public void showMap(Graphics g)
{
//创建一支红笔
Pen pen = new Pen(Color.Blue);
//画地图框
g.DrawRectangle(pen, mapLeft.X, mapLeft.Y, length, width);
//显示食物
food.showBean(g);
if (cheakBean())
{
//吃到了食物
//显示新食物
showNewFood(g);
//蛇变长
snake.snakeGrowth();
//加分
score += ;
//显示蛇
snake.ShowSnake(g);
}
else
{
snake.Go(g);
snake.ShowSnake(g);
}
}
//判断是否吃到食物
public bool cheakBean()
{
return food.Origin.Equals(snake.HeadPoint);
}
//检查蛇是否撞墙
public bool checkSnake()
{
return !(Snake.HeadPoint.X > mapLeft.X - && Snake.HeadPoint.X < (mapLeft.X + length - ) && Snake.HeadPoint.Y > mapLeft.Y - && Snake.HeadPoint.Y < (mapLeft.Y + width - ));
}
//重新开始
public void Resect(Graphics g)
{
Snake.unShowSnake(g);
Snake.Reset(mapLeft,);
}
}

窗体代码:

 public partial class Form1 : Form
{ public Form1()
{
InitializeComponent();
//定义地图
map = new Map(new Point(, ));
this.BackColor = Color.Silver; }
private readonly Map map;
private int gradeNum = ;
private int pink; private void timer1_Tick(object sender, EventArgs e)
{
this.开始游戏ToolStripMenuItem.Text = "重新开始";
this.label1.Text = map.score.ToString();
if (map.score > )
{
this.timer1.Enabled = false;
MessageBox.Show("通关");
}
Bitmap bmp =new Bitmap(this .Width,this.Height);
BackgroundImage = bmp;
Graphics g = Graphics.FromImage(bmp);
map.showMap(g);
if (map.checkSnake() || map.Snake.IsTouchMyself())
{
this.timer1.Enabled = false;
MessageBox.Show("失败");
} } private void Form1_Load(object sender, EventArgs e)
{
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
UpdateStyles();
} private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int k, d = ;
k = e.KeyValue;
if (k == )
{
d = ;
}
if (k == )
{
d = ;
}
if (k == )
{
d = ;
}
if (k == )
{
d = ;
}
map.Snake.turnDriction(d);
} private void 开始游戏ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (this.label2.Text == "")
{
MessageBox.Show("请选择级别");
return;
}
if(this .开始游戏ToolStripMenuItem.Text =="开始")
{
this.开始游戏ToolStripMenuItem.Text = "重新开始";
timer1.Enabled = true;
}
else if(this .开始游戏ToolStripMenuItem.Text=="重新开始")
{
this.开始游戏ToolStripMenuItem.Text = "开始";
this.继续ToolStripMenuItem.Text = "暂停";
this.timer1.Enabled = true;
map.Resect(CreateGraphics());
map.score = ;
}
} private void 继续ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (this.继续ToolStripMenuItem.Text == "暂停")
{
this.继续ToolStripMenuItem.Text = "继续";
this.timer1.Enabled = true;
}
else if (this.继续ToolStripMenuItem.Text == "继续")
{
this.继续ToolStripMenuItem.Text = "暂停";
this.timer1.Enabled = false;
}
}
private void 低级ToolStripMenuItem_Click(object sender, EventArgs e)
{
gradeNum = ;
this.label2.Text = "菜鸟";
this.timer1.Interval = gradeNum;
} private void 中级ToolStripMenuItem_Click(object sender, EventArgs e)
{
gradeNum = ;
this.label2.Text = "平民";
this.timer1.Interval = gradeNum;
} private void 高级ToolStripMenuItem_Click(object sender, EventArgs e)
{
gradeNum = ;
this.label2.Text = "高手";
this.timer1.Interval = gradeNum;
} private void 大神ToolStripMenuItem_Click(object sender, EventArgs e)
{
gradeNum = ;
this.label2.Text = "大神";
this.timer1.Interval = gradeNum;
}
}

不是自己想的 但是我弄懂了

------------恢复内容结束------------

c# 贪吃蛇小游戏的更多相关文章

  1. C++ 简单的控制台贪吃蛇小游戏

    由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...

  2. 贪吃蛇小游戏-----C语言实现

    1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...

  3. JS高级---案例:贪吃蛇小游戏

    案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...

  4. Java GUI学习,贪吃蛇小游戏

    JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...

  5. 用GUI实现java版贪吃蛇小游戏

    项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...

  6. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

  7. html5面向对象做一个贪吃蛇小游戏

    canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...

  8. 用python+pygame写贪吃蛇小游戏

    因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...

  9. Java贪吃蛇小游戏

    贪吃蛇 思路 首先构思游戏布局,计算合理的坐标系. 绘制静态数据(广告.初始小蛇.提示信息.棋盘) 添加键盘监听事件,改变游戏状态以及小蛇运动方向 添加定时器,让小蛇在一段时间内移动一定的距离 随机产 ...

  10. JavaScript-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

随机推荐

  1. ES6让字符串String增加了哪些好玩的特性呢?

    确实因为现在天气变热了,所以一天天的这么写我也很累.所以如果阅读的时候有什么错误还请大家指出来,不好意思.学习永无止境. OK,今天继续讲解ES6系列知识 学过上一节的解构赋值就知道,ES6确实给我们 ...

  2. 小程序里button边框有黑线解决办法(自定义button样式)

    .go_to_user::after{ border:1px solid transparent; } button的class为go_to_user button{ padding:; box-si ...

  3. CentOS 7.4 安装网易云音乐

    1.下包–>网易云音乐 Ubuntu14.04(推荐14.04依赖包网上能找到) 提示:16.04有部分依赖包还找不到,有兴趣可以自行打包RPM安装. 2.解包 (1)使用 ar -vx解压ub ...

  4. GDI+ 绘制砂岩含量图版

    图版是在工作中经常会使用到的工具,它能够大大提高我们日常工作效率.地质图版在地质工作中具有举足轻重的作用,不仅可以轻松判断岩性,也可以依据经验图版直接得到结果,十分方便. 本程序目的绘制出一个地质常用 ...

  5. Qt提示:setLayout: Attempting to set QLayout "" on MainWindow "MainWindow", which already has a layout

    如题,出现这个的原因是,如果你的窗口继承的是QMainwindow,需要设置setCentralWidget(); 如下: QWidget * widget = new QWidget ( mainW ...

  6. 【Linux常见命令】dos2unix命令,unix2dos命令

    我们都知道.打回车键就是换行的意思. 在不同系统下打回车键效果是不同的: MAC OS下:dakdhih \r LINUX下:dakdhih \n DOS\WINDOWS下:dakdhih \r\n ...

  7. Java 数组 之 二维数组

    转载于 : http://www.verejava.com/?id=16992693216433 public class BinaryArray { public static void main( ...

  8. 爱创课堂每日一题第十五题HTTP和HTTPS?

    HTTP协议通常承载于TCP协议之上,在HTTP和TCP之间添加一个安全协议层(SSL或TSL),这个时候,就成了我们常说的HTTPS.默认HTTP的端口号为80,HTTPS的端口号为443. 转载于 ...

  9. zwx_helper

    通过重载c++operator,实现一种轻松的wxWidgets界面编程风格,如html编写页面一样直观容易. 举一例,一个界面页有四块区,如果是开发html的话,是从头到脚一气书写 <div ...

  10. OSG程序设计之更新回调

    更新回调(Update Callback)涉及到一个类:osg::NodeCallback.这个类重载了函数调用操作符.当回调动作发生时,将会执行这一操作符的内容. 如果节点绑定了更新回调函数,那么在 ...