一个简单的俄罗斯方块实现
最近在看《.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),游戏中基本元素与游戏驱动的理解。
一个简单的俄罗斯方块实现相关推荐
- 用shell脚本写的一个简单的俄罗斯方块
用shell脚本写的一个简单的俄罗斯方块 代码 代码 测试 下载链接 代码 代码 #!/bin/bash #version 1.2,若非正常退出,请使用附带的killel.sh脚本杀死进程 #定义用于 ...
- 用C语言写一个简单的俄罗斯方块(基于Windows窗口编程)
目录 1. 列出需要的头文件,结构体,全局变量和函数 2. 设计窗口和显示窗口 3. 消息处理函数 4. 实现俄罗斯方块的主要功能 4.1 绘制图形 4.2 创建方块 4.3 方块下落 4.4 方块左 ...
- C++编写简单的俄罗斯方块游戏
代码地址如下: http://www.demodashi.com/demo/14593.html C++编写简单的俄罗斯方块游戏 使用C++编写一个简单的俄罗斯方块游戏. 1 环境要求 使用C++图形 ...
- 开发一个简易的俄罗斯方块小游戏
完整代码如下: import pygame import random import sys# 游戏设置 WINDOW_WIDTH = 400 WINDOW_HEIGHT = 500 GRID_WID ...
- pygame简单的俄罗斯方块游戏和简单的打字游戏
1.pygame简单的俄罗斯方块游戏 一.对战的方块管理 定义一个BlockManage管理对战的方块 根据BlockManage根据传入的玩家id返回方块,保证每个玩家拿到的方块序列是一致的,所以在 ...
- python编程制作接金币游戏_pygame学习笔记(6):完成一个简单的游戏
学了这么长时间的Pygame,一直想写个游戏实战一下.看起来很简单的游戏,写其来怎么这么难.最初想写个俄罗斯方块,想了很长时间如何实现,想来想去,也没写出来,于是干脆下载别人的代码来读.后来,要想写一 ...
- 分享一个蛋疼的俄罗斯方块小游戏
分享一个蛋疼的俄罗斯方块小游戏 空间 转载请注明出处.http://www.cnblogs.com/dave_cn/ 我在Ubuntu 10.04下测试过,可以正常运行.不过界面让人蛋疼. 代码用到了 ...
- js实现简单的俄罗斯方块小游戏
js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 `200px`,高为 `360px` 的背景容器 2. 在该容器上创建一个 `20 * 20` 的块元素 3. 控制该元素的移动,每次移动 ` ...
- 聊聊高并发(十六)实现一个简单的可重入锁
可重入锁指的是假设一个线程已经获得了一个锁,那么它能够多次进入这个锁,当然前提是线程须要先获得这个锁. 可重入锁是最常使用的锁.Java的内置锁就是可重入锁,使用synchronizedkeyword ...
最新文章
- Android第四十一天(3)
- 【团队】 冲刺一(4/10)
- linux编程下signal()函数
- 【PAT乙级】 1004 成绩排名 (20 分)
- Web系统开发构架再思考-前后端的完全分离
- JavaSE(三)——数组及继承
- android 一个很漂亮的控件ObservableScrollView(含片段代码和源码)
- 【0ms优化】剑指 Offer 18. 删除链表的节点
- CF590E-Birthday【AC自动机,最大独立集】
- 这种div高度自适应确定你知道吗?
- [2018.11.03 T2] 执行任务
- x86 android armv7,说说Android项目中的armeabi,armeabi-v7a和x86
- python实现截图转文字功能
- python opencv rgb值判断红色_Python-opencv实现红绿两色识别操作
- 词根词缀tort/tour/tox/tract/等词根衍生词汇
- 在控制台,打印出某个具体的变量,并监听其变化
- 神经网络算法处理器设计,神经网络是机器算法吗
- 黑马C++笔记——STL常用算法
- jit和jitx区别_JIT,JIS间的区别是什么?
- 使用YOLOv5实现多路摄像头实时目标检测