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)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...
随机推荐
- LeetCode 面试题51. 数组中的逆序对
面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...
- 作业3-k均值算法
4. 作业: 1). 扑克牌手动演练k均值聚类过程:>30张牌,3类 2). *自主编写K-means算法 ,以鸢尾花花瓣长度数据做聚类,并用散点图显示.(加分题) 3). 用sklearn.c ...
- Kubernetes 命令行工具之kubctl
目录 1.何为kubectl 2.Kubectl基本使用 2.1.命令补全 2.2.快速查找资源 2.3.使用自定义输出格式 3.陈述式管理资源 3.1.管理namespace资源 3.2.管理Dep ...
- java中wait和sleep的区别
文章目录 Wait和sleep的区别 唤醒wait和sleep java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用 ...
- Spring Boot JPA 中transaction的使用
文章目录 @Transactional的实现 @Transactional的使用 Transaction的传播级别 REQUIRED SUPPORTS MANDATORY NEVER NOT_SUPP ...
- node.js koa 实现长轮询
长轮询的实现原理:浏览器发出请求之后,服务端资源如果没有就绪,那么并不立即返回,而是在一个时间范围内,不断地去查询资源是否就绪,如果就绪,就返回资源,如果超时了还没有就绪,就返回超时. 代码实现如下: ...
- jQuery学习(二)
操作DOM对象: 修改文本: jQuery对象的text()和html()方法可以用来获取节点的文本内容和HTML文本.而当你给方法传入参数时,这两个方法可以被用于设置jQuery的文本内容. 还是以 ...
- 图论--Dijkstra算法总结
Key word: ①BFS转换Dijkstra ②其他关系转化为最短路 ③反向建边及反向Dijkstra ④稠密图.稀疏图 ⑤链式前向星 ⑥Vector建图 ⑦超级源点&汇点 详解: 1.B ...
- Ubuntu开机黑屏解决办法
联想笔记本通过虚拟机安装Ubuntu12.04后,开机黑屏.这个问题和NVIDIA显卡有关.网上有人提到更改/etc/default/grub文件,可是我通过root身份也无法很好地修改该文件,遂放弃 ...
- Edge Weight Assignment(树-异或-贪心)
大意: 给定一棵无根树,要求你任意设置n-1条边的边权. 使得任意叶子节点间边权的XOR值为0: 此时,令f为所有边权数值不同的个数,求最小的f和最大的f. \(\color{Red}{------- ...