在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C# 仿钢琴块 DEMO(小游戏)

C# 仿钢琴块 DEMO(小游戏)

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:1.08M
  • 下载次数:26
  • 浏览次数:623
  • 发布时间:2018-06-24
  • 实例类别:C#语言基础
  • 发 布 人:Xiao_M
  • 文件格式:.zip
  • 所需积分:3
 相关标签: C# 钢琴 游戏

实例介绍

【实例简介】

模仿钢琴块游戏的实例,目前还没写判断游戏结束的方法

但基本不影响使用,关卡文件一同打包到实例里了

【实例截图】

【核心代码】


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排的方块,也可以用鼠标点击方块消除");
        }
    }
}


标签: C# 钢琴 游戏

实例下载地址

C# 仿钢琴块 DEMO(小游戏)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警