c#打砖块小游戏之--对象实现层(二)

Win Form图形编程实践——打砖块 Win Form图形编程实践——打砖块 引言 本项目学习自际为软件事务所的C#实现一个打砖块游戏 Step By Step,特此鸣谢。 最初,博主只是在简单学习了Win Form之后写一个有图形化界面的小游戏来锻炼一下自己的图形化编程技巧,思前想后选择了打砖块这个游戏。相较于贪吃蛇一类的小游戏,打砖块还是很有难度的,因为要控制球的运动轨迹以及球和砖块、挡板的碰撞问题,设计起来较为繁琐。幸好有上文提到的教程,在OOP方面提供了一个很好的思路,再次感谢。 另:为避免版权问题,游戏中所有涉及到的图片及图标等均为 阅读详情

我把游戏命名为SabBoy-->破坏王,名字威武得像不像天朝的拆迁队!先看看游戏的类图: 

BaseEntity:抽象类

ISabBoy:接口类

Ball:小球类,能运动,实现"运动"接口。

Board:挡板类,能运动,实现"运动"接口。

Brick:砖块类,静止的砖块,没有"运动"行为。

 

基本的框架构建好了,下面就是实现的问题了,一步步渐进,先从基类开始:

BaseEntity.cs

[java]  view plain copy print ?
  1. public abstract class BaseEntity  
  2. {  
  3.     //坐标  
  4.     public int XPos { get; set; }  
  5.     public int YPos { get; set; }  
  6.     //速度和方向控制  
  7.     public int SpeedX { get; set; }  
  8.     public int SpeedY { get; set; }  
  9.     //对象载体  
  10.     public Rectangle Rect { get; set; }  
  11.     //画对象  
  12.     public abstract void Draw(Graphics g);  
  13. }  

接口类:ISabBoy.cs

[c-sharp]  view plain copy print ?
  1. public interface ISabBoy  
  2.   {  
  3.       void Run();  
  4.   }  

小球类:Ball.cs,

[c-sharp]  view plain copy print ?
  1. public class Ball : BaseEntity, ISabBoy  
  2. {  
  3.     /// <summary>  
  4.     /// 初始化小球位置和偏移值  
  5.     /// </summary>  
  6.     public Ball(int x, int y, int speedX, int speedY)  
  7.     {  
  8.         this.XPos = x;  
  9.         this.YPos = y;  
  10.         this.SpeedX = speedX;  
  11.         this.SpeedY = speedY;  
  12.     }  
  13.   
  14.     public override void Draw(Graphics g)  
  15.     {  
  16.         using (SolidBrush sbrush = new SolidBrush(Color.Snow))  
  17.         {  
  18.             Rect = new Rectangle(XPos, YPos, 20, 20);  
  19.             g.DrawEllipse(new Pen(Color.Gray), Rect);  
  20.             g.FillEllipse(sbrush, Rect);  
  21.         }  
  22.         g.Dispose();  
  23.     }  
  24.  
  25.  
  26.     #region ISabBoy 成员  
  27.     //临界检测碰撞,利用随机数,提高可玩性  
  28.     public void Run()  
  29.     {  
  30.         XPos = XPos + SpeedX;  
  31.         YPos = YPos - SpeedY;  
  32.         if (XPos <= 0)  
  33.             SpeedX = (new Random().Next(3, 5));  
  34.         if (XPos > 378)  
  35.             SpeedX = -(new Random().Next(3, 5));  
  36.         if (YPos <= 100)  
  37.             SpeedY = -(new Random().Next(3, 8));  
  38.     }  
  39.     #endregion  
  40. }  

挡板类:Board.cs

[c-sharp]  view plain copy print ?
  1. //挡板方向  
  2. public enum BoardDirection  
  3. {  
  4.     Left, Right  
  5. }  
  6.   
  7. public class Board:BaseEntity,ISabBoy  
  8. {  
  9.     public BoardDirection Direction { get; set; }  
  10.       
  11.     public Board(int x, int y, int speed)  
  12.     {  
  13.         this.XPos = x;  
  14.         this.YPos = y;  
  15.         this.SpeedX = speed;  
  16.     }  
  17.   
  18.     public override void Draw(Graphics g)  
  19.     {  
  20.         using (SolidBrush sbrush = new SolidBrush(Color.LightBlue))  
  21.         {  
  22.             Pen p = new Pen(Color.SaddleBrown);  
  23.             Rect = new Rectangle(XPos, YPos, 70, 15);  
  24.             g.DrawRectangle(p, Rect);  
  25.             g.FillRectangle(sbrush, Rect);  
  26.         }  
  27.         g.Dispose();  
  28.     }  
  29.  
  30.     #region ISabBoy 成员  
  31.     public void Run()  
  32.     {  
  33.         switch (Direction)  
  34.         {  
  35.             case BoardDirection.Left:  
  36.                 {  
  37.                     XPos -= SpeedX;  
  38.                 }  
  39.                 break;  
  40.             case BoardDirection.Right:  
  41.                 {  
  42.                     XPos+= SpeedX;  
  43.                 }  
  44.                 break;  
  45.             default:  
  46.                 break;  
  47.         }  
  48.     }  
  49.     #endregion  
  50. }  

