我们知道俄罗斯方块有以下的图形
■■(1) ■■■■(2)■■■(3)■■■(4)■■■(5)■■□(6)□■■(7)
■■(1) □□□□(2)■□□(2)□□■(4)□■□(5)□■■(6)■■□(7)
□□□ ■ (8) ■□(9) ■■(A) ■□(B) □■(C) ■□(D)
□□□ ■ (8) ■□(9) ■□(A) ■■(B) ■■(C) ■■
□□□ ■ (8) ■■(9) ■□(A) ■□(B) ■□(C) □■
□□□ ■ (8)
□□□□□□□□□□□■(E) ■□□(F) □■□(H)
□□□□□□□□□■■■(E) ■■■(F) ■■■(H)
□□□□□□□□□ ■■(I) □■(J) □■(K)
□□□□□□□□□ □■(I) □■(J) ■■(K)
□□□□□□□□□ □■(I) ■■(J) □■(K)
这里的编号用字母没有任何特殊意义主要是10~19是2位数不利于排版
□也是为了排版因为空格在显示的时候和我编辑的时候不一样宽
我们看到共有19种图形,我们有两种方法实现,一种就是图形并没有旋转只是改变图形的编码比如图形2旋转后就将图形编号改成7,另外一种是做到真正的旋转,好处是实现,这种真正的旋转的好处是可以应付特殊图形大家知道俄罗斯有变种俄罗斯里面有
■■■
□■□
□■□
这种图形 有后面的方法可以轻松实现你只要将前面分pb数组的元素个数改成9就可以对付
■■■
■■■
■■■
中能产生的任意变种,淡然5*5甚至10*10是你能想到的任意图形矩阵也可以移植到别到程序中^_^(比如玛丽医生,活活)-我们用
■■
■
■
来讲解怎样计算(要使用到一些几何知识)
首先我们要使用几何中的象限来考虑问题
假设上面的图形是第一象限的 1~4象限按照逆时旋转得到那么分别是
■■□■□□□□■□□□□□
■□□■■■□□■□■■■□
■□□□□□□■■□□□■□
放入象限后是这样,假设红点是参考点(也是原点)红色和4个颜色分别组合就是在这个象限到图形到样子我们来寻找规律吧Let's GO!
□□■■□
■□■□□
■■■■■
□□■□■
□■■□□
我们从第一象限入手以红色为参考点 绿色为考察点
■■□■□□
■□□■■■
■□□□□□
请配合上面点4色象限图听我讲解|
在第一象限中X(绿)=X(红) + x; Y(绿) = Y(红) + 2y;
在第二象限中X(绿)=X(红) -2y; Y(绿) = Y(红) + x;
我们再看看这个图形
□□□□■□□□□■□■■□
■■■□■□□■■■□□■□
■□□□■■□□□□□□■□
□■□□□
□■■■■
□■■■□
■■■■□
□□□■□
这个4个象限图看起来有点累呵呵,不过按颜色区分还是能分出来的
□□□□■□
■■■□■□
■□□□■■|
在第一象限中X(绿) = (红) + 2x; Y(绿) = Y(红) + y;
在第二象限中X(绿)=X(红) -y; Y(绿) = Y(红) + 2x;
呵呵发现顾虑每假设第一象限中参考点和考察点的X轴坐标差为aY坐标差为b
在第一象限中X(绿)=X(红) + a; Y(绿) = Y(红) + b;//为什么都是+...肯定的以为第一象限的任意一点的横纵坐标都>=0
在第二象限中X(绿)=X(红) -b; Y(绿) = Y(红) + a;//因为横坐标<=0 纵坐标>=0
在这样的前提下我们开始大胆的猜想第三象限的公式
在第三象限中X(绿)=X(红) -a; Y(绿) = Y(红) - b;//因为横坐标<=0 纵坐标<=0
在第二象限中X(绿)=X(红) +b; Y(绿) = Y(红) -a;//因为横坐标>=0 纵坐标<=0
呵呵到此我们已经的到了旋转到公式,当然要带入别到图形进行验证,测试结果完全正确,那么旋转规律就是他了 现在我们要作到是将他们用代码实现并封装到方法中去,,这里就是一个逻辑到实现方法我这里就直接给出代码了好现在来看看这个finish()方法-
public void finish()

...{
//对4个移动图形组的成员进行遍历判断
for (int i = 0; i < 4; i++)

...{
//求出当前组件所在的行(游戏里面的行)
int y = (pb[i].Location.Y - 20) / 10;
if(y>1)

...{
if (CheckLine(y))

...{
//消除y所在的行
ClareLine(y);
}
}
}
}
private bool CheckLine(int y)

