C#游戏设计大赛
此游戏是在班上一次c#游戏设计大赛做的,在此我也曾获得过奖
其中包扩两个游戏,
一个是贪吃蛇,另一个是打字游戏
其中包含有许多的功能,也运用许多知识点,
1.如何读取音乐文件:例如:贪吃蛇吃食物的声音,字体被打中的声音,游戏结束的生音...
2.如何更改界面皮肤:
3.如何在托盘中写入应用程序图标:鼠标右击右下角的图标可以选择自己喜欢的皮肤
4.对贪吃蛇可以设置蛇的颜色,也可以设置食物的颜色,还可以设置界面的背景颜色...
5.对打字游戏可以设置字体的大小,类型,游戏的背影颜色...
6.可以设置自己过关的关数,和设置过关的难度级别
7.在游戏的有上方可以看到玩过此游戏的最高分和玩家,如过您破了最高记录将会记录你的姓名和分数
8.在玩游戏中也可以设置一些自己喜欢的背景音乐,此功能相当于一个千千静听,可以循环遍历某个文件中的音乐文件
9.如何调用本机程序:我用这个知识点做了一个超链接,可以连接到我的优快云博客
......
希望此程序能给大家带来帮助!!!
1.贪吃蛇游戏
1.用3个Label组成一条蛇,设置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);
}
本文介绍了作者在C#游戏设计大赛中的获奖作品,包括贪吃蛇和打字游戏。游戏包含丰富的功能,如音乐播放、界面皮肤更换等。在贪吃蛇游戏中,详细讲解了如何实现蛇的移动、吃食物和判断游戏结束。打字游戏中,设置了不同的难度级别和字母下落速度,并实现了背景音乐播放。整个游戏提供了一次有趣且富有挑战性的编程体验。
602

被折叠的 条评论
为什么被折叠?



