CSharp课程设计.doc_第1页
CSharp课程设计.doc_第2页
CSharp课程设计.doc_第3页
CSharp课程设计.doc_第4页
CSharp课程设计.doc_第5页
免费预览已结束,剩余12页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#课程设计贪吃蛇姓名:学号:2009011班级: 计科09.1目录1. 实验目的22. 实验任务与要求22.1实验内容22.2实验要求22.3实验环境23. 设计方案23.1程序功能23.2设计思想23.3设计总体流程图23.4设计的具体实现34. 程序测试74.1测试内容与结果74.2程序运行效果图75. 实验总结8参考文献9附录9 附录A:主要源程序9 附录B:软件使用说明书161. 实验目的通过C#课程设计,使学生能将学到的面向对象的程序设计思想应用到具体的工作和学习中,加深对类与对象的理解,要求学生能够对现实生活中许多具体的事物抽象出类,并掌握继承与派生,基类、虚方法和抽象方法和多态性的概念。通过这次课程设计掌握C#语言程序设计的编程思想,为后续课程打下基础。2. 实验任务与要求 2.1实验内容 编写一个C#版小游戏程序2.2实验要求 编写C#语言程序实现贪吃蛇游戏。一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,时蛇的身体长一节,同时计1分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。2.3实验环境 Windows XP, Microsoft Visual Studio 20083. 设计方案3.1程序功能贪吃蛇游戏是一个经典小游戏,一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,时蛇的身体长一节,同时计1分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。3.2设计思想程序关键在于表示蛇的图形及蛇的移动。用一个小矩形块表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用一节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇。3.3设计总体流程图载入游戏并初始化蛇开始移动根据键盘控制蛇移动方向判断蛇头和食物的坐标是否重合随机生成下一个食物是否判断蛇头和自身及墙是否重合游戏结束是否开始游戏退出游戏继续游戏暂停游戏3.4设计的具体实现 (1)画板的设计1.新建一个Windows 应用程序,起名Snake。2.重命名Form1,改为FormMain。3.从工具栏里拖放一个picturebox到FormMain上面,设置属性。(2) Palette类的实现画板 Palette类是整个游戏的核心处理类,里面定义了画布的大小,背景色,蛇块列表以及游戏速度,移动方向等属性,另外还提供了timer计时器,用于定时更新蛇块坐标位置,以及如何在画面上画图的函数。(3) Start函数Start函数用于开始游戏,这个函数的内部其实就是设定食物,以及触发计时器,代码片段如下(4) OnBlockTimedEvent函数OnBlockTimedEvent函数是计时器的执行函数,这个函数用于更新蛇块信息列表,以及检测游戏是否结束等等,代码片段如下(5) CheckDead函数checkDead函数用于检测游戏是否结束,具体检查规则如下(6) Move函数Move函数用于更新整个蛇块的坐标,我们前面通过将蛇块信息放到ArrayList里来表示贪吃蛇的整个信息,其中根据下标从0到Count-1依次表示各个蛇块的信息。(7) GetFood函数GetFood函数用于生成下一个食物,其实就是一个蛇块,生成的规则就是,坐标要在画布范围内,并且食物的坐标不能和贪吃蛇的坐标重合,具体代码如下通过for循环检查食物坐标是否和贪吃蛇的蛇块列表ArrayList里的蛇块有冲突(8) PaintPalette函数PaintPalette函数需要一个参数,也就是绘图句柄,然后在这个画布上画图也就是我们看到的游戏效果首先用背景色清空画布,然后画食物,其次是通过for循环将贪吃蛇的每个蛇块画在画布上,以此达到游戏效果。(9) FormMain_KeyDown函数这个函数用于更改贪吃蛇的移动方向,这里设定了wdsa和上下左右都可以使用,更改移动方向的前提就是新的方向不能和当前方向相反,也即是只能90度拐弯,不能180度拐弯。(10) pictureBox1_Paint函数这个事件在pictureBox1需要重新绘制的时候发生,这里面只要简单调用一下让贪吃蛇重新绘制一下游戏就行了4、程序测试4.1测试内容与结果 A 选项新游戏 游戏正常启动 B 选项新游戏暂停 游戏暂停,并显示当前得分C 选项新游戏暂停继续 游戏继续运行D 选项新游戏(暂停继续)退出游戏 显示当前得分,确认键后退出游戏E 选项新游戏,蛇头撞出画布界面 游戏结束,并显示当前得分0F 选项新游戏,蛇头吃到食物 游戏继续,得分+1G 选项新游戏,蛇头吃到8个食物后,蛇头撞到蛇尾 游戏结束,并显示当前得分84.2程序运行效果图5、实验总结参考文献Visual Studio C#.NET 2005教程C#入门经典、C#高级编程、C#程序开发范例宝典附录附录A:主要源程序Form1.csusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace Snake public partial class Form1 : Form private Palette p; public Form1() InitializeComponent(); private void pictureBox1_Paint(object sender, PaintEventArgs e) if(p!=null) p.PaintPalette(e.Graphics); private void Form1_KeyDown(object sender, KeyEventArgs e) if (e.KeyCode = Keys.W | e.KeyCode = Keys.Up) & p.Direction != Direction.Down) p.Direction = Direction.Up; return; if (e.KeyCode = Keys.D | e.KeyCode = Keys.Right) & p.Direction != Direction.Left) p.Direction = Direction.Right; return; if (e.KeyCode = Keys.S | e.KeyCode = Keys.Down) & p.Direction != Direction.Up) p.Direction = Direction.Down; return; if (e.KeyCode = Keys.A | e.KeyCode = Keys.Left) & p.Direction != Direction.Right) p.Direction = Direction.Left; return; private void Form1_Load(object sender, EventArgs e) private void newToolStripMenuItem_Click(object sender, EventArgs e) int width, height, size; width = 30; height = 29; size = 15; this.pictureBox1.Width = width * size; this.pictureBox1.Height = height * size; this.Width = pictureBox1.Width + 50; this.Height = pictureBox1.Height + 120; p = new Palette(width, height, size, this.pictureBox1.BackColor, Graphics.FromHwnd(this.pictureBox1.Handle), 4); p.Start(); private void stopToolStripMenuItem_Click(object sender, EventArgs e) p.Stop(); int a = p._blocks.Count - 1; System.Windows.Forms.MessageBox.Show(得分: + a, 游戏暂停!); private void startToolStripMenuItem_Click(object sender, EventArgs e) p.StartStop(); private void closeToolStripMenuItem_Click(object sender, EventArgs e) p.Stop(); int a = p._blocks.Count - 1; System.Windows.Forms.MessageBox.Show(得分: + a+nn退出游戏! , 提示); this.Close(); Palette.csusing System;using System.Collections;using System.Drawing;using System.Timers;/timer计时器namespace Snake class Palette private int _width =20;/宽度 private int _height = 20;/高度 private Color _bgColor;/背景色 private Graphics _gpPalatte;/画布 public ArrayList _blocks;/蛇块列表 private Direction _direction;/前进方向 public Timer timerBlock;/更新器 private Block _food;/当前食物 private int _size=20;/单位大小 public int _level=1;/游戏等级 private bool _isGameOver; public int _speed=new int 450,400,350,300,200,100,50,;/游戏速度 public Palette(int width, int height, int size, Color gbColor, Graphics g, int lvl) this._width = width; this._height = height; this._bgColor = gbColor; this._gpPalatte=g; this._size = size; this._level=lvl; this._blocks = new ArrayList(); /在画布的正中央产生一个只有一节的贪吃蛇 this._blocks.Insert(0, (new Block(Color.Green, this._size, new Point(width / 2, height / 2); this._direction = Direction.Right; public Direction Direction get return this._direction; set this._direction = value; public void Start()/Start函数用于开始游戏,这个函数的内部其实就是设定食物,以及触发计时器 this._food = GetFood();/生成一个食物 /初始化计时器 timerBlock = new System.Timers.Timer(_speedthis._level);/这里面定义了计时器的事件触发间隔,是通过level然后找到speed数组里的对应毫秒值设定的 timerBlock.Elapsed += new System.Timers.ElapsedEventHandler(OnBlockTimedEvent);/触发事件是OnBlockTimedEvent timerBlock.AutoReset = true; timerBlock.Start(); public void Stop() timerBlock.Stop(); public void StartStop() timerBlock.Start(); /定义更新 private void OnBlockTimedEvent(object source, ElapsedEventArgs e)/OnBlockTimedEvent函数是计时器的执行函数,这个函数用于更新蛇块信息列表,以及检测游戏是否结束 this.Move();/前进一个单位 if(this.CheckDead()/检测游戏是否结束 /this.timerBlock.Stop(); this.timerBlock.Dispose();/释放内存资源 int a = this._blocks.Count - 1; System.Windows.Forms.MessageBox.Show(得分: + a, 游戏结束!); /checkDead函数用于检测游戏是否结束 private bool CheckDead() Block head = (Block)(this._blocks0);/取蛇块列表的第一个,即蛇头 /检测是否超出画布范围 if (head.Point.X 0 | head.Point.Y = this._width | head.Point.Y = this._height) return true;/检测是否结束分两种情况,一种是撞上边界,即蛇头坐标超出画布范围 for (int i = 1; i this._blocks.Count; i+)/检测是否撞上自己 Block b = (Block)this._blocksi; /一种是蛇头撞上了蛇身,也就是蛇头的坐标和蛇身的某个坐标重合,通过for循环来检查第二种情况 if(head.Point.X=b.Point.X&head.Point.Y=b.Point.Y) this._isGameOver = true; return true; this._isGameOver = false; return false; /生成下一个食物 private 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._blocksi); if (b.Point.X = x & b.Point.Y = y)/有冲突的话,再随机找下一个坐标 redo = true; if (redo = false) food = new Block(Color.White, this._size, new Point(x, y); break; return food; /在ArrayList的0下标处插入一个新的蛇块(蛇头), /然后把原来最后一个(Count-1)的那个蛇块(蛇尾)去掉 public void Move() Point p;/下一个坐标位 Block head = (Block)(this._blocks0); 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.Green, 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._gpPalatte);/更新画板 /更新画版 public void PaintPalette(Graphics gp) gp.Clear(this._bgColor);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论