c# 贪吃蛇小游戏
------------恢复内容开始------------
新手学习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# 贪吃蛇小游戏的更多相关文章
- C++ 简单的控制台贪吃蛇小游戏
由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...
- 贪吃蛇小游戏-----C语言实现
1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...
- JS高级---案例:贪吃蛇小游戏
案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...
- Java GUI学习,贪吃蛇小游戏
JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...
- 用GUI实现java版贪吃蛇小游戏
项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...
- Java 用java GUI写一个贪吃蛇小游戏
目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...
- html5面向对象做一个贪吃蛇小游戏
canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...
- 用python+pygame写贪吃蛇小游戏
因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...
- Java贪吃蛇小游戏
贪吃蛇 思路 首先构思游戏布局,计算合理的坐标系. 绘制静态数据(广告.初始小蛇.提示信息.棋盘) 添加键盘监听事件,改变游戏状态以及小蛇运动方向 添加定时器,让小蛇在一段时间内移动一定的距离 随机产 ...
- JavaScript-简单的贪吃蛇小游戏
实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...
随机推荐
- (四)PL/SQL运算符
运算符是一个符号,告诉编译器执行特定的数学或逻辑操作. PL/SQL语言有丰富的内置运算符,运算符提供的以下几种类型: 1.算术运算符 2.关系运算符 3.比较运算符 4.逻辑运算符 5.字符串运算符 ...
- docker commit理解构建镜像(7)
镜像是多层存储,每一层是在前一层的基础上进行的修改: 而容器同样也是多层存储是在以镜像为基础层,在基础层上加一层作为容器运行时的存储层. 当我们使用Docker Hub的镜像无法满足我们的需求时,我们 ...
- Ubuntu 安装 Qt, 安装辅助软件
sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev sudo apt-get install gcc g++ sudo apt-get inst ...
- JVM原理与深度调优(一)
什么是jvm jvm是java虚拟机 运行在用户态.通过应用程序实现java代码跨平台.与平台无关.实际上是"一次编译,到处执行" 1.从微观来说编译出来的是字节码!去到哪个平台都 ...
- JAVA企业级应用TOMCAT实战(二)
使用普通用户运行 使用普通用户来部署服务是比较安全的做法 [root@tomcat application]# useradd -u tomcat [root@tomcat application]# ...
- JAVA 之 JSTL
一.什么是JSTL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...
- k8s namespace限制调研
1.创建namespace gpu 2.增加限制 [root@tensorflow1 gpu-namespace]# cat compute-resources.yaml apiVersion: v1 ...
- 内蒙古特检院利用物联网/RFID技术提高电梯检测水平
随着电梯检验工作信息化进程的进一步深入,内蒙古特检院从检验工作中寻找新方法.新手段,为检验员新引入电梯检验手持终端设备,力求提高电梯检验水平,将"电梯安全惠民工程"落到实处. 电梯 ...
- ajax学习摘抄笔记
2019独角兽企业重金招聘Python工程师标准>>> AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). A ...
- 带权并查集--hdu3047 ZJnu stadium
题意:给出一个n,m,n表示的是有n 个人,m表示的是 有m 对关系: 接下来输入的就是这m对关系,a,b,x:表示的是a,b相距x个距离:然后判断输入的是否与这个数的上面的数信息一致, 输出不一致的 ...