C#游戏设计大赛

本文介绍了作者在C#游戏设计大赛中的获奖作品,包括贪吃蛇和打字游戏。游戏包含丰富的功能,如音乐播放、界面皮肤更换等。在贪吃蛇游戏中,详细讲解了如何实现蛇的移动、吃食物和判断游戏结束。打字游戏中,设置了不同的难度级别和字母下落速度,并实现了背景音乐播放。整个游戏提供了一次有趣且富有挑战性的编程体验。

       C#游戏设计大赛

此游戏是在班上一次c#游戏设计大赛做的,在此我也曾获得过奖
其中包扩两个游戏,
一个是贪吃蛇,另一个是打字游戏
其中包含有许多的功能,也运用许多知识点,
1.如何读取音乐文件:例如:贪吃蛇吃食物的声音,字体被打中的声音,游戏结束的生音...
2.如何更改界面皮肤:
3.如何在托盘中写入应用程序图标:鼠标右击右下角的图标可以选择自己喜欢的皮肤
4.对贪吃蛇可以设置蛇的颜色,也可以设置食物的颜色,还可以设置界面的背景颜色...
5.对打字游戏可以设置字体的大小,类型,游戏的背影颜色...
6.可以设置自己过关的关数,和设置过关的难度级别
7.在游戏的有上方可以看到玩过此游戏的最高分和玩家,如过您破了最高记录将会记录你的姓名和分数
8.在玩游戏中也可以设置一些自己喜欢的背景音乐,此功能相当于一个千千静听,可以循环遍历某个文件中的音乐文件
9.如何调用本机程序:我用这个知识点做了一个超链接,可以连接到我的优快云博客
......
希望此程序能给大家带来帮助!!!

1.贪吃蛇游戏

1.3Label组成一条蛇,设置Label的相关属性,是第一个Label设为相应的颜色.

//画出一条蛇

        public bool DrawSanke()

        {

            arry_snake = new ArrayList();

            lbl1 = new Label();

            lbl2 = new Label();

            lbl3 = new Label();

            arry_snake.Add(lbl1);

            arry_snake.Add(lbl2);

            arry_snake.Add(lbl3);

            for (int i = 0; i < arry_snake.Count; i++)

            {

                Label lbl = (Label)arry_snake[i];

                lbl.BorderStyle = BorderStyle.Fixed3D;

                lbl.Width = 15;

                lbl.Height = 15;

                lbl.Left = 30 - lbl.Width * i;

                lbl.Top = 30;

                if (i == 0) //判断是否是蛇头              

                    lbl.BackColor = foodColor; //将蛇头设为红色               

                else

                    lbl.BackColor = sankeBody;

                this.pan_sanke.Controls.Add(lbl); //将蛇添加到Panel

            }

            return _isHaveSnake = true;

        }

2.用用一个Label当作一个食物,并设置它的相关属性并显示在面板中的位置

        //画食物

        public void DrawFood()

        {         

            lblFood = new Label();

            lblFood.Width = 15;

            lblFood.Height = 15;

            lbl1.BorderStyle = BorderStyle.Fixed3D;

            lblFood.BackColor = foodColor; //设置食物的颜色

            Random rdm = new Random();

            //面板中有多少个Label的宽度

            x = Convert.ToInt32(Math.Floor((double)(this.pan_sanke.Width / 15)));

            //面板中有多少个Label的高度

            y = Convert.ToInt32(Math.Floor((double)(this.pan_sanke.Height / 15)));

            Ox = rdm.Next(0, x) * 15; 

            Oy = rdm.Next(0, y) * 15;  

            lblFood.Left = Ox;    //食物离面板左边的距离上多少

            lblFood.Top = Oy;     //食物离面板上面的距离有多少

            this.pan_sanke.Controls.Add(lblFood);  //将食物添加到面板

        }

3.蛇移动的方法(最后一个Label移到第一个)

     //蛇移动的方法

        public void Move_snake(int start_snake,int end_snake)

        {

                if (snake_start == 0)   //判断第一个元素的下标是否为0

                {

                    snke_end = arry_snake.Count - 1;

                    snake_start = snke_end;      //最后一个元素移到第一个                  

                }

                else

                {

                    snke_end = snake_start - 1;

                    snake_start = snke_end;     //最后一个元素移到第一个

                }

                //给最后一个Label重新给出位置坐标

                Label lblHand = ((Label)arry_snake[snke_end]);

                lblHand.Left = start_snake;

                lblHand.Top = end_snake;

                for (int i = 0; i < arry_snake.Count; i++)  //遍历集合,使蛇成为最新模样

                {

                    Label lbl = (Label)arry_snake[i];

                    lbl.BorderStyle = BorderStyle.Fixed3D;

                    lbl.BackColor = sankeBody;  //设置蛇身的颜色

                    if (i == snke_end) //判断是否最后一个                   

                        lbl.BackColor = SankeHead;//将蛇头设为红色                  

                }

        }

