最近在看《.NET游戏编程入门经典 C#篇》 第一章介绍了如何制作俄罗斯方块,自己试了试按照书上的步骤,可算是完成了。

于是写下这篇文章留作纪念。

1.类的设计

在充分分析游戏的特点后,游戏大概可以分为3个类:Square 小正方形,Block 由4个小正方形组合成的一个图形, GameField 游戏的驱动引擎

2.代码的编写

按照从小到大,从简单到复杂的顺序,先完成Square类,Square很简单,只需要提供Show,Hide方法以及Size,Location属性。

接下来是Block,Block相对比较复杂,分为以下几种:

它应该有4个Square 编号可以按照个人习惯,当然之后计算坐标的时候也要根据个人的编号来进行。

Block应该有Hide,Show,Left,Right,Rotate一些方法,属性的话为了计算坐标 应该有Square的大小,还有Color

要注意的是Rotate方法将Block顺时针旋转90°,图上已经标出旋转的中心。

最后剩下的就是GameField了,他应该有一个数组,保存背景中所有的Square,以及哪些位置有Square的 位标志数组,对每一行的检查(是否消去得分)以及消去所有方块下移操作。

这些类完成后就可以简单的写游戏逻辑了,因为太简单就不说了,简单的贴一下代码

        private Block currentBlock;private Block nextBlock;private int score;private bool blockFalling;private void button1_Click(object sender, EventArgs e){pictureBox1.Refresh();currentBlock = new Block(new Point(GameField.Width / 2 * GameField.SquareSize, 0), Block.BlockTypes.Undefined);currentBlock.Show(GameField.WinHandle);nextBlock = new Block(new Point(15, 15), Block.BlockTypes.Undefined);nextBlock.Show(pictureBox2.Handle);timer1.Enabled = true;button1.Enabled = false;Focus();score = 0;}private void Form1_Load(object sender, EventArgs e){GameField.WinHandle = pictureBox1.Handle;GameField.BackColor = pictureBox1.BackColor;}private void Form1_KeyDown(object sender, KeyEventArgs e){if (currentBlock == null){return;}switch (e.KeyCode){case Keys.W:currentBlock.Rotate();break;case Keys.S:currentBlock.Down();break;case Keys.A:currentBlock.Left();break;case Keys.D:currentBlock.Right();break;}}private void timer1_Tick(object sender, EventArgs e){if (!currentBlock.Down()){blockFalling = false;//塞满了 游戏结束  0 0if (currentBlock.Top() == 0){timer1.Enabled = false;button1.Enabled = true;GameField.Reset();MessageBox.Show("恭喜你跪了");return;}}else{blockFalling = true;}if (!blockFalling){//检查得分int earseCount = GameField.CheckLines();if (earseCount > 0){score += earseCount * 20;label1.Text = score.ToString();//使图片框重绘 清楚BlockpictureBox1.Invalidate();Application.DoEvents();GameField.Redraw();}pictureBox2.Invalidate();Application.DoEvents();currentBlock = new Block(new Point(GameField.Width / 2 * GameField.SquareSize, 0), nextBlock.BlockType);currentBlock.Show(GameField.WinHandle);nextBlock = new Block(new Point(15, 15), Block.BlockTypes.Undefined);nextBlock.Show(pictureBox2.Handle);blockFalling = true;}}private void Form1_Activated(object sender, EventArgs e){GameField.Redraw();if (nextBlock !=null)nextBlock.Show(pictureBox2.Handle);}

3.总结

这个简单的游戏,可谓是刚好适合新手。可以学到冲突检测(CheckLines),游戏中基本元素与游戏驱动的理解。

一个简单的俄罗斯方块实现相关推荐

  1. 用shell脚本写的一个简单的俄罗斯方块

    用shell脚本写的一个简单的俄罗斯方块 代码 代码 测试 下载链接 代码 代码 #!/bin/bash #version 1.2,若非正常退出,请使用附带的killel.sh脚本杀死进程 #定义用于 ...

  2. 用C语言写一个简单的俄罗斯方块(基于Windows窗口编程)

    目录 1. 列出需要的头文件,结构体,全局变量和函数 2. 设计窗口和显示窗口 3. 消息处理函数 4. 实现俄罗斯方块的主要功能 4.1 绘制图形 4.2 创建方块 4.3 方块下落 4.4 方块左 ...

  3. C++编写简单的俄罗斯方块游戏

    代码地址如下: http://www.demodashi.com/demo/14593.html C++编写简单的俄罗斯方块游戏 使用C++编写一个简单的俄罗斯方块游戏. 1 环境要求 使用C++图形 ...

  4. 开发一个简易的俄罗斯方块小游戏

    完整代码如下: import pygame import random import sys# 游戏设置 WINDOW_WIDTH = 400 WINDOW_HEIGHT = 500 GRID_WID ...

  5. pygame简单的俄罗斯方块游戏和简单的打字游戏

    1.pygame简单的俄罗斯方块游戏 一.对战的方块管理 定义一个BlockManage管理对战的方块 根据BlockManage根据传入的玩家id返回方块,保证每个玩家拿到的方块序列是一致的,所以在 ...

  6. python编程制作接金币游戏_pygame学习笔记(6):完成一个简单的游戏

    学了这么长时间的Pygame,一直想写个游戏实战一下.看起来很简单的游戏,写其来怎么这么难.最初想写个俄罗斯方块,想了很长时间如何实现,想来想去,也没写出来,于是干脆下载别人的代码来读.后来,要想写一 ...

  7. 分享一个蛋疼的俄罗斯方块小游戏

    分享一个蛋疼的俄罗斯方块小游戏 空间 转载请注明出处.http://www.cnblogs.com/dave_cn/ 我在Ubuntu 10.04下测试过,可以正常运行.不过界面让人蛋疼. 代码用到了 ...

  8. js实现简单的俄罗斯方块小游戏

    js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 `200px`,高为 `360px` 的背景容器 2. 在该容器上创建一个 `20 * 20` 的块元素 3. 控制该元素的移动,每次移动 ` ...

  9. 聊聊高并发(十六)实现一个简单的可重入锁

    可重入锁指的是假设一个线程已经获得了一个锁,那么它能够多次进入这个锁,当然前提是线程须要先获得这个锁. 可重入锁是最常使用的锁.Java的内置锁就是可重入锁,使用synchronizedkeyword ...

最新文章

  1. Android第四十一天(3)
  2. 【团队】 冲刺一(4/10)
  3. linux编程下signal()函数
  4. 【PAT乙级】 1004 成绩排名 (20 分)
  5. Web系统开发构架再思考-前后端的完全分离
  6. JavaSE(三)——数组及继承
  7. android 一个很漂亮的控件ObservableScrollView(含片段代码和源码)
  8. 【0ms优化】剑指 Offer 18. 删除链表的节点
  9. CF590E-Birthday【AC自动机,最大独立集】
  10. 这种div高度自适应确定你知道吗?
  11. [2018.11.03 T2] 执行任务
  12. x86 android armv7,说说Android项目中的armeabi,armeabi-v7a和x86
  13. python实现截图转文字功能
  14. python opencv rgb值判断红色_Python-opencv实现红绿两色识别操作
  15. 词根词缀tort/tour/tox/tract/等词根衍生词汇
  16. 在控制台,打印出某个具体的变量,并监听其变化
  17. 神经网络算法处理器设计,神经网络是机器算法吗
  18. 黑马C++笔记——STL常用算法
  19. jit和jitx区别_JIT,JIS间的区别是什么?
  20. 使用YOLOv5实现多路摄像头实时目标检测

热门文章

  1. 例题 - 最近公共祖先 - 离线算法
  2. Springboot RestTemplate post/get请求所有情况
  3. ios 常用的30个动画效果
  4. RabbitMQ服务启动就自动停止解决方案
  5. 怎么调用微信自带的收货地址和我的地址功能页面。
  6. windows7、10磁盘分区以及磁盘扩展(详细教程以及注意事项)
  7. 一个简单的jxl文件上传功能
  8. android软键盘enter键
  9. 公司企业邮箱登陆客户端,邮件服务器如何设置?
  10. 如何统计多个Excel文件中的信息,统计多个工作簿中的数据,统计多个表格中相同的条,统计多个表格的和等等