学习C#从俄罗斯方块开始(一)概述

       前几天和一个在读的本科生聊天,他一直在抱怨学校学习的理论知识太多,实践的机会太少。担心自己因此毕业后可能难以找到工作。我认为一个人要是想投入开发,他总是可以找到项目的。与其把自己的时间浪费在抱怨和指责上,为什么不现在就动手开始开发呢?他的回答是不知道开发啥,没有人指导自己,不知道从何入手。我想想了,那么我们就从俄罗斯方块开始下手吧。

      “从俄罗斯方块开始,那个游戏太简单了。我即使可以开发一个俄罗斯方块,又会有那个公司要我呢?如果将来我的建立上写上我做过俄罗斯方块游戏。那也不大会有人要我吧!”

       “一个俄罗斯方块无论是从算法上来讲,还是从其他方面上来讲,确实太简单了。但是很多人只能看到俄罗斯方块的简单,却很少有人能把简单做到极致。而一个成功的程序员就是要做到把简单的东西深入下去,把简单的事情做到极致,就不在是简单了。让我来带你开发个俄罗斯方块吧。”

      那么也请各位看客跟着我们一起去深入俄罗斯方块,把这个简单的小玩意做到一个极致。这个系列的探讨适合有一定的C#的语法基础。但是尚未做过任何大的项目的童鞋一起学习。如果哪位大侠看到鄙人的东西,热烈欢迎拍砖。

 

首先说说咱们的学习的大概的规划:

第一步、我们先简单的理解下俄罗斯游戏开发的大概算法和需要的知识,然后把这些知识组

        合开发一个小小的俄罗斯游戏Demo。基本上实现俄罗斯方块游戏的控制和操作。
第二步、我们在我们的Demo的基础上,尽可能的提出对我们的算法进行优化。对我们的界面

        进行美化,功能进行扩展。从一个简单的Demo变成一个可玩性很强的单机版俄罗斯

        方块小游戏。

第三步、我们来尝试把单机版俄罗斯方块做成一个俩人联机版游戏,利用SOCKET通信,让咱

        们的俄罗斯方块实现可以双人玩。我们主要使用point-to-point方式来玩。一个当做

        服务器端一个当做客户端来玩。

第四步、我们把我们的简单联机版俄罗斯方块做成一个带游戏大厅的服务端和客户端多人连

        接俄罗斯方块游戏。让更多的人加入我们来玩。