4.蛇吃食物的方法,吃到后放出相应的声音,并使蛇身添加一节,再产生一个食物,根据蛇头的位置坐标与食物的坐标来判断是否吃到食物

// 蛇吃食物的方法

public void IsGetFood()

{

     //判断蛇头的坐标是否与食物相同

     if (((Label)arry_snake[snake_start]).Left == Ox && ((Label)arry_snake[snake_start]).Top == Oy)

     {

          arry_snake.Add(lblFood);  //把所吃到的食物添加到集合中                  

          fs = new FileStream("eatFood.wav", FileMode.Open); //吃食物的声音 

          sp.Play();

          fs.Close();

          DrawFood();    //再画一个食物

     }

}

5.判断蛇是否Over,

     a.根据蛇身与食物的颜色的区别来判断

     b.根据蛇头是否碰到墙

如果蛇 Over游戏结束

  public void GameOver()

  {

      timer1.Stop();

      _isAlive = false;        //OVER

      _isHaveSnake = false;

      DisDnake();

      System.Media.SystemSounds.Hand.Play();//播放默认的Hand声音以作提示Game Over

      bool flag = IsRecord_breaking(); //判断是否破纪录

      if (flag)

          frmInfo.Show();

      display = true;

      pan_sanke_Paint(null, null);

  }

// 判断蛇是否OVER

public void IsOver()

{

     Label lbl_over = (Label)arry_snake[snake_start];

     foreach (Label lbl in pan_sanke.Controls)

     {

         if (lbl.BackColor != SankeHead && lbl.BackColor != foodColor)

         {

              if (lbl.Left == lbl_over.Left && lbl.Top == lbl_over.Top) //如果自己碰到自己

                  GameOver();

         }

     }

      //如果碰到墙

      if (lbl_over.Left < 0 || lbl_over.Left + 15 > this.pan_sanke.Width || lbl_over.Top < 0 ||            lbl_over.Top + 15 > this.pan_sanke.Height)

             GameOver();

}

 

