Nearth===021/c#抽象类、多态和接口(练习题1)

1、在俄罗斯方块程序中,有L形,T形,田形等多种形状,它们是图形的多种形态,可以创建一个名为Shape的基类,而后派生L形,T形等,之后可以在运行时动态绘制各种形状。

1)创建一个名位Teris的控制台应用程序、

2)各个类之间的关系如下图所示:

待上传·····························

3)创建名为Shape的抽象类,包括ShapeType属性和显示信息方法,以及抽象方法绘制:

4)创建名为ShapeL的派生类,实现基类的绘制

5)创建名为ShapeT的派生类,实现基类的绘制

6)创建名为ShapeZ的派生类,实现基类的绘制

7)创建名为ShapeBlock(田字形)的派生类,实现基类的绘制

8)在Program.cs中添加如下代码,实现随机生成图形:


         

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;//进程函数的库函数,Thread.Sleep(1000);
namespace Teris
{
    enum ShapeType
    {
        Block = 0,
        L,
        T,
        Z
    }//枚举类型的使用
    class Program
    {
        static void Main(string[] args)
        {
            Random rnd = new Random();
            while (true)
            {
                Shape shape = null;
                ShapeType type = (ShapeType)rnd.Next(4);//random.Next(MaxValue)----------返回一个小于所指定最大值的非负随机数
                switch (type)//switch选择,建立一个类,
                {
                    case ShapeType.Block:
                        shape = new ShapeBlock();
                        break;
                    case ShapeType.L:
                        shape = new ShapeL();
                        break;
                    case ShapeType.T:
                        shape = new ShapeT();
                        break;
                    case ShapeType.Z:
                        shape = new ShapeZ();
                        break;
                }
                if (shape != null)//如果所建立的类存在,则相应得调用它的函数
                {
                    shape.DisplayInfo();
                    shape.Draw();
                    Console.WriteLine("----------------------");
                    Thread.Sleep(1000);//防止刷新太快,让系统停止1秒}
                }
            }
        }
        public abstract class Shape//建立一个shape图形抽象类
        {
            private string shapeType;//图形形状变量

            public string ShapeType//图形形状属性
            {
                get { return shapeType; }
                set { shapeType = value; }
            }

            public void DisplayInfo()//展示图形类型的方法
            {
                Console.WriteLine("当前图形类型" + shapeType);
            }
            public abstract void Draw();//抽象类的展示图形的方法
        }
        public class ShapeL : Shape
        {
            public ShapeL()//shapeL的无参对象
            {
                ShapeType = "L形";
            }
            public override void Draw()//重载抽象类的展示图形的方法
            {
                Console.WriteLine("|");
                Console.WriteLine("|");
                Console.Write("|");
                Console.WriteLine("__");
            }
        }
        public class ShapeT : Shape
        {
            public ShapeT()//shapeT的无参对象
            {
                ShapeType = "T形";
            }
            public override void Draw()//重载抽象类的展示图形的方法
            {
                Console.WriteLine("_______");
                Console.WriteLine("   |");
                Console.WriteLine("   |");
            }
        }
        public class ShapeZ : Shape
        {
            public ShapeZ()//shapeZ的无参对象
            {
                ShapeType = "Z形";
            }
            public override void Draw()//重载抽象类的展示图形的方法
            {
                Console.WriteLine("----");
                Console.WriteLine("    |");
                Console.WriteLine("    |");
                Console.WriteLine("     ----");
            }
        }
        class ShapeBlock : Shape
        {
            public ShapeBlock()//shapeBlock的无参对象
            {
                ShapeType = "田形";
            }
            public override void Draw()//重载抽象类的展示图形的方法
            {
                Console.WriteLine(" _________");
                Console.WriteLine("|    |    |");
                Console.WriteLine("|    |    |");
                Console.WriteLine(" --------- ");
                Console.WriteLine("|    |    |");
                Console.WriteLine("|    |    |");
                Console.WriteLine(" --------- ");
            }
        }
    }
}

      


       运行结果:

待上传·······························


生命的每一天在于学习哒···········································

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C#俄罗斯方块程序设计与简单实现 效果演示:https://www.cnblogs.com/JiYF/p/9632821.html可以到这里查看效果,当然有部分bug还需要解决 相信90后或者80后都玩过这款小游戏,一直想干一票,琢磨一下,但又不太懂,于是网上搜集修改就有了以下效果!bug较多,多多包涵! 1.效果展示 2.实现方法 参考https://blog.csdn.net/qian_f/article/details/19758671 感谢博主分享,我在这里也没修改啥,有时间修复几个bug 2.1对象分析 把每个砖块当成一个对象。每个砖块都有共同的行为,就是可以左移、 右移、下移和变。既然这是他们共同的行为(方法),那么可以定义一个虚基类Brick,然后在该基类声明这些行为。当然,砖块在做这些行为前需要知道能不能进行这些行为,比如说到了左边界就不能左移;到了下边界就不能下移;周围空间不够大,就不能变等等。因此该基类还需要声明一些虚函数:CanTransform() CanLeftMove() CanRightMove() CanDropMove()等。 2.2继承实现 继承定义的基类,每种砖块根据自身的形状具体实现相应函数。据说在标准的俄罗斯方块,一共有七种形状。本练习项目定义的方块和变方式(绕着心点顺时针旋转,途颜色较深的点就是心点)如下: 根据上图就可以知道,表示砖块最好的方法就是用二维数组了。对于砖块而言,这个二维数组就是它的变范围,数组的数字为0,代表砖块在该区域无显示,为1代表有显示。在实现CanTransform() CanLeftMove() CanRightMove() CanDropMove()这四个函数时,要尤其小心,这边是最容易出错的地方。 2.3画布处理 完成砖块下面就要进行画布的处理了。可以想象一下,把画布分成多个方格,也就相当于二维数组了,然后把砖块所对应的二维数组按指定的位置放到代表画布的二维数组。在显示的时候就可以根据值为1的方格来获取位置并进行绘图了。所以,该项目定义了一个名为Canvas的类,核心功能是用于获取这个二维数组的值,其包含根据砖块设置数组的值、行满(一行里所有的值都为1)之后消除、超出高度后返回失败等。 2.4绘图 真正的绘图操作。根据二维数组的值绘制显示,并响应方向键操作。 3.代码实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码字界陈冠希

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

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

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

打赏作者

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

抵扣说明:

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

余额充值