C#贪吃蛇
来源:互联网 发布:股票入门知乎 编辑:程序博客网 时间:2024/05/18 15:05
新建一个窗体C#应用
Block.cs里面的代码:
using System;using System.Linq;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Collections;using System.Timers;namespace WindowsFormsApplication1{ class Block { private Color _color; //颜色 private int _size; //单位大小 private Point _point; //坐标 public Block(Color color, int size, Point p) { this._color = color; this._size = size; this._point = p; } public Point Point { get { return this._point; } } //绘制自身到画布 public virtual void Paint(Graphics g) { SolidBrush sb = new SolidBrush(_color); lock (g) { try { g.FillRectangle(sb, this.Point.X * this._size, this.Point.Y * this._size, this._size - 1, this._size - 1); } catch { } } } }}
Palette.cs:
using System;using System.Collections;using System.Drawing;using System.Timers;namespace WindowsFormsApplication1{ class Palette { private int _width = 20; //宽度 private int _height = 20; //高度 private Color _bgColor; //背景色 private Graphics _gpPalette; //画布 private ArrayList _blocks; //蛇块列表 private Direction _direction; //前进的方向 private Timer timerBlock; //更新器 private Block _food; //当前食物 private int _size = 20; //单位大小 private int _level = 1; //游戏等级 private bool _isGameOver = false; private int[] _speed = new int[] { 500, 450, 400, 350, 300, 250, 200, 150, 100, 50 };//游戏速度 //构造函数很简单就是设定类属性值,还有初始化蛇块列表ArrayList public Palette(int width, int height, int size, Color bgColor, Graphics g, int lvl) { this._width = width; this._height = height; this._size = size; this._bgColor = bgColor; this._level = lvl; this._gpPalette = g; this._blocks = new ArrayList(); this._blocks.Insert(0, (new Block(Color.Red, this._size, new Point(width / 2, height / 2)))); //这句话就是在画布的正中央产生一个只有一节的贪吃蛇 this._direction = Direction.Right; } public Direction Direction { get { return _direction; } set { _direction = value; } } //开始游戏 public void Start() { this._food = GetFood();//生成一个食物 //初始化计时器 timerBlock = new System.Timers.Timer(_speed[this._level]); timerBlock.Elapsed+=new ElapsedEventHandler(OnBlockTimedEvent); timerBlock.AutoReset = true; timerBlock.Start(); } //定时更新 private void OnBlockTimedEvent(object source, ElapsedEventArgs e) { this.Move();//前进一个单位 if (this.CheckDead()) //检测是否游戏结束 { this.timerBlock.Stop(); this.timerBlock.Dispose(); System.Windows.Forms.MessageBox.Show("Score:"+this._blocks.Count,"Game Over"); } } //检查游戏是否有戏结束 private bool CheckDead() { Block head = (Block)(this._blocks[0]);// 取蛇块列表的第一个,即蛇头 //检查是否超出画布范围 if (head.Point.X < 0 || head.Point.Y<0||head.Point.X >= this._width || head.Point.Y >= this._height) return true; for (int i = 1; i < this._blocks.Count; i++) //检查是否撞上自己 { Block b=(Block)this._blocks[i]; if (head.Point.X == b.Point.X && head.Point.Y == b.Point.Y) { this._isGameOver = true; return true; } } this._isGameOver = false; return false; } //前进一节 private void Move() { Point p; //下一个坐标位置 Block head = (Block)(this._blocks[0]); if (this._direction == Direction.Up) p = new Point(head.Point.X, head.Point.Y - 1); else if (this._direction == Direction.Down) p = new Point(head.Point.X, head.Point.Y + 1); else if (this._direction == Direction.Left) p = new Point(head.Point.X - 1, head.Point.Y); else p = new Point(head.Point.X+1,head.Point.Y); //生成新坐标,将来成为蛇头 Block b = new Block(Color.Blue,this._size,p); //如果下一个坐标不是当前食物坐标,那么从蛇块信息列表中删除最后一哥蛇块 if (this._food.Point!= p) this._blocks.RemoveAt(this._blocks.Count - 1); //如果下一个坐标和食物坐标重合,那么就成一个新食物 else this._food = this.GetFood(); //把下一个坐标插入到蛇块信息列表的第一个,使其成为蛇头 this._blocks.Insert(0,b); this.PaintPalette(this._gpPalette); //更新画板 } //生成下一个食物,也就是下一节蛇块 public Block GetFood() { Block food = null; Random r = new Random(); bool redo = false; while (true) { redo = false; int x = r.Next(this._width); int y = r.Next(this._height); for (int i = 0; i < this._blocks.Count; i++) //检查食物所在所标是否和贪吃蛇冲突 { Block b = (Block)(this._blocks[i]); if (b.Point.X == x && b.Point.Y == y) //有冲突时,再随机找一个坐标 { redo = true; } } if (redo == false) { food = new Block(Color.Black,this._size,new Point(x,y)); break; } } return food; } //更新画板PaintPalette函数需要一个参数,也就是绘图句柄,然后在这个画布上画图也就是我们看到的游戏效果 public void PaintPalette(Graphics gp) { gp.Clear(this._bgColor); this._food.Paint(gp); foreach (Block b in this._blocks) b.Paint(gp); } } //枚举四个方向 public enum Direction { Left, Right, Up, Down }}
Program.cs 里面自动生成的代码。
0 0
- c# 贪吃蛇
- C#贪吃蛇
- C#贪吃蛇
- C#贪吃蛇
- C#贪吃蛇教程
- C#贪吃蛇一
- C#贪吃蛇二
- C#贪吃蛇
- c#贪吃蛇源码
- C#贪吃蛇
- C#中的贪吃蛇
- 贪吃蛇C#实现
- C#贪吃蛇
- C#窗体贪吃蛇
- C#实现贪吃蛇
- c#写的贪吃蛇
- 贪吃蛇的C#代码
- C# 学习--贪吃蛇demo
- nagios详解
- JAVA变量在内存中的分配
- 黑马程序员-Java基础【1】(关键字,标识符,常量,变量,运算符)
- Java中多线程重复启动
- 安卓入门
- C#贪吃蛇
- 求最大子序列和的四种方法
- spring标签-util:properties
- iOS开发常见问题集
- 594 还是A+B【map】
- The Java EE 6 Tutorial Finalizing a Servlet
- iOS8与iOS9的不同
- STL之map、set数据结构基础
- PAT 1071. Speech Patterns (25)