基本信息
源码名称:C# 仿钢琴块 DEMO(小游戏)
源码大小:1.08M
文件格式:.zip
开发语言:C#
更新时间:2018-06-24
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 3 元×
微信扫码支付:3 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
模仿钢琴块游戏的实例,目前还没写判断游戏结束的方法
但基本不影响使用,关卡文件一同打包到实例里了
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排的方块,也可以用鼠标点击方块消除");
}
}
}