关于一个大一学生的俄罗斯方块项目分享C#开发,附源码(一)

2023-11-19

本人为一双非大一计科新生,这是我第一篇文章,能力一般,水平有限,能在各位大佬面前弄斧,不胜荣幸。


事情是这样的:

我寒假买了一个3ds掌机,玩了里面很多游戏,其中最令我着迷的就是俄罗斯方块。说实话以前也玩过,但不知怎么就上瘾了,沉迷于刷分,什么马里奥、口袋妖怪在此游戏面前黯然失色。
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbWFtYXdoZXM=,size_20,color_FFFFFF,t_70,g_se,x_16
(目前经典模式是12800分,消了131行,不服来战)

因为寒假学了c#嘛,就想用c#复刻一款俄罗斯方块出来,一来满足我在pc上玩俄罗斯方块的愿望,二来检验一下学习成果。
因为想挑战一下自己,所以没有看任何有关俄罗斯方块算法的东西,所以以下内容均本人原创,算法可能不是最好的,如果有大佬能有更好的办法,欢迎在评论区告诉我
游戏效果视频见下方视频,别忘了一键三连嗷

BV19b4y1p77A
好了屁话不多说了,我们开始吧!

 

 


关于画面
是窗体程序嘛,肯定要有画面。我在此之前就学了半个小时gdi绘图,然后就把相关函数写出来了,所以我就不做过多赘述。简单说一下需求,三个函数,首先是画方格函数,这个我gdi看了五分钟就写出来了,最简单

public void DrawBoard()
        {
                Graphics board = this.CreateGraphics();
                Pen pen = new Pen(Brushes.Gray);
            
            //画10x20棋盘
            for (byte i = 0; i <= 20; i++)
                {
                    Point p00 = new Point(xOy_x, xOy_y + size * i);
                    Point p01 = new Point(xOy_x + size * 10, xOy_y + size * i);
                    board.DrawLine(pen, p00, p01);
                }
                for (byte i = 0; i <= 10; i++)
                {
                    Point p00 = new Point(xOy_x + size * i, xOy_y);
                    Point p01 = new Point(xOy_x + size * i, xOy_y + size * 20);
                    board.DrawLine(pen, p00, p01);
                }
        }


然后是画下落对象的函数,我这里建了一个Tpoint类,要传入一个Tpoint类数组(就是4个坐标)

public class Tpoint//Tpoint类数组
    {
       public int x;
       public int y;
    }
public void MoveBlock(GO type,Tpoint[] point4)
        {
            for (byte i=0;i<4;i++)
           DrawOneMoveBlock(type,(byte)point4[i].x, (byte)point4[i].y); 
        }
