`
zmo_xu
  • 浏览: 63444 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

逐步讲解用C#实现俄罗斯方块之核心代码[上]

阅读更多

从分析到实现讲解俄罗斯方块的做法
俄罗斯方块在.NET下的制作,我写的只是一些拙见,望高手不要板砖,也请高手不惜赐教!
首先我们要分析俄罗斯方块的原理
1.由移动的方块和不能动的方块组成
2.一行排满消除
3.能产生多种方块
---
首先我们来分析方块
前面说了方块由两部分组成一种是移动下落的一种是固定的,我们逐个来分解,移动的方块一般由4个方块组成[我们这里只讨论保准版]我们假设吧这个4个下落的方块看成一个封装的类,那么他就有4个图形成员,我们不妨假设是4个黑色的pictureBox组建[大小10*10],再在类里面添加一个初始化方法用于通过picturebox.Location来控制没干方块的位置,那么我们先生成一个初步的类shape,其中pb是下落的图形,而oldpb是已经固定的图形,为什么这样定义呢 

    public class sharp
    {
        
//用于记录分数
        
//用于记录已经触底的图像
        protected PictureBox[] oldpb=new PictureBox[1000];
        
//用于控制移动中的图像
        public PictureBox[] pb = new PictureBox[4];
        
//移动图像的初始化位置
        private int initX = 100;
        
private int initY = 10;

        
//构造函数[参数用于制定控件添加到什么窗口]
        public sharp(Form f)
        {
            newObj(f);
        }

        
//用于给定时器调用 向下移动
        public void moveDown(Form f)
        {
        }

        
//用于旋转图形
        public void Roll()
        {
        }

       
        
private void Rollx(int a,int b)
        {
        }
        
//检查是否到底 到底则进行转换
        public bool check(Form f)
        {
        }

        
//此方法用于将图形转换为触底图形
        private void changToOld(Form f)
        {
        }

        
public void sharp_0()
        {
            pb[
0].Location = new Point(initX, initY);
            pb[
1].Location = new Point(initX, initY - 10);
            pb[
2].Location = new Point(initX + 10, initY - 10);
            pb[
3].Location = new Point(initX + 10, initY );
        }
        
public void sharp_1()
        {
            pb[
0].Location = new Point(initX, initY);
            pb[
1].Location = new Point(initX, initY - 10);
            pb[
2].Location = new Point(initX, initY - 20);
            pb[
3].Location = new Point(initX, initY - 30);
        }
        
public void sharp_2()
        {
            pb[
0].Location = new Point(initX, initY);
            pb[
1].Location = new Point(initX, initY - 10);
            pb[
2].Location = new Point(initX-10, initY - 10);
            pb[
3].Location = new Point(initX-20, initY - 10);
        }
        
public void sharp_3()
        {
            pb[
0].Location = new Point(initX, initY);
            pb[
1].Location = new Point(initX, initY - 10);
            pb[
2].Location = new Point(initX + 10, initY - 10);
            pb[
3].Location = new Point(initX + 20, initY - 10);
        }
        
public void sharp_4()
        {
            pb[
0].Location = new Point(initX, initY);
            pb[
1].Location = new Point(initX+10, initY - 10);
            pb[
2].Location = new Point(initX + 10, initY );
            pb[
3].Location = new Point(initX + 20, initY);
        }
        
public void sharp_5()
        {
            pb[
0].Location = new Point(initX, initY);
            pb[
2].Location = new Point(initX + 10, initY);
            pb[
1].Location = new Point(initX+10, initY + 10);
            pb[
3].Location = new Point(initX +20, initY + 10);
        }
        
public void sharp_6()
        {
            pb[
0].Location = new Point(initX, initY);
            pb[
1].Location = new Point(initX+10, initY );
            pb[
2].Location = new Point(initX + 10, initY - 10);
            pb[
3].Location = new Point(initX + 20, initY - 10);
        }

        
//生成新图形样式
        public void makeNew()
        {
        }

        
//用于新实例化移动图形组
        public void newObj(Form f)
        {
        }

        
//检查一行是否排满
        public void finish()
        {
        }

        
//消除制定行并将上面的都向下移动
        public void ClareLine(int y)
        {
        }

        
// 向左移动的方法
        public void movLeft()
        {

        }
        
//向右移动的方法
        public void movRigth()
        {
            
        }

        
//用于检查方块单元的位置是否合法
        private bool checkPes(Point p)
        {
           
        }

        
public void flash(int y)
        {
           
        }
        
//------------------------------------
    }

我们在上面定义了一些我们游戏时操作所对应的成员方法,这些操作都是相应我们游戏操作的,那么游戏中还有什么是我们所看不到的方法呢..对,你说的很对,就是方块什么时候到底下什么时候消除行--我们现在要考虑令一组方块了,就是那些不能动的,对是不能动的我们就从不能动来解决...我们创建一个pictureBox数组其元素个数为面板最多能显示的方块的个数我这里用的是20*50(每行20个50行,我作的大了点,呵呵,如果诸位要自己实践的话不妨采用15*40,一行排20个玩起来比较慢也比较累,好在我只是写写核心代码不用考虑游戏的平衡性什么的呵呵)好了言归正传,为什么要这样作呢 其实很简单当移动图形到底的时候我们就把他的4个pb[指pictureBox,下同]复制到oldPb数组,这样便实现了图形到底固定的效果,你问怎么判断图形移动到底..这个,呵呵,其实,额 难道你还没想到.我的图形在下移的时候要每移动一次都要检查oldpb所对应的位置的下方是否有图形(即是否==null),这里我给出完整的下落检查..

 public void moveDown(Form f)
        {
            
for (int i = 0; i < 4; i++)
            {
                
//向下移动
                pb[i].Location = new Point(pb[i].Location.X, pb[i].Location.Y + 10);
            }
            
//调用check来判断是否到底 
            if (check(f))
            {
                
//到底着构建新图像
                makeNew();
            }
        }
 public bool check(Form f)
        
...{
            
for(int i=0;i<4;i++)
            
...{
                
if (pb[i].Location.Y > 500)
                
...{
                    
//任一一个图像到底则整个图像进行转换
                    changToOld(f);
                    
return true;
                }

                
//判断该图像所对应的位置的下方是否有已经触底的图形
                int x = pb[i].Location.X;
                
int y = pb[i].Location.Y;
                
if ((y - 20* 20 + x - 10 > 0 && oldpb[(y - 20/ 10 * 20 + (x - 10/ 10 + 20!= null)
                
...{
                    
//任一一个图像到底则整个图像进行转换
                    changToOld(f);
                    
return true;
                }

            }

            
return false;
        }
   private void changToOld(Form f)
        
...{
            
for (int i = 0; i < 4; i++)
            
...{
                
int x = pb[i].Location.X;
                
int y = pb[i].Location.Y;
                
if (pb[0].Location.Y > 10 && pb[1].Location.Y > 10 && pb[2].Location.Y > 10 && pb[3].Location.Y > 10)
                
...{
                    
//将图形"copy"到触底图形组
                    oldpb[(y - 20/ 10 * 20 + (x - 10/ 10= pb[i];
                }

            }

            
//检查finish-用于检查一排是否已经排满
            finish();
            
//生成新移动图形组
            newObj(f);
        }
 public void newObj(Form f)
        
...{
            
for (int i = 0; i < 4; i++)
            
...{
                
//重新实例化模型
                
//实例化
                this.pb[i] = new System.Windows.Forms.PictureBox();
                
//设置大小
                this.pb[i].Size = new System.Drawing.Size(1010);
                
//设置图片
                this.pb[i].Image = global::Fang.Properties.Resources.fang;
                
//添加到窗口
                f.Controls.Add(pb[i]);
            }

分享到:
评论

相关推荐

    C#版俄罗斯方块视频教程

    【C#版俄罗斯方块视频教程】是一套深入解析如何使用C#编程语言实现经典游戏——俄罗斯方块的教育资源。教程通过多个视频章节,详细介绍了游戏开发的全过程,旨在帮助初学者和有一定C#基础的开发者理解游戏编程的基本...

    C#俄罗斯方块游戏[内附源代码]

    本篇将详细讲解如何使用C#来创建一款经典的俄罗斯方块游戏,同时,提供源代码供学习者参考。 首先,我们了解下俄罗斯方块的基本概念。俄罗斯方块是一款流行的电子游戏,玩家需要控制各种形状的方块,让它们在屏幕...

    C# 实现俄罗斯方块(附源码)

    通过本文,我们可以学习到使用 C# 语言实现俄罗斯方块游戏的知识点,包括 BackgroundWorker、Action 委托、TableLayoutPanel 等技术,了解俄罗斯方块的流程图和效果图,掌握俄罗斯方块的核心代码,包括定义方块的...

    俄罗斯方块C#实现完整源码

    在本文中,我们将深入探讨如何使用C#编程语言实现经典的电子游戏——俄罗斯方块。这个项目对于初学者来说是一个很好的起点,因为它涉及到基础的游戏逻辑、图形用户界面(GUI)设计以及事件处理。以下是对实现俄罗斯...

    C#游戏俄罗斯方块

    本篇文章将详细讲解如何利用C#实现经典游戏——俄罗斯方块的完整代码实现,带你深入理解游戏逻辑和C#编程技巧。 首先,我们要了解俄罗斯方块的基本规则。游戏的核心是各种形状的“方块”,它们从屏幕顶部随机落下,...

    陈广 c# 制作俄罗斯方块7

    《陈广C#制作俄罗斯方块7》是一个关于利用C#编程语言开发经典游戏——俄罗斯方块的教学资源。在这个项目中,陈广老师通过清晰易懂的方式,带领学习者掌握C#的基础语法以及如何将其应用于游戏开发。SWF格式的文件意味...

    一个简单的C#俄罗斯方块

    本项目“一个简单的C#俄罗斯方块”是一个很好的实例,展示了如何利用C#的基础知识和游戏开发原理来创建一个经典的休闲游戏——俄罗斯方块。本文将详细讲解这个项目中的关键知识点。 1. **C#基础知识**:项目首先...

    俄罗斯方块C#编程讲解

    《C#编程实现俄罗斯方块详解》 在编程领域,经典游戏俄罗斯方块因其简单而富有挑战性,一直是初学者和资深开发者喜爱的项目之一。本文将以C#语言为基础,详细解析如何实现这一游戏,旨在帮助读者理解C#编程基础以及...

    C#语言基础-小游戏俄罗斯方块制作视频讲解

    在本课程"C#语言基础-小游戏俄罗斯方块制作视频讲解"中,我们将深入学习C#编程语言的基础,并通过实际操作来构建经典游戏——俄罗斯方块。这个教程旨在帮助初学者更好地理解和掌握C#语言的核心概念,同时提升他们的...

    C#俄罗斯方块源代码.rar

    本篇将详细讲解基于C#实现的俄罗斯方块源代码,这对于那些希望深入理解C#编程、游戏开发或者想要学习如何构建经典游戏的开发者来说,是一份极好的学习资源。 首先,俄罗斯方块是一款经典的休闲益智游戏,其基本原理...

    俄罗斯方块C#讲解part6

    在本教程中,我们将深入探讨如何使用C#编程语言实现经典游戏——俄罗斯方块。"俄罗斯方块C#讲解part6"是由陈广老师主讲的一系列教程的一部分,旨在帮助开发者掌握C#的基础知识以及如何将这些知识应用于游戏开发。 ...

    俄罗斯方块C#讲解part8

    在本节"俄罗斯方块C#讲解part8"中,我们将会深入探讨如何利用C#编程语言来实现经典游戏——俄罗斯方块。陈广老师以其清晰的思路和详尽的讲解,将带领我们逐步构建这个游戏。 首先,我们需要理解C#的基础语法和面向...

    C#俄罗斯方块游戏源码.rar

    【标题】"C#俄罗斯方块游戏源码.rar"是一个基于C#编程语言实现的俄罗斯方块游戏的源代码集合。这个压缩包包含了用于构建一个完整的俄罗斯方块游戏的所有必要文件,让学习者或者开发者能够深入理解游戏的内部机制。 ...

    c#视频俄罗斯方块制作1

    本教程以陈广老师的教学全集为蓝本,主要针对初学者,深入浅出地讲解如何使用C#来实现经典游戏——俄罗斯方块的制作。通过这个项目,你可以学习到C#的基础语法、面向对象编程思想以及游戏开发的基本流程。 首先,...

    俄罗斯方块C#讲解part4

    在本教程中,“俄罗斯方块C#讲解part4”由知名讲师陈广主讲,主要聚焦于使用C#编程语言实现经典游戏“俄罗斯方块”的过程。C#是一种广泛应用于游戏开发、桌面应用和Web应用的面向对象的编程语言,其强大的功能和简洁...

    俄罗斯方块C#讲解part2

    在本教程"俄罗斯方块C#讲解part2"中,我们深入探讨了使用C#语言实现经典游戏俄罗斯方块的编程技术。陈广老师以其清晰的思路和详尽的讲解,帮助开发者理解如何构建这个游戏的核心功能。以下是这个教程中涵盖的一些...

    俄罗斯方块C#讲解part5

    在本教程中,我们将深入探讨如何使用C#编程语言实现经典游戏——俄罗斯方块。由知名讲师陈广主讲,他以其清晰的思路和详尽的讲解方式,使得这个复杂的过程变得易于理解。 首先,我们要了解C#的基础知识。C#是一种...

    俄罗斯方块1 c#

    《视觉C#编程:构建俄罗斯...在学习过程中,可以参考《[A184]C#程序设计 俄罗斯方块 第一讲.swf**提供的教程,逐步跟随讲解完成每一个步骤。不断实践,你将成为一名熟练的C#程序员,甚至可能开启自己的游戏开发之旅。

    C#俄罗斯方块(陈广老师)

    【C#俄罗斯方块开发详解】 C#是一种广泛应用于游戏开发、桌面应用和Web服务的高级编程语言,由Microsoft公司开发。在这个项目中,我们将会深入探讨如何利用C#来实现一个经典的游戏——俄罗斯方块。这个教程由知名的...

    C#语言基础-小游戏俄罗斯方块制作视频

    【C#语言基础-小游戏俄罗斯方块制作视频】是一系列...视频中的六部分可能分别涵盖了以上各个知识点的详细讲解,逐步引导学习者完成"俄罗斯方块"的完整实现。通过实践,理论知识将得到巩固,对C#的理解也将更加深刻。

Global site tag (gtag.js) - Google Analytics