第五步、从可盈利出发。我们研究深入研究俄罗斯游戏可能产生的盈利模式,我们将在俄罗

        斯游戏中把我们的盈利模式实现,我们将在我们的游戏中增加其他的一些道具,而

        这些道具有可能需要稍微改变下游戏的规则。至此为止,我们就可以依托一个点逐

        渐的拓展成一个面,完成一个俄罗斯方块游戏商业模式。

      至此我们的游戏已经可以成为一个可盈利的商业模式。当然能不能依托这个简单的游戏收获金钱需要看咱们做的游戏的好坏。也需要看咱们的机会和宣传了。从极坏的情况下来讲解。咱们赚钱的可能性基本上为零。当然这个也是这次开发最最可能呈现的情况。但是对一个学习计算机的程序员来说。这样的开发过程绝对可以称得是一次工作经历了,而且有了这样的思维和学习的模式,我相信抱怨和指责应该可以远离你的生活了。

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
C#俄罗斯方块 摘要 2008-07-07 09:38 阅读87 评论0 字号: 大大 中中 小小 C++是游戏编程的首选语言,但我相信C++能做到的C#也能做到。 本篇介绍用C#编写一个俄罗斯方块程序的原理,以及在C#里面播放声音,保存游戏设置的方法。 游戏界面预览: 菜单预览: 自定义每个小方块颜色功能界面: 游戏主要有四部分组成:Square类,Block类,gameField类,游戏引擎 Square类: 这个类描述的对象是组成大方块中的每个小正方形实体。 类设计: class Square { public Point location; //小方块的坐标 public Size size; //小方块大小 public Color foreColor; //小方块前景色 public Color backColor; //小方块背景色 public Square(Size initSize,Color initForeColor,Color initBackColor) //构造函数 { ……} public void Draw(System.IntPtr winHandle) //在指定设备上画方块 { …… } public void Erase(System.IntPtr winHandle)//擦除方块 { …… } } Block类: 这个类描述的对象是某一个大方块的实体。每个大方块由四个小正方形组成,一共有7种组合方式。这个类需要实现一个大方块实体所有的属性和动作。包括:方块的形状,位置,方块左移,右移,下移,旋转等。 类设计: class Block { public Square square1; //组成block的四个小方块 public Square square2; public Square square3; public Square square4; private const int squareSize = GameField.SquareSize; //小方块的边长 public enum BlockTypes { undefined = 0, square = 1, line = 2, J = 3, L = 4, T = 5, Z = 6, S = 7 };//一共有7种形状 public BlockTypes blockType; //方块的形状 //七个小方块的颜色数组 private Color foreColor; private Color backColor; //方块的方向 public enum RotateDirections { North = 1, East = 2, South = 3, West = 4 }; public RotateDirections myRotation = RotateDirections.North; public Block(Point thisLocation,BlockTypes bType) { ……} //含有自定义颜色的重载 public Block(Point thisLocation, BlockTypes bType,Color fc,Color bc) { ……} /*画方块*/ public void Draw(System.IntPtr winHandle) {…… } /*擦方块*/ public void Erase(System.IntPtr winHandle) {…… } /*移动*/ public bool down() {……} public bool left() {……} public bool right() {……} /*旋转block*/ public void Rotate() {……} /*检测是否到顶*/ public int Top() {……} } GameField类: 这个类描述的对象是游戏场景实体,包括场景的背景色,大小,方块是否还可以移动,以及场景中填满一行的检测等。 类设计: class GameField { public const int width = 20; //场景的宽,以方块个数为单位 public const int height = 30; public const int SquareSize = 15; //每个四分之一小方块的边长 public static Color BackColor; //场景的背景色 public static System.IntPtr winHandle; //场景的handle public static Color[] BlockForeColor ={ Color.Blue, Color.Beige, Color.DarkKhaki, Color.DarkMagenta, Color.DarkOliveGreen, Color.DarkOrange, Color.DarkRed }; public static Color[] BlockBackColor ={ Color.LightCyan, Color.DarkSeaGreen, Color.Beige, Color.Beige, Color.Beige, Color.Beige, Color.Beige }; public static bool isChanged=false; //设置是否被更改的标志位 public static SoundPlayer sound = new SoundPlayer(); //播放声音 public static Square[,] arriveBlock = new Square[width, height]; //保存已经不能再下落了的方块 public static int[] arrBitBlock=new int[height]; //位数组:当某个位置有方块时,该行的该位为1 private const int bitEmpty = 0x0; //0000 0000 0000 0000 0000 private const int bitFull = 0xFFFFF; //1111 1111 1111 1111 1111 /*检测某个位置是否为空*/ public static bool isEmpty(int x, int y) {……} /*将方块停住*/ public static void stopSquare(Square sq, int x, int y) {……} /*检测行是否满 * 返回:成功消除的行数和 (方便统计分数) */ public static int CheckLines() { ……} /*播放声音*/ public static void PlaySound(string soundstr) {……} /*重画*/ public static void Redraw() { …… } //结束 } 游戏引擎: 游戏引擎正如其名,就像一个发动机一样让游戏不间断运行。本游戏中就是让方块以一定的速度下落。并响应键盘事件,实行左右移动,和向下加速功能。(代码见源码) 声音播放: 音效是游戏不可缺少的一部分。在.Net2.0中已经提供了一个类来播放声音。在using System.Media;命名空间。 本游戏中播放声音的代码如下:(在 GameField类中) using System.Media; public static SoundPlayer sound = new SoundPlayer(); /*播放声音*/ public static void PlaySound(string soundstr) { switch (soundstr) { case "FinishOneLine": //消除一行的声音 if (!File.Exists("FinishOneLine.wav")) return; sound.SoundLocation = "FinishOneLine.wav"; break; case "CanNotDo": //当无法操作时 if (!File.Exists("CanNotDo.wav")) return; sound.SoundLocation = "CanNotDo.wav"; break; } sound.Play(); } 要播放的时候调用PlaySound()方法即可。 其实步骤很简单,先引用System.Media空间,然后创建一个SoundPlayer 对象,用SoundLocation 属性设置声音文件的地址,然后调用Play()方法即可播放。不过注意,这个类可以播放的声音格式只有Wav文件。 保存游戏设置: 在游戏中经常要保存用户自定义的设置。本游戏通过写进ini文件来保存。 主要代码如: /*加载窗体时从配置文件Setting.ini中读取游戏设置*/ private void getSettings() { if (!File.Exists("Setting.ini")) return; FileStream fs = new FileStream("Setting.ini", FileMode.OpenOrCreate, FileAccess.ReadWrite); StreamReader sr = new StreamReader(fs); string line1=sr.ReadLine(); string line2=sr.ReadLine(); string line3=sr.ReadLine(); if (line1 != null && line1.Split('=').Length > 1) { GameField.BackColor = Color.FromArgb(int.Parse(line1.Split('=')[1])); picBackGround.BackColor = GameField.BackColor; } if (line2 != null && line2.Split('=').Length > 1) GameField.BlockForeColor = strToColor(line2.Split('=')[1]); if (line3 != null && line3.Split('=').Length > 1) GameField.BlockBackColor = strToColor(line3.Split('=')[1]); sr.Close(); fs.Close(); } /*如果游戏设置被更改,将新的设置保存到Setting.ini*/ private void saveSettings() { FileStream fs = new FileStream("Setting.ini", FileMode.Create, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter(fs); sw.WriteLine("GameFieldColor="+GameField.BackColor.ToArgb()); sw.WriteLine("BlockFroeColor=" + colorToStr(GameField.BlockForeColor)); sw.WriteLine("BlockBackColor=" + colorToStr(GameField.BlockBackColor)); sw.Flush(); sw.Close(); fs.Close(); }
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aofengdaxia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值