public void DrawOneMoveBlock(GO gameObject, byte x, byte y)
        {
            if (y >= 4)
            {
             y -= 4;
            Graphics centureBlock = this.CreateGraphics();
            Brush brush;
            switch(gameObject)
            {
                case GO.I:brush = Brushes.Cyan;break;
                case GO.L:brush = Brushes.Magenta;break;
                case GO.O:brush = Brushes.Yellow;break;
                case GO.Z:brush = Brushes.DeepSkyBlue;break;
                case GO.T:brush = Brushes.DarkOrchid;break;
                case GO.tL: brush = Brushes.OrangeRed;break;
                case GO.tZ: brush = Brushes.SpringGreen;break;
                default:brush = Brushes.Black;break;
            }
            Pen blockPen = new Pen(brush);
            Rectangle rectangle = new Rectangle(xOy_x + x * size , xOy_y + y * size , size , size );
            centureBlock.DrawRectangle(blockPen, rectangle);
            }
            

(这里的颜色和掌机里的颜色是对应的)
最后是画固定方块的函数,传入的是一个bool类二维数组

public void StaticBlock(bool[,] array)     
        {
            for (byte i = 0; i < 20; i++)
                for (byte j = 0; j < 10; j++)
                    if (array[i, j])
                        DrawOneExtenBlock(j, i);
        }
public void DrawOneExtenBlock(byte x,byte y)
        {
            Graphics centureBlock = this.CreateGraphics();
            Pen blockPen = new Pen(Brushes.Lime);
            Point p1 = new Point(xOy_x + x * size + 1, xOy_y + y * size + 1);
            Point p2 = new Point(xOy_x + (x + 1) * size - 1, xOy_y + y * size + 1);
            Point p3 = new Point(xOy_x + x * size + 1, xOy_y + (y + 1) * size - 1);
            Point p4 = new Point(xOy_x + (x + 1) * size - 1, xOy_y + (y + 1) * size - 1);
            centureBlock.DrawLine(blockPen, p1, p4);
            centureBlock.DrawLine(blockPen, p2, p3);
            Rectangle rectangle = new Rectangle(xOy_x + x * size + 1, xOy_y + y * size + 1, size - 2, size - 2);
            centureBlock.DrawRectangle(blockPen, rectangle);

        }

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbWFtYXdoZXM=,size_19,color_FFFFFF,t_70,g_se,x_16

 固定方块效果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbWFtYXdoZXM=,size_19,color_FFFFFF,t_70,g_se,x_16
下落对象效果
 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于一个大一学生的俄罗斯方块项目分享C#开发,附源码(一) 的相关文章

  • 没有配置身份验证处理程序来处理该方案

    这是一个非常烦人的问题 我在我的 asp net core 项目上设置 cookie 身份验证 有时会出现此错误 有时不会 没有图案 它只是开始抛出错误 然后突然停止 然后再次开始 例外情况是 InvalidOperationExcepti
  • 二叉树和快速排序?

    我有一个家庭作业 内容如下 别生气 担心 我是not请你帮我做作业 编写一个程序 通过使用二分查找的快速排序方法对一组数字进行排序 树 推荐的实现是使用递归算法 这是什么意思 到目前为止 这是我的解释 正如我在下面解释的那样 我认为两者都有
  • 以编程方式更新 Wifi 网络

    我正在尝试创建一个程序 当某个 wifi 网络在范围内时 该程序会连接到该网络 即使已经连接到另一个 wifi 也是如此 我在用着简单Wifi https github com DigiExam simplewifi 基本上效果很好 除了在
  • 如何在单例类和未命名类之间进行选择?

    我会使用这样的单例 Singleton single Singleton instance single gt do it 我会使用这样的未命名类 single do it 我觉得单例模式除了具有可读的错误消息之外 与未命名的类相比没有任何
  • R 包与 Rcpp 的链接错误:“未定义符号:LAPACKE_dgels”

    我正在创建一个 R 包 lapacker 以使用 R API 头文件 R ext Lapack h 为 R 提供和使用的内部 LAPACK 库 仅具有双精度和双复数 提供 C 接口 源代码 https github com ypan1988
  • 如何在 C++11 中返回类成员向量

    我读了几篇关于如何从方法返回向量的文章 其中包括 c11 右值和移动语义混淆返回语句 https stackoverflow com questions 4986673 c11 rvalues and move semantics conf
  • 来自同一基模板类的 C++ 重写函数,具有多重继承不明确的函数调用

    我需要打电话init int iNumber 从基类派生的函数 基类 h pragma once include stdafx h template
  • 向客户端发送状态码 500 时页面未呈现

    我有一个页面 通用处理程序 我想在该页面上向客户端返回状态代码 500 以指示出现问题 我这样做 Response StatusCode 500 Response StatusDescription Internal Server Erro
  • 如何使用 itextsharp 更改 PDF 公式的按钮图标?

    我目前正在尝试使用 itextsharp 填写预定义的表单 除了添加图像之外 一切正常 这之前已经在 Adob e 的 FDF 工具包中运行过 该工具包已编译为 NET 1 1 这不再适用于 NET 4 0 我改用了 itextsharp
  • 如何通过分解 y 轴来减小 mschart 的高度

    如何降低 mschart 的高度 如下所示 编辑 就我而言 我不想查看中断图表 this chart1 ChartAreas 0 AxisY ScaleBreakStyle Enabled false 您似乎正在寻找AxisY ScaleB
  • 为什么 C# 中的命名空间允许循环依赖?

    在 c 中 您可以在文件 a cs 其命名空间为 MyApp A 中拥有一条语句 using MyApp B 而文件 b cs 其名称空间为 MyApp B 已经包含该语句 using MyApp A 如果类似的依赖关系存在于不同的 dll
  • Qt - 添加超链接到对话框

    有没有办法在 Qt 对话框中添加可点击的超链接 IE 它应该看起来像一个超链接 蓝色文本 当您单击它时 它应该在浏览器中打开该超链接 像这样的东西 Use QLabel setOpenExternalLinks bool 并在标签上设置文本
  • ArrayList 有什么问题?

    最近我问了一个关于 SO 的问题 其中提到了可能使用 c ArrayList 来解决问题 有人评论说使用数组列表不好 我想了解更多有关此的信息 我以前从未听说过关于数组列表的这种说法 有人可以带我了解使用数组列表可能出现的性能问题吗 C n
  • 使用 StartServiceCtrlDispatcher 与 StartService 从 C 语言启动 Windows 服务有什么区别?

    我尝试使用 StartServiceCtrlDispatcher 中所述https msdn microsoft com en us library windows desktop bb540475 v vs 85 aspx https m
  • C 中的 2 个字符要短

    我有2个字符 Char 128和查尔2 如何将这些字符转为 Short640 in C 我试过了 unsigned short getShort unsigned char array int offset short returnVal
  • asio::this_coro::executor 的实现是什么

    在协程函数中 我们可以添加auto ex co await asio this coro executor 获取该协程的执行者 但当我想了解它的定义时 我发现了这个 Awaitable type that returns the execu
  • 使用属性和性能

    我正在优化我的代码 我注意到使用属性 甚至自动属性 对执行时间有深远的影响 请参阅下面的示例 Test public void GetterVsField PropertyTest propertyTest new PropertyTest
  • 将“C# 友好类型”名称转换为实际类型:“int” => typeof(int)

    我想得到一个System Type给定一个string指定 原始 类型C 友好名称 基本上与 C 编译器读取 C 源代码时的方式相同 我觉得描述我所追求的最好方式是单元测试的形式 我希望存在一种通用技术 可以使以下所有断言通过 而不是尝试对
  • 如何正确处置注入的DLL线程?

    我将一个 DLL 注入到目标进程中 以在玩 MMORPG 时充当助手 当前功能将按键转换为鼠标点击 因为 MMORPG 要求用户移动鼠标才能实现某些功能 这是我所鄙视的 假设我出于某种原因想要取消注入 DLL 我该怎么做呢 这个方法干净吗
  • 为什么在一行中使用这个 C++ 函数两次会导致编译错误?

    我在尝试在 Visual C 2010 中实现智能相等测试宏类型模板函数时遇到了一些麻烦 该函数与VS 中关于模板函数默认参数的错误 https stackoverflow com questions 10343177 why do i g

随机推荐

  • Ubuntu 安装 Tensorflow-gpu 与 Keras

    为深度学习所用 博主预想在Ubuntu16 04上安装 显卡驱动 CUDA cuDNN Tensorflow gpu Keras PyCharm 参考了众多资料 最终成功将所有软件安装完毕 且能成功运行使用 该篇博客介绍了Tensorflo
  • matlab求二元函数极值算法_高等数学下册(部分)复习——知识点:多元函数微分方法及其应用...

    空间解析几何与向量代数的部分就不说了 比较简单 以几道例题练一练就差不多了 首先从第九章 多元函数微分方法及其应用说起 01 多元微分 理论 要学习多元 我们首先要从一元开始 一元的学会了 就能够类比得到多元的结论 在理论部分 首先要介绍一
  • WIN10系统MYSQL的下载与安装详细教程

    前两天ubuntu下安装mysql遇到了一些依赖问题 结果解决了半天 没解决好 还把我的系统搞坏了 小白破坏力好强 到现在我的ubuntu也没装好 电脑驱动的问题 联想小新310一装ubuntu 进去就卡 原来禁用原先的显卡驱动 可是 第二
  • win10 Enable developer Mode

    经过漫长的安装过程 win10终于装上了vs2015 rc 写个小程序试试 结果提示 根据提示打开 设置 更新 for developer 据说应该有这么个界面 但是这个界面根本出不来 直接闪退的说 翻 MSDN 终于翻出了解决方法 htt
  • ChatGPT启示录: 智能、推理的本质是什么?神经网络既是推理机,也是知识规则库?

    多种因素让人类对自身的智力产生了一种自信 毕竟这个世界上其他生物没有我们大脑发达 智力似乎是上天给人类的独有礼物 作为孩子的父母 老师说孩子不努力似乎是可以接受的 但是说自己娃娃笨是极其羞辱的 类似的 让很多人不能接受的是 机器人可以算得比
  • 学习笔记(三):Java中的List集合——ArrayList、LinkedList、Vector、Stack、CopyOnWriteArrayList

    目录 引言 一 List简介 二 常用List实现类 一 ArrayList 二 LinkedList 三 LinkedList和ArrayList的比较 三 其他List实现类 一 Vector 二 Stack 三 CopyOnWrite
  • Java安装、Java环境配置,以及我的第一个Java程序(win11)

    Java环境配置 下载OpenJDK Windows11 1 进入Oracle Java Downloads 2 下载 ZIP文件 3 解压到适合的位置 注意 路径最好是英文字母 配置环境变量 1 Win I打开系统设置 2 下拉到最底下选
  • vuejs 制作摄像头_VueJs的网络摄像头组件

    vuejs 制作摄像头 网络摄像头 vue web cam Webcam component for VueJs VueJs的网络摄像头组件 安装 Installation npm install vue web cam save yarn
  • 【Python】python logging模块打印log到指定文件

    可能我们经常会使用print来输出信息到窗口 但当我们有很多个py文件需要运行 项目比 较庞大的到时候 print简直就是太low了点了 那么我们可以使用强大的logging模块 把 输出到指定的本地pc某个路径的文件中 一 logging
  • 把字符串转换成整数(字符串)

    题目描述 将一个字符串转换成一个整数 要求不能使用字符串转换整数的库函数 数值为0或者字符串不是一个合法的数值则返回0 输入描述 输入一个字符串 包括数字字母符号 可以为空 输出描述 如果是合法的数值表达则返回该数字 否则返回0 思路一 p
  • 什么是体素(Voxel)

    复制粘贴的知乎 题图中是3D数据的不同表示类型 a 点云 Point clouds b 体素网格 Voxel grids 多边形网格 Polygon meshes d 多视图表示 Multi view representations 其中
  • 超参数选择:网格搜索GridSearchCV

    Grid Search 网格搜索 在所有候选的参数选择中 通过循环遍历 对每一种可能的参数在训练集上训练一个模型 在测试集上表现最好的参数就是最优的参数 模型最终的表现好坏与初始数据训练集和测试集的划分有很大的关系 测试集数据没有被训练 可
  • javaweb 解出与svn 服务器的绑定。

    情况描述 今天在上传项目时 误传项目的上传路径 解决办法 先移除在VisualSVN Server服务器上的相关目录 在客户端移除项目与VisualSVN Server的绑定关系 示例截图 第一步 断开与svn 服务器连接 第二步 清除sv
  • python中 for i in range(10)_Python for i in range ()用法详解

    for i in range 作用 range 是一个函数 for i in range 就是给i赋值 比如 for i in range 1 3 就是把1 2依次赋值给i range 函数的使用是这样的 range start stop
  • 树莓派学习(三):安装pytorch并验证

    树莓派学习 三 安装pytorch并验证标题 步骤一 创建一个虚拟环境 步骤二 安装pythorch 步骤三 测试 彩蛋 步骤一 创建一个虚拟环境 conda create name pytorchcpu python 3 9 10 如果需
  • java中null和isEmpty的区别

    isEmpty 分配了内存空间 值为空 是绝对的空 里面的值为空 分配了内存空间 值为空字符串 是相对的空 里面的值为空 null 未分配内存空间 没有值 是一种无值 值不存在 结论 null只能分辨出值是否分配内存空间 isEmpty不能
  • 7.1 大学排行榜分析(project)

    大学排名没有绝对的公正与权威 文件 alumni txt soft txt 中为按照不同评价体系给出的国内大学前100名排行 对比两个排行榜单前m的学校的上榜情况 分析不同排行榜排名的差异 输入输出 第一行输入1 第二行输入m 输出在alu
  • Linux下安装Redis

    redis安装和配置 1 安装 下载安装包 上次课前资料提供的安装包 或者 官网下载 建议上传到我们的home下 home leyou 解压 tar xvf redis 4 0 9 tar gz 编译安装 mv redis 4 0 9 re
  • VMware虚拟机安装CentOS7 Linux教程一篇笔记搞定(超详细)

    VMware虚拟机CentOS7教程篇 自己在网上找了好多资源 结果发现都不全面 教完安装CentOS7系统之后就没有下文了 网络配置 虚拟机网络ip修改地址等等都没有 想想自己还是出一篇比较详细的CentOS7安装教程吧 创作不易 感觉对
  • 关于一个大一学生的俄罗斯方块项目分享C#开发,附源码(一)

    本人为一双非大一计科新生 这是我第一篇文章 能力一般 水平有限 能在各位大佬面前弄斧 不胜荣幸 事情是这样的 我寒假买了一个3ds掌机 玩了里面很多游戏 其中最令我着迷的就是俄罗斯方块 说实话以前也玩过 但不知怎么就上瘾了 沉迷于刷分 什么