C#编写贪吃蛇游戏 RedSnake

RedSnake 设计说明书

背景

开发环境:Microsoft Visual Studio .Net 2003

开发语言:C#

开发者:Red_angelX

主界面设计

程序界面如图一所示

                                    主界面

左边是游戏区域,由一个pictureboxlable组成,picturebox用来绘制游戏界面,label用来显示游戏是否运行。

右边是状态区域,由若干label组成,用来表示游戏中的状态参数。

 


1 总体设计

  游戏主体分为3个主要模块:蛇身基本单元,蛇身结构位置,蛇身的移动控制。这3个单元各用一个class来描述

1.1 蛇身基本单元模块 SnakeSegment.cs

  基本单元用一个矩形(Rectangle)来描述,详细构造如下

        private  Rectangle m_rect;

        
/************构造函数,传入顶点坐标和块宽度****************/

        
public  SnakeSegment(Point location, int  width)

         
{

              m_rect 
= new Rectangle(location,new Size(width,width));

         }


         
// 属性

         
public  Rectangle Rectangle

         
{

              
get

              
{

                   
return m_rect;

              }


         }


         
public  Point Location

         
{

              
get

              
{

                   
return this.m_rect.Location;

              }


              
set

              
{

                   
this.m_rect.Location = value;

              }


         }


         
public  Size Size

         
{

              
get

              
{

                   
return this.m_rect.Size;

              }


         }

 

1.2 蛇身结构位置模块 Snake.cs

     蛇身由若干基本单元组成,这些单元存放在一个Queue结构中,Queue处于命名空间System.Collections之下,表示对象的先进先出集合。Snake类里面主要包含Add(添加新对象)Clear(清除对象)Slither(蛇身移动), PointOnSnake(判断某点是否在蛇身内部)几个方法。

           // 向蛇身添加一个新节点         

public   void  Add(Point newLocation)

         
{

              SnakeSegment newhead 
= new SnakeSegment(newLocation,m_width);

              
//Check if the Queue Exists

              
if(m_segs == null)

              
{

                   m_segs 
= new Queue(MAXSNAKELENGTH);

              }


              
else if(m_segs.Count == MAXSNAKELENGTH)

              
{

                   Slither(newLocation);

                   
return;

              }


              
//添加到m_segs尾部

              m_segs.Enqueue(newhead);

         }

          // 用添加一个新蛇头删除蛇尾的方法来移动蛇身

   
public   void  Slither(Point newLocation)

         
{

              SnakeSegment newhead 
= new SnakeSegment(newLocation, this.m_width);

              
//添加蛇头

              
this.m_segs.Enqueue(newhead);

              
//移除蛇尾

              
this.m_segs.Dequeue();

         }

 

 

 

 

 

 

 

 

 

 

    

           // 判断某点是否在蛇身内部

  
public   bool  PointOnSnake(Point pt)

              IEnumerator myenum 
= this.m_segs.GetEnumerator();

              
while (myenum.MoveNext())

              
{

              
if (((SnakeSegment) myenum.Current).Rectangle.Contains(pt))

                   
{

                       
return true;

                   }


              }


              
return false;

         }

 

 

 

1.3 控制蛇身移动模块 Control.cs

移动控制模块定义了蛇头的坐标,移动的方向等信息,并且判断下一步移动的点的坐标。

首先定义了三个全局变量

 

 

      private  Point m_location;    // 蛇头的坐标

     
private   int  m_increment;     // 每次移动增加的象素

private  SnakeDirection m_direction;    // 移动的方向
 

 

 

其中的SnakeDirection的定义为

 

          internal   enum  SnakeDirection

         
{

              None 
= -1,   //保持默认

              Down 
= 1,

              Left 
= 0,

              Right 
= 2,

              Up 
= 3   

         }

 

 

 

 

 

 

 

 

 

 

移动坐标判断函数Move的代码如下

该函数还有一个不带参数的重载, internal void Move(), 内部调用Move(SnakeDirection.None)来实现。

1.4 程序主窗体设计 Form1.cs

   主窗体实现游戏的核心是设置一个timer来实现游戏的更新和界面的重绘,其中通过窗体接受键盘的按键来设置蛇身的移动方向,通过PictureBoxPaint事件来更新游戏的画面,通过timer事件来移动蛇身和判断是否吃到食物是否游戏结束等逻辑处理。也可以通过改变timer的时间来改变蛇身移动的  

2 游戏界面

  下图是游戏进行中截图

3 总结

   这个作品只是个小游戏,用来熟悉GDI绘图和一些相关构造,主要用于休闲娱乐。

 

源代码下载:http://free5.ys168.com/?xuyuexyz    DotNet/RedSnake.rar

你可能感兴趣的:(游戏,timer,娱乐,Microsoft,C#,Class)