简单俄罗斯方块

  cheney

无聊的时候做了一款小游戏,用控制台程序实现的,拥有经典的黑白外表。虽然是控制台程序,编程语言用的C++,因为我感觉这是一个多么好的练手机会,各种图形,就是最形象的对象了。一个小程序,都改了两三次了,可能还是有bug,现在差不多能玩了,也就自己玩玩。

游戏界面

不说话先上图

界面的简陋程度就不用说了,虽说是控制台程序简陋到这样也让人汗颜。我永远也无法做到 MARIO 的程度,Win7已经不支持控制台全屏了。为了画出我喜欢的大小,许多机器都必须修改默认的控制台程序显示缓存的的大小。

属性窗口

我感觉用的最好的地方

游戏里的形状和形状的初始方向是随机的。随机,是通过标准库里的srand()和rand()函数实现了;

摇出一个号之后,申请一个形状,赋值给形状的基类的指针,之后一直用基类来控制这个形状。这种方法就好像抓住它们的共同点,同意调用。实际上是在调用基类的虚函数,进而调用子类的对应函数,感谢C++的多态性。以下是部分代码:

	void CreateObj( void )
	{
		CShape *pShape=NULL
		srand((int)time(0));
		int r1 = rand()%7 ;
		srand((int)time(0));
		int r2 = rand()%4 ;

		switch (r1):
		{
			case 0 :
				pShape= new Czhengfangxing(&buffnext[4][4],r2);
				break;
			case 1 :
				pShape= new Ctiaoxing(&buffnext[4][4],r2);
				break;
			case 2 :
				pShape= new CNxing(&buffnext[4][4],r2);
				break;
			case 3 :
				pShape= new CNNxing(&buffnext[4][4],r2);
				break;
			case 4 :
				pShape= new CTxing(&buffnext[4][4],r2);
				break;
			case 5 :
				pShape= new CLxing(&buffnext[4][4],r2);
				break;
			case 6 :
				pShape= new CLLxing(&buffnext[4][4],r2);
				break;
			default : return;
		}
		WaitAlive.ActObj.pCShap = pShape;
		WaitAlive.ActObj.pbuff = buffnext[4][4];
		WaitAlive.ActObj.Dir = r2;
		WaitAlive.ActSta = 1;
		memset(buffnext, 0, 6 , MAXD );
		WaitAlive.ActObj.pCShap->CreateShape(WaitAlive.ActObj.pbuff, WaitAlive.ActObj.Dir,  OR_B );
	}
	       


感觉不好的地方

总是出现一些打破当前完美的数据结构就能便捷的实现某些功能的地方。C++一方面体现了数据良好的封装性,一方面又不利于操作。我经常纠结于把一个数据写成共有的大家都能调用,还是写成私有的,再写个函数调用。唉,看来这个东西只有在大型工程,多人合作的时候才能体现价值,小东西不管怎么研究都小气。

一些特殊的char

printf("%c",7);

ASCII中编号为7的东西是个喇叭,以前还真没注意过,这个东西输出一下其实就是主板上的蜂鸣器响一下,跟的操作系统声音没关系的,关掉声音也能听到。

printf(“%c%c“,0xA1,0xF6);

这样得到的是一个方块,就是我拼出俄罗斯方块的基本材料。

最后感叹一下

  • 我感觉到了,类的对象,真是一个活生生的东西。
  • Win7 下的程序跑得比 XP 下慢,不知道为什么。

相关资源

Tetris0.1.rar;