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)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...
随机推荐
- Java IO 流 -- 随机读取和写入流 RandomAccessFile (文件分割和合并)
RandomAccessFile 相对其它流多了一个seek() 方法指定指针的偏移量. 1.指定起始位置读取剩余内容 public static void test01() throws IOExc ...
- .NET Core 使用MediatR CQRS模式
前言 CQRS(Command Query Responsibility Segregation)命令查询职责分离模式,它主要从我们业务系统中进行分离出我们(Command 增.删.改)和(Query ...
- PHP 构造方法 __construct()
PHP 构造方法 __construct() PHP 构造方法 __construct() 允许在实例化一个类之前先执行构造方法. 构造方法 构造方法是类中的一个特殊方法.当使用 new 操作符创建一 ...
- git在用https进行push时候免输账密的方法
先新建一个文件 $ touch ~/.git-credentials $ vim ~/.git-credentials 进去添加内容(github为github.com,码云为gitee.com) h ...
- sql语句------合并结果集
select id,max(val) FROM (select id,a 列名 val from 表名unionselect id,b 列名 val from 表名unionselect id,c 列 ...
- 总结:js世界中的特殊符号
常用符号:+ ++ - -- || / /' && 等 这些基本上每天都能用到,但是 js 世界中有些特殊符号是不常用的,我也是偶然在阅读大神代码的时候发现的,一番查找之后得出了以下结 ...
- 2019-2020-1 20199325《Linux内核原理与分析》第十一周作业
实验简介: Set-UID 是 Unix 系统中的一个重要的安全机制.当一个 Set-UID 程序运行的时候,它被假设为具有拥有者的权限.例如,如果程序的拥有者是root,那么任何人运行这个程序时都会 ...
- 尤雨溪的vue怎么学,应该从vue-cli开始,为什么?
带手机验证码登陆, 带全套购物车系统 带数据库 前后端分离开发 带定位用户功能 数据库代码为本地制作好了 带支付宝支付系统 带django开发服务器接口教程 地址: https://www.dua ...
- CSS开发技巧(四):解决flex多行布局的行间距异常、子元素高度拉伸问题
在使用flex布局时,若出现换行,有两种较为特殊的现象是值得我们研究的: 子元素高度被拉伸,其实际高度大于它的内容高度. 各行子元素之间的行间距过大,甚至我们根本没有给子元素设置margin. 现在我 ...
- Elasticsearch: 权威指南 » 深入搜索 » 多字段搜索 » 多数字段 good
跨字段实体搜索 » 多数字段编辑 全文搜索被称作是 召回率(Recall) 与 精确率(Precision) 的战场: 召回率 --返回所有的相关文档:精确率 --不返回无关文档.目的是在结果的 ...