...{
// MessageBox.Show(y + "," + (y - 1));
for (int i = 0; i < 20; i++)

...{
if(oldpb[20*y+i]==null)
return false;
}
return true;
}

看了上面的两个方法应该知道怎么判断了吧 就是判断pb中没个元素所在的行(还可以进行优化的...就是当多个图形在同一行时只检查该行一次,对于现在的计算机而言 知识检查20个数组元素是否==null,我懒得优化了)这样我们这个俄罗斯方块的类所有的方法基本全部实现了,对了把那个黑箱子给你checkPes()
private bool checkPes(Point p)

...{
int x=p.X;
int y=p.Y;
//检查坐标是否越界
if (p.X < 10 || p.X > 200) return false;
//检查是否重叠
if (pb[0].Location.Y > 10 && pb[1].Location.Y > 10 && pb[2].Location.Y > 10 && pb[3].Location.Y > 10&&y>20)

...{
if (oldpb[(y - 20) / 10 * 20 + (x - 10) / 10] != null) return false;
}
return true;
}好了 关键代码我也将的差不多了,在下里面将给出所有的源代码
//四个象限的旋转方法
private void Roll1()//在第一象限转第二象限

...{
for (int i = 1; i < 4; i++)

...{
int x = System.Math.Abs(pb[0].Location.X - pb[i].Location.X);
int y = System.Math.Abs(pb[0].Location.Y - pb[i].Location.Y);
pb[i].Location = new Point(pb[0].Location.X - y, pb[0].Location.Y - x);
}
//如果坐标越界就进行反旋转
if (pb[0].Location.X > 200 || pb[1].Location.X > 200 || pb[2].Location.X > 200 || pb[3].Location.X > 200) Roll4();
if (pb[0].Location.X < 0 || pb[1].Location.X < 0 || pb[2].Location.X < 0 || pb[3].Location.X < 0) Roll4();
}
private void Roll2()//在2转3

...{
for (int i = 1; i < 4; i++)

...{
int x = System.Math.Abs(pb[0].Location.X - pb[i].Location.X);
int y = System.Math.Abs(pb[0].Location.Y - pb[i].Location.Y);
pb[i].Location = new Point(pb[0].Location.X - y, pb[0].Location.Y + x);
}
//如果坐标越界就进行反旋转
if (pb[0].Location.X < 0 || pb[1].Location.X < 0 || pb[2].Location.X < 0 || pb[3].Location.X < 0) Roll1();
if (pb[0].Location.X > 200 || pb[1].Location.X > 200 || pb[2].Location.X > 200 || pb[3].Location.X > 200) Roll1();
}
private void Roll3()//在3转4