下面到砖块类了:Brick.cs

砖块用Rectangle类实例化,但游戏总不能只有一块砖块吧,所以我们需要构造一大块墙壁-->List<Rectangle>,至于墙壁的形状是什么就由大家按自己爱好构造了,我这里构造的是一个倒金字塔墙壁:(图示一)

                             (图示一)

[c-sharp]  view plain copy print ?
  1. public class Brick : BaseEntity  
  2. {  
  3.     private int _width = 400; //砖块集宽  
  4.     private int _height = 300;//砖块集高  
  5.     //砖块集  
  6.     public List<Rectangle> Rects { get; set; }  
  7.     //构造砖墙形状  
  8.     public List<Rectangle> BrickWall()  
  9.     {  
  10.         int temp = 0;  
  11.         Rects = new List<Rectangle>();  
  12.         for (int i = 100; i < _height; i += 20)  
  13.         {  
  14.             temp += 20;  
  15.             for (int j = temp - 20; j < _width - temp; j += 30)  
  16.             {  
  17.                 Rect = new Rectangle(j, i, 28, 18);  
  18.                 Rects.Add(Rect);  
  19.             }  
  20.         }  
  21.         return Rects;  
  22.     }  
  23.     //画墙  
  24.     public override void Draw(Graphics g)  
  25.     {          
  26.         using (SolidBrush sbrush = new SolidBrush(Color.Orange))  
  27.         {  
  28.             g.Clear(Color.Black);  
  29.             Pen p = new Pen(Color.SaddleBrown, 3);  
  30.             foreach (Rectangle r in Rects)  
  31.             {  
  32.                 g.DrawRectangle(p, r);  
  33.                 g.FillRectangle(sbrush, r);  
  34.             }                 
  35.         }  
  36.         g.Dispose();  
  37.     }  
  38. }  
  

 

游戏里的对象基本构造完毕了,接下来只要处理它们之间的逻辑关系并显示到界面上即可完成!是不是迫不及待呢,下回分解!

C#模拟小球碰撞(图形界面) 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.Thr 阅读详情

相关推荐

unity 打砖块—休闲小游戏,摸鱼必备(完整代码)

unity 打砖块————休闲小游戏,摸鱼必备(附带完整代码)

weixin_59848198的博客 2822

C#小游戏之打砖块

打砖块 小游戏可以分为两步: 1.控制移动 2.控制射击 具体代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 控制左右移动/// </summary> public class Movement : Mono...

qq_41807260的博客 1856

从无到有写一个C#弹球小游戏(二)

父类写完之后,考虑子类应该怎么写。 最简单的子类:砖块类,砖块类基本上没有什么新的字段和方法,不过为了方便画图,我加了一部分常量字段。顺便说一句,C#里常量字段默认是静态的,可是操作常量字段的get和set访问器得自己显示的定义为静态。 上代码:using System.Drawing; namespace 弹球 { /// /// 方块:弹球世界中的矩形物体,被撞击后消失

在代码之海中遨游 2592

c#实现一个打砖块游戏step by step---开篇

一 引子 为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持。 二 游戏截图与说明 1. 游戏截图 2. 游戏说明: 蓝色砖块砖块为普通砖块,紫色砖块为特殊砖块,紫色砖块被打中后,会有一个奖励(小方块掉下来),挡板接到后可以发射子弹(单击空格键),子弹可以打坏普通方块。 3. 由以上描述可知,游戏中至少要定义以下对...

weixin_30650039的博客 346

从无到有写一个C#弹球小游戏(一)

弹球游戏也算是经典小游戏之一,这次我试着自己写一个弹球小游戏。 第一步先想一想这个游戏都有哪些要素:一个球,一个玩家控制的球拍,一系列砖块。他们都需要有哪些性质呢? 球:在屏幕上做直线移动,碰到别的东西反弹。 而反弹是什么呢,反弹就是改变速度方向。如果分解速度的话可以分解成x方向和y方向的速度,因为在这个游戏中球只可能碰到矩形物体,所以不考虑斜面。球只可能碰到与坐标轴平行的边

在代码之海中遨游 9619

Unity3D入门实战:从零开发2D打砖块小游戏,掌握游戏开发核心技能