6.处理命令键,用来控制蛇的上下左右

    //处理命令键

    protected override bool ProcessDialogKey(Keys keyData) //处理命令键

    {

        switch (keyData)

        {                   

            case Keys.Up:

                if (Curway != Way.Down)  //如果蛇的当前方向不为下

                {

                    Move_snake(((Label)arry_snake[snake_start]).Left, ((Label)arry_snake[snake_start]).Top + 15);

                    Curway = Way.Down;                           

                }

                break;

            case Keys.Down:

                if (Curway != Way.Up)  //如果蛇的当前方向不为上

                {

                    Move_snake(((Label)arry_snake[snake_start]).Left, ((Label)arry_snake[snake_start]).Top + 15);

                    Curway = Way.Down;

                }

                break;

            case Keys.Left: //向左移动()

                if (Curway != Way.Rigth)  //如果蛇的当前方向不为右

                {

                    Move_snake(((Label)arry_snake[snake_start]).Left - 15, ((Label)arry_snake[snake_start]).Top);

                    Curway = Way.Left;

                }

                break;

            case Keys.Right:

                if (Curway != Way.Left)   ////如果蛇的当前方向不为左

                {

                        Move_snake(((Label)arry_snake[snake_start]).Left + 15, ((Label)arry_snake[snake_start]).Top);

                        Curway = Way.Rigth;

                }

                break;

        }

 

7.关于我们

//连接到我的优快云博客

 private void About_Click(object sender, EventArgs e)

 {

    Process.Start("IEXPLORE.EXE", "http://blog.youkuaiyun.com/sz_bdqn");//启动IE浏览器

 }

2.打字游戏

1.打字游戏的难度级别:

       a.初级:A ~ Z

       b.中级:A~Z ,a~z

       c.高级: A~Z ,a~z,0~9,还有其他特殊字符

//开始事件

private void start_Click(object sender, EventArgs e)

{

  //根据选择的难度级别设置要练习打字的字母

   if (level == Level.ChuJi)

    str = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";

    else if (level == Level.ZhongJi)             

        str += "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";

    else if (level == Level.GaoJi)

        str += "1,2,3,4,5,6,7,8,9,0,[,],{,},-,=,//,_,+,|";

    else

    {

        MessageBox.Show("请选择难度级别!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);

        return;

     }

}

2.Label来当作掉落的方块,设置Label相应属性(字体,字体颜色,Label的背景颜色,初始位置.)

//创建Label

public void CreatLabel()

{

    string[] s = str.Split(new char[] { ',' });   // 将字符串拆分字符串数组

    Random rd = new Random();        //产生一个随机数

    x = this.panel1.Width - 40;

    Ox = rd.Next(0, x);

    lbl = new Label();    //产生一个 Label         

    lbl.Size = new Size(40, 40);  //设置 label 的大小          

    lbl.BackColor = color;           //设置 Label 的背景颜色          

    lbl.Location = new Point(Ox, 0); //设置产生 Label 的位置

    lbl.FlatStyle = FlatStyle.Standard;

    int lbl_int = rd.Next(0, (s.Length));  //产生一个 0 - s.Length 之间的随机数

    //随机的给 Label 赋值(A - Z)          

    strName = s[lbl_int];

    lbl.Text = strName;

    lbl.Font = new Font("宋体", 30); //设置字体         

    lbl.ForeColor = wordColor;   //设置字体颜色

    lbl.TextAlign = ContentAlignment.MiddleRight;  //字体显示的位置

    panel1.Controls.Add(lbl);   //添加到面板中

}

3.根据设置下落的时间和选择的闯关的级别来设置字母下降的速度

//Label下降

private void timer2_Tick(object sender, EventArgs e)

{

    //循环遍历所有在面板中的控件

    foreach (Control con in this.panel1.Controls)

    {

        if (con is Label) //判断是否是Label

        {

            int speeds = 0;

            if (passes <= 10)

                speeds = 8 + 2 * passes;

            else

                speeds = 8 + 2 * passes;

            con.Top += speeds;

            if (con.Top > panel1.Height - 40) //判断是否超过面板的最底端

            {

                con.Dispose(); //销毁Label

                lostedLbl += 1; //失败个数加1

            }

        }

    }

}

4.键盘按下事件,若按下的键与面板中显示的值相同,则销毁相应的Label

        private void Form4_KeyPress(object sender, KeyPressEventArgs e)

        {

            //遍历面板中所有的控件

            foreach (Control con in this.panel1.Controls)

            {

                if (con is Label) //判断是否是Label

                {

                    if (e == Convert.ToChar(con.Text))

                    {

                        con.Dispose();  //销毁打中的 Label 

                        fs = new FileStream("打中的声音.wav", FileMode.Open);

                        sp = new SoundPlayer(fs);

                        sp.Play();

                        fs.Close();

                    }

                }

            }

        }

5.对游戏的设置,包括关数级别,过关个数,失败个数,背景音乐

//添加播放音乐事件

private void button4_Click(object sender, EventArgs e)

{

    this.listBox1.Items.Clear(); //清空ListBox中的的所以数据

    DialogResult dr = folderBrowserDialog1.ShowDialog();

    if (dr == DialogResult.OK)

    {

        //指定目录中的所选种的文件夹

        DirectoryInfo  dir = Directory.CreateDirectory(folderBrowserDialog1.SelectedPath);

        GetAllFiles(dir);  //扫描用户选种的文件夹

    }

}       

//扫描用户选种的文件夹

private void GetAllFiles(DirectoryInfo dir)

{

    this.listBox1.Items.Clear();

    FileSystemInfo[] fileInfo = dir.GetFileSystemInfos();  //返回指定目录文件中的所有子文件

    foreach (FileSystemInfo fileMp3 in fileInfo)

    {

        if (fileMp3 is DirectoryInfo)

            GetAllFiles((DirectoryInfo)fileMp3); //运用递归法

        else

        {

            string strPath = fileMp3.FullName; //获取文件的完整目录

           //获取mp3的完整名称

            string strFullMp3 = (strPath.Substring(strPath.LastIndexOf(@"/") + 1)).ToString();

             string forMart = strFullMp3.Substring(strFullMp3.Length - 3); //获取文件的格式

            if (forMart == "mp3") //判断文件格式是否是mp3

            {

                this.listBox1.Items.Add(strFullMp3); //mp3的名字添加到ListBox

                //添加列表

                wc = new WindowsMediaPlayerClass();

                mc = wc.newMedia(strPath);

                this.axWindowsMediaPlayer1.currentPlaylist.appendItem(mc);

            }

        }

    }

}

6.游戏结束

倒影字体Game Over

//倒影

private void DaoYing()

{

    //倒影文字

    Brush backBrush = Brushes.BlueViolet; //倒影颜色

    Brush foreBrush = Brushes.Red; //字体颜色

    Font font = new Font("幼圆", Convert.ToInt16(60), FontStyle.Regular);//设置字体

    Graphics g = this.panel1.CreateGraphics();

    string text = "GAME OVER";

    SizeF size = g.MeasureString(text, font);

    //是字体显示在Label中央

    int posX = (this.panel1.Width - Convert.ToInt16(size.Width)) / 2;

    int posY = (this.panel1.Height - Convert.ToInt16(size.Height)) / 2;

    g.TranslateTransform(posX, posY);

    int ascent = font.FontFamily.GetCellAscent(font.Style);

    int spacing = font.FontFamily.GetLineSpacing(font.Style);

    int lineHeight = System.Convert.ToInt16(font.GetHeight(g));

    int height = lineHeight * ascent / spacing;

    GraphicsState state = g.Save();

    g.ScaleTransform(1, -1.0F);

    g.DrawString(text, font, backBrush, 0, -height);

    g.Restore(state);

    g.DrawString(text, font, foreBrush, 0, -height);

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值