模仿钢琴块游戏的实例,目前还没写判断游戏结束的方法但基本不影响使用,关卡文件一同打包到实例里了
 
 
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using SimpleMidiPlayer.Midi;using System.IO;namespace 钢琴块_Demo{  public partial class GameControl : Form  {    public GameControl()    {      InitializeComponent();      Control.CheckForIllegalCrossThreadCalls = false;    }    #region 控制块的滑落    /// <summary>    /// 块滑落的速度(px/2ms)    /// </summary>    int speed = 5;    private void timer1_Tick(object sender, EventArgs e)    {      try      {        //遍历控件        foreach (Label l in panel1.Controls)        {          if (l.Location.Y < 600)//如果控件没出界            l.Location = new Point(l.Location.X, l.Location.Y  speed);//滑落          else//否则            GameOver();        }      }      catch { }      try      {        //遍历控件        foreach (Label l in panel2.Controls)        {          if (l.Location.Y < 600)//如果控件没出界            l.Location = new Point(l.Location.X, l.Location.Y  speed);//滑落          else//否则            GameOver();        }      }      catch { }      try      {        //遍历控件        foreach (Label l in panel3.Controls)        {          if (l.Location.Y < 600)//如果控件没出界            l.Location = new Point(l.Location.X, l.Location.Y  speed);//滑落          else//否则            GameOver();        }      }      catch { }      try      {        //遍历控件        foreach (Label l in panel4.Controls)        {          if (l.Location.Y < 600)//如果控件没出界            l.Location = new Point(l.Location.X, l.Location.Y  speed);//滑落          else//否则            GameOver();        }      }      catch { }    }    #endregion    #region 游戏中的事件    /// <summary>    /// 当前已消灭的方块数量    /// </summary>    int CurrentBlockCount = 0;    int MaxBlockCount = 0;    int source = 0;    /// <summary>    /// 可清除块的区域    /// </summary>    Rectangle clearRect = new Rectangle(0, 280, 115, 360);    /// <summary>    /// 游戏结束    /// </summary>    private void GameOver()    {      timer1.Enabled = Maintimer.Enabled = false;      if (MessageBox.Show("游戏结束! 点击确定重玩\n 分数:"  source) == System.Windows.Forms.DialogResult.OK)        Application.Restart();    }    /// <summary>    /// 胜利消息    /// </summary>    /// <param name="WinMessage"></param>    private void YouWin(string WinMessage)    {      timer1.Enabled = Maintimer.Enabled = false;      MessageBox.Show(WinMessage  "\n 分数:"  source);      Application.Restart();    }    private MusicDocument doc = new MusicDocument();    /// <summary>    /// 播放钢琴简谱    /// </summary>    /// <param name="sound">简谱,用/,分隔数字</param>    private void PlaySonud(string sound)    {      doc.MusicScore.Beat = "4/4";      doc.MusicScore.BeatsPerMinute = 80;      doc.MusicScore.Mode = "C";      doc.MusicScore.Score = sound  "-";      doc.Play();    }    private string[] GameLevel;    private void StartGame(string level)    {      //关卡用逗号分隔      GameLevel = File.ReadAllLines(Application.StartupPath  "\\Level\\"  level  ".level");      panel1.Visible =      panel2.Visible =      panel3.Visible =      panel4.Visible =      Maintimer.Enabled = true;//开始游戏    }    /// <summary>    /// 弹出方块    /// </summary>    /// <param name="ASDF">方块在哪行</param>    /// <param name="sound">发出声音(正数为普通,负数为低音,前面加#为高音)</param>>    /// <param name="text">块上的文字</param>>    private void OutBlock(int ASDF, string sound = "", string text = "")    {      Label l = new Label();      l.TextAlign = ContentAlignment.MiddleCenter;      if (sound != string.Empty)        l.Name = sound;      else        l.Name = "0";      l.Text = text;      l.Cursor = Cursors.Hand;      l.Location = new Point(25, -70);      l.AutoSize = false;      l.ImageAlign = ContentAlignment.MiddleCenter;      l.Image = Properties.Resources.noteblock;      l.BorderStyle = BorderStyle.FixedSingle;      l.BackColor = Color.Black;      l.ForeColor = Color.White;      l.Size = new Size(70, 70);      if (ASDF == 1)      {        l.Click = (object sender, EventArgs e) => { PlaySonud(sound); source ; panel1.Controls.Remove(l); l.Dispose(); };        panel1.Controls.Add(l);      }      else if (ASDF == 2)      {        l.Click = (object sender, EventArgs e) => { PlaySonud(sound); source ; panel2.Controls.Remove(l); l.Dispose(); };        panel2.Controls.Add(l);      }      else if (ASDF == 3)      {        l.Click = (object sender, EventArgs e) => { PlaySonud(sound); source ; panel3.Controls.Remove(l); l.Dispose(); };        panel3.Controls.Add(l);      }      else if (ASDF == 4)      {        l.Click = (object sender, EventArgs e) => { PlaySonud(sound); source ; panel4.Controls.Remove(l); l.Dispose(); };        panel4.Controls.Add(l);      }    }    int ii = 0;    private void Maintimer_Tick(object sender, EventArgs e)    {      try      {        if (ii < 1)//如果小于1        {          //做准备工作          speed = int.Parse(GameLevel[0].Split(',')[0]);//第一个:速度          ii ;          foreach (string str in GameLevel)          {            if (str.Substring(0, 1) != "0")            {              MaxBlockCount ;            }          }          timer1.Enabled = true;        }        else if (ii  1 < GameLevel.Length)//第二个:块数        {          string Line = GameLevel[ii].Split(',')[0];//获取在那行          string Sound = GameLevel[ii].Split(',')[1];//获取简谱音符          string BlockText = GameLevel[ii].Split(',')[2];//获取文字          if (Line != "0")            OutBlock(int.Parse(Line), Sound, BlockText);//弹出块          else PlaySonud(Sound);          ii ;        }      }      catch { timer1.Enabled = Maintimer.Enabled = false; MessageBox.Show("关卡文件有毒...请使用正确的关卡文件","(⊙o⊙)…"); }    }    private void Form1_KeyDown(object sender, KeyEventArgs e)    {      if (e.KeyCode == Keys.A)      {        if (panel1.Controls.Count == 0)          GameOver();        int SurplusCount = 0;//剩余项目        foreach (Label l in panel1.Controls)//遍历控件        {          //控件工作区域          Rectangle a = new Rectangle(l.Location.X, l.Location.Y, l.Width, l.Height);          if (clearRect.Contains(a))//如果控件在工作区域内          {            PlaySonud(l.Name);            panel1.Controls.Remove(l);//移除控件            l.Dispose();//释放控件的资源            source ;//分数 1            CurrentBlockCount ;          }          else SurplusCount ;//否则剩余项目 1        }        if (CurrentBlockCount == MaxBlockCount)          YouWin("恭喜你通过关卡");      }      else if (e.KeyCode == Keys.S)      {        if (panel2.Controls.Count == 0)          GameOver();        int SurplusCount = 0;//剩余项目        foreach (Label l in panel2.Controls)//遍历控件        {          //控件工作区域          Rectangle a = new Rectangle(l.Location.X, l.Location.Y, l.Width, l.Height);          if (clearRect.Contains(a))//如果控件在工作区域内          {            PlaySonud(l.Name);            panel2.Controls.Remove(l);//移除控件            l.Dispose();//释放控件的资源            source ;//分数 1            CurrentBlockCount ;          }          else SurplusCount ;//否则剩余项目 1        }        if (CurrentBlockCount == MaxBlockCount)          YouWin("恭喜你通过关卡");      }      else if (e.KeyCode == Keys.D)      {        if (panel3.Controls.Count == 0)          GameOver();        int SurplusCount = 0;//剩余项目        foreach (Label l in panel3.Controls)//遍历控件        {          //控件工作区域          Rectangle a = new Rectangle(l.Location.X, l.Location.Y, l.Width, l.Height);          if (clearRect.Contains(a))//如果控件在工作区域内          {            PlaySonud(l.Name);            panel3.Controls.Remove(l);//移除控件            l.Dispose();//释放控件的资源            source ;//分数 1            CurrentBlockCount ;          }          else SurplusCount ;//否则剩余项目 1        }        if (CurrentBlockCount == MaxBlockCount)          YouWin("恭喜你通过关卡");      }      else if (e.KeyCode == Keys.F)      {        if (panel4.Controls.Count == 0)          GameOver();        int SurplusCount = 0;//剩余项目        foreach (Label l in panel4.Controls)//遍历控件        {          //控件工作区域          Rectangle a = new Rectangle(l.Location.X, l.Location.Y, l.Width, l.Height);          if (clearRect.Contains(a))//如果控件在工作区域内          {            PlaySonud(l.Name);            panel4.Controls.Remove(l);//移除控件            l.Dispose();//释放控件的资源            source ;//分数 1            CurrentBlockCount ;          }          else SurplusCount ;//否则剩余项目 1        }        if (CurrentBlockCount == MaxBlockCount)          YouWin("恭喜你通过关卡");      }    }    #endregion    /// <summary>    /// 直接点击面板    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void panel4_Click(object sender, EventArgs e)    {      //游戏结束      GameOver();    }    private void button1_Click_1(object sender, EventArgs e)    {      //button1.Enabled = button3.Enabled = false;      this.panel5.Location = new System.Drawing.Point(189, 143);      button2.Focus();      panel5.Visible = true;      DirectoryInfo d = new DirectoryInfo(Application.StartupPath  "\\Level\\");      foreach(FileInfo f in d.GetFiles("*.level"))      {        listBox1.Items.Add(Path.GetFileName(f.FullName).Substring(0, Path.GetFileName(f.FullName).LastIndexOf('.')));      }      listBox1.SelectedIndex = 0;    }    private void button2_Click(object sender, EventArgs e)    {      if (listBox1.SelectedItem.ToString().Trim() != string.Empty)      {        Controls.Remove(panel5);        this.MainPanel.Location = new System.Drawing.Point(87, 12);        MainPanel.Visible = true;        StartGame(listBox1.SelectedItem.ToString());      }    }    private void button3_Click(object sender, EventArgs e)    {      MessageBox.Show("可以使用键盘 A S D F 键分别消除4排的方块,也可以用鼠标点击方块消除");    }  }}

 
  
					
				
评论