...{
for (int i = 1; i < 4; i++)

...{
int x = System.Math.Abs(pb[0].Location.X - pb[i].Location.X);
int y = System.Math.Abs(pb[0].Location.Y - pb[i].Location.Y);
pb[i].Location = new Point(pb[0].Location.X + y, pb[0].Location.Y + x);
}
//如果坐标越界就进行反旋转
if (pb[0].Location.X < 0 || pb[1].Location.X < 0 || pb[2].Location.X < 0 || pb[3].Location.X < 0) Roll2();
if (pb[0].Location.X > 200 || pb[1].Location.X > 200 || pb[2].Location.X > 200 || pb[3].Location.X > 200) Roll2();
}
分享到:
相关推荐
【C#版俄罗斯方块视频教程】是一套深入解析如何使用C#编程语言实现经典游戏——俄罗斯方块的教育资源。教程通过多个视频章节,详细介绍了游戏开发的全过程,旨在帮助初学者和有一定C#基础的开发者理解游戏编程的基本...
本篇将详细讲解如何使用C#来创建一款经典的俄罗斯方块游戏,同时,提供源代码供学习者参考。 首先,我们了解下俄罗斯方块的基本概念。俄罗斯方块是一款流行的电子游戏,玩家需要控制各种形状的方块,让它们在屏幕...
在本文中,我们将深入探讨如何使用C#编程语言实现经典的电子游戏——俄罗斯方块。这个项目对于初学者来说是一个很好的起点,因为它涉及到基础的游戏逻辑、图形用户界面(GUI)设计以及事件处理。以下是对实现俄罗斯...
通过本文,我们可以学习到使用 C# 语言实现俄罗斯方块游戏的知识点,包括 BackgroundWorker、Action 委托、TableLayoutPanel 等技术,了解俄罗斯方块的流程图和效果图,掌握俄罗斯方块的核心代码,包括定义方块的...
本篇文章将详细讲解如何利用C#实现经典游戏——俄罗斯方块的完整代码实现,带你深入理解游戏逻辑和C#编程技巧。 首先,我们要了解俄罗斯方块的基本规则。游戏的核心是各种形状的“方块”,它们从屏幕顶部随机落下,...
在本例中,它可能是包含陈广老师讲解的动态教程,让学习者能够直观地看到代码实现的过程。 通过学习《陈广C#制作俄罗斯方块7》,开发者不仅可以掌握C#编程基础,还能深入理解游戏开发中的逻辑思维和问题解决能力,...
本项目“一个简单的C#俄罗斯方块”是一个很好的实例,展示了如何利用C#的基础知识和游戏开发原理来创建一个经典的休闲游戏——俄罗斯方块。本文将详细讲解这个项目中的关键知识点。 1. **C#基础知识**:项目首先...
《C#编程实现俄罗斯方块详解》 在编程领域,经典游戏俄罗斯方块因其简单而富有挑战性,一直是初学者和资深开发者喜爱的项目之一。本文将以C#语言为基础,详细解析如何实现这一游戏,旨在帮助读者理解C#编程基础以及...
在本课程"C#语言基础-小游戏俄罗斯方块制作视频讲解"中,我们将深入学习C#编程语言的基础,并通过实际操作来构建经典游戏——俄罗斯方块。这个教程旨在帮助初学者更好地理解和掌握C#语言的核心概念,同时提升他们的...
本篇将详细讲解基于C#实现的俄罗斯方块源代码,这对于那些希望深入理解C#编程、游戏开发或者想要学习如何构建经典游戏的开发者来说,是一份极好的学习资源。 首先,俄罗斯方块是一款经典的休闲益智游戏,其基本原理...
在本教程中,我们将深入探讨如何使用C#编程语言实现经典游戏——俄罗斯方块。"俄罗斯方块C#讲解part6"是由陈广老师主讲的一系列教程的一部分,旨在帮助开发者掌握C#的基础知识以及如何将这些知识应用于游戏开发。 ...
在本节"俄罗斯方块C#讲解part8"中,我们将会深入探讨如何利用C#编程语言来实现经典游戏——俄罗斯方块。陈广老师以其清晰的思路和详尽的讲解,将带领我们逐步构建这个游戏。 首先,我们需要理解C#的基础语法和面向...
【标题】"C#俄罗斯方块游戏源码.rar"是一个基于C#编程语言实现的俄罗斯方块游戏的源代码集合。这个压缩包包含了用于构建一个完整的俄罗斯方块游戏的所有必要文件,让学习者或者开发者能够深入理解游戏的内部机制。 ...
本教程以陈广老师的教学全集为蓝本,主要针对初学者,深入浅出地讲解如何使用C#来实现经典游戏——俄罗斯方块的制作。通过这个项目,你可以学习到C#的基础语法、面向对象编程思想以及游戏开发的基本流程。 首先,...
在本教程"俄罗斯方块C#讲解part2"中,我们深入探讨了使用C#语言实现经典游戏俄罗斯方块的编程技术。陈广老师以其清晰的思路和详尽的讲解,帮助开发者理解如何构建这个游戏的核心功能。以下是这个教程中涵盖的一些...
在本教程中,“俄罗斯方块C#讲解part4”由知名讲师陈广主讲,主要聚焦于使用C#编程语言实现经典游戏“俄罗斯方块”的过程。C#是一种广泛应用于游戏开发、桌面应用和Web应用的面向对象的编程语言,其强大的功能和简洁...
通过编写俄罗斯方块的游戏代码,初学者不仅能够了解游戏开发的基本原理,还能学习到图形界面的设计、事件的处理机制、定时器的使用以及数据结构的应用等编程中的关键技能。 在本教学资源中,陈广老师从最基础的C#...
在本教程中,我们将深入探讨如何使用C#编程语言实现经典游戏——俄罗斯方块。由知名讲师陈广主讲,他以其清晰的思路和详尽的讲解方式,使得这个复杂的过程变得易于理解。 首先,我们要了解C#的基础知识。C#是一种...
《视觉C#编程:构建俄罗斯...在学习过程中,可以参考《[A184]C#程序设计 俄罗斯方块 第一讲.swf**提供的教程,逐步跟随讲解完成每一个步骤。不断实践,你将成为一名熟练的C#程序员,甚至可能开启自己的游戏开发之旅。
【C#俄罗斯方块开发详解】 C#是一种广泛应用于游戏开发、桌面应用和Web服务的高级编程语言,由Microsoft公司开发。在这个项目中,我们将会深入探讨如何利用C#来实现一个经典的游戏——俄罗斯方块。这个教程由知名的...