游戏开发的核心在于理解物理引擎、碰撞检测与游戏逻辑的协同运作。Unity3D作为主流的跨平台游戏引擎,其内置的物理系统与组件化架构为开发者提供了强大的基础框架。通过实现一个经典的2D打砖块游戏,可以深入掌握刚体物理、碰撞响应、UI交互与对象生命周期管理等关键技术。这种实践不仅能够巩固C#编程能力,更能形成解决实际问题的工程思维。在开发过程中,合理运用对象池优化与精灵图集合批等技巧,能有效提升游戏性能,为后续开发更复杂的项目奠定坚实基础。本文以打砖块为例,详细拆解了从场景搭建、逻辑编写到性能优化的完整流程,是

weixin_29015483的博客 365

一个打砖块游戏算法

一个打砖块游戏算法 这里有一个打砖块游戏:小明面前有很多砖块,每个砖块上有一个字符,小明每击中一个砖块,会产生一个分值,而总分即这些分值总和。根据给定规则,算出小明的总成绩。

李子峰的专栏 4076

打砖块小游戏,C#源码

emmmmmmmmmmmmmmmmmmmmm 这是c#源码 上课老师教了编写的打砖块源码,感觉受益匪浅,自己改动了一部分,注释都挺详细的,希望能帮到别人 谢谢

c#打砖块小游戏之--构思篇(一)

本系列文章转载至hwenycocodq520      前言: 在校学习c#也有段时间了,也达到了所谓的简单程序会编,稍微复杂点的程序编起来有点费力,再复杂的程序就望而却步的水平,算是入门级水吧!徘徊于菜鸟级水平的我朝思暮想着能编写一款属于自己的NB程序,一款能供无数人使用的软件!但心急吃不了热豆腐,我还是乖乖打好基础再说吧,勿以小而不为,学这个不能浮躁,一步一个脚印还是必须的!

fa6507的专栏 3803

C#小游戏源码 吃豆人 飞机 打砖块

自已做的小游戏 还是刚刚接触C#的时候做的 里面包括 吃豆人 飞机 打砖块 和一个没做完的地图编辑器 小盛专辑 : D

用c#编写打砖块

内容详尽,简单易懂,可以用vs打开直接用,也有源代码

C#游戏编程:《控制台小游戏系列》之《八、爆破七色砖实例》

一、游戏分析   相信各位读者都曾玩过一款叫做《打砖块》的小游戏,和贪吃蛇一样,也是一款80后皆知的经典小游戏。游戏虽然简单但极富挑战性,这章的内容就是制作一款类打砖块的小游戏,继续说明和熟悉游戏框架的使用。和前几个小游戏不同,本章的小游戏有了一些进步,最明显的是有了关卡的概念,游戏不再是单调的一关,你可以自己设计自己所想要的关卡,这一定程度上提高了游戏的可玩性。但是这个游戏和前面的一样,也

fa6507的专栏 2133

c#打砖块游戏源码打砖块游戏源码

c#打砖块游戏源码c#打砖块游戏源码c#打砖块游戏源码c#打砖块游戏源码

c#打砖块小游戏之--逻辑界面层(三)

终于到了逻辑层,分析一下游戏中的逻辑关系: 小球与砖块碰撞检测、小球与挡板碰撞检测、判断游戏结束、积分规则等…… 物体碰撞检测方法很多,其中Rectangle结构中的public bool IntersectsWith(Rectangle rect)函数便是一种方法,此方法确定两个Rect是否相交!但我在测试过程中发现这方法并不是很准确,两物体碰撞时并不能立即作出反应,有时会出现"灵魂

fa6507的专栏 3486

打砖块游戏

打砖块 当球掉落并打破所有障碍时抓住球 特征 主菜单包括开始游戏,显示高分(h)或退出(q)的功能 流畅的动画和碰撞物理 在游戏中按'p'暂停,按SPACE继续(或继续下一个屏幕) 高分追踪器,可记住您在两次跑步之间的高分(高分保存在文件“ highscores.txt”中) 屏幕顶部显示当前得分和生活 通过导入“资源”目录或设计自己的游戏来玩我的预制游戏(规则说明如下) BIUOOP 特别感谢Bar-Ilan大学为我提供了使用其图形功能的方法(需要biuoop软件包才能正常工作) 关卡设计 为了设计自己的关卡,您将需要创建两种类型的文本文件: 每个级别的块定义文件,描述该级别使用的块的类型 1个级别的防御文件,描述所有级别的结构和参数 以您的水平定义文件的路径作为第一个参数运行程序,或者不使用任何参数运行以使用预制的水平 块定义文件格式 块定义文件将字符映射到间隔元素或块信息。

Cesium+Three.js融合实战:从零构建GIS与BIM一体化大场景

本文详细介绍了Cesium与Three.js融合技术在GIS与BIM一体化大场景中的应用实践。通过坐标系转换、双引擎协同渲染等核心技术,实现宏观地理信息与微观建筑细节的完美结合,为智慧城市、数字孪生等项目提供高效解决方案。文章包含环境配置、性能优化等实战经验,助力开发者快速掌握三维可视化开发技巧。

weixin_42563415的博客 262

控制台打砖块小游戏

然后是控制台小游戏———打砖块; 现在看来只是简单的逻辑操作,可是在那时确难了我足足好几个小时; 这里是对游戏中所需要用到的枚举的定义,玩家所拥有的一些属性的定义(结构体),游戏地图的定义, 现在看来当时讲的课已经开始向面向对象和数据操作方面改变。 1 // stdafx.h : 标准系统包含文件的包含文件, 2 // 或是经常使用但不常更改的 3 ...

aghe452077的博客 339

使用Java实现CRC16 MODBUS 格式校验

CRC16校验,测试如下 String str = "a5 98 03 00 00 5f c6 0f 7c 40 78 06 09 46 dc 6e db 00 16 3e 12 5c 98 00 19 98 0e 10 03 06 09 46 dc 6e db 03 0b bf 5f c6 0f 7c 43 bd b9 61 ee 96 76 99"; 校验规则: /** * CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结

weixin_45063710的博客 1315

Python、JavaScript、C#实现打砖块游戏:从语言特性到开发实战对比

游戏开发的核心在于将创意转化为可交互的体验,其基础通常围绕游戏循环、状态管理与碰撞检测等核心概念展开。从原理上讲,游戏循环驱动着画面更新与逻辑处理,而碰撞检测则决定了对象间的交互规则,这两者是构建任何游戏玩法的技术基石。在工程实践中,不同的编程语言和工具链会带来截然不同的开发体验与性能表现。例如,使用Python的Pygame库可以快速实现原型,其简洁的语法和过程式编程风格非常适合初学者理解游戏逻辑;而JavaScript结合HTML5 Canvas则能实现零配置的Web游戏开发,便于快速分享与迭代。这些技

weixin_34037173的博客 493

Hadoop在大数据领域的电商数据分析案例

随着电商行业的迅猛发展,每天都会产生海量的数据,如用户浏览记录、购买行为、商品信息等。如何从这些数据中提取有价值的信息,为电商企业的决策提供支持,成为了电商企业面临的重要问题。Hadoop作为一个开源的分布式计算平台,具有高可靠性、高扩展性和高效性等特点,能够很好地处理大数据。本文的目的就是通过实际案例,详细介绍Hadoop在电商数据分析中的应用,范围涵盖了从数据采集、存储到分析的整个流程。本文首先介绍背景信息,让读者了解Hadoop在电商数据分析中的重要性和应用场景。

Java大师兄的博客 1178

36 Agent Memory:如何让智能体记住该记的东西

Agent 会调用工具,只能说明它有了行动能力。要让它跨会话、跨任务持续工作,还需要一套可治理的 Memory 系统。本文讲清上下文窗口、RAG 和 Agent Memory 的区别,以及工作记忆、情景记忆、语义记忆、程序记忆该如何分层设计。

老于的笔记的专栏 89

C# WinForms开发打砖块游戏:从面向对象设计到碰撞检测实战

面向对象编程是构建复杂软件系统的核心范式,通过封装、继承和多态等特性实现代码复用与模块化。在游戏开发领域,这一范式尤为关键,它能够将游戏世界中的实体抽象为独立的对象类,并通过统一接口进行管理。C#语言凭借其简洁语法和强大的.NET框架支持,成为实现这一理念的理想选择,特别适合开发2D图形应用程序。WinForms作为经典的桌面UI框架,其事件驱动模型与游戏主循环天然契合,能够高效处理用户输入与画面渲染。通过开发打砖块这类经典游戏,开发者可以深入理解游戏循环、帧率无关动画以及碰撞检测等基础算法,并将这些知识应

weixin_30855099的博客 357

授时中心被攻击?Windows 11 电脑时间不准?手把手教您如何更换国内稳定高速的时间服务器(时间服务器整理)

近期授时中心被攻击,时间同步重要性凸显。Windows 11 默认服务器在国内常遇网络问题。本文教你轻松修改时间服务器,选择更稳定、快速的国内优质服务器,彻底解决电脑时间不准的烦恼,让你的系统时间永远精准如一!🚀

XiaoqiangClub的博客 1085
上一篇: c#打砖块小游戏之--构思篇(一)
下一篇: c#打砖块小游戏之--逻辑界面层(三)
fa6507
博客等级 码龄16年 84粉丝 1原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值