俄罗斯方块游戏的设计与实现总结

俄罗斯方块游戏的设计与实现总结

1游戏设计人员及具体分工

   游戏参与人员:

         刘丹:负责整个游戏的数据结构设计与文档起草与修改及部分编码。

         葛瑞:负责俄罗斯方块游戏的界面绘制,并参与部分文档的编写和代码编写。

         王书林:负责游戏的设计,代码的整合,部分游戏的实现以及一些文档的编写。

         李震:负责整个游戏的测试工作以及测试计划和文档的编写。

         郑舒:负责信息收集,游戏中的界面设计,部分需求文档编写。

2游戏中已实现的功能

     整个游戏基本的游戏更能已经实现,并且再后期游戏的开发中又添加了附加游戏—贪吃蛇游戏。具体功能如下:

  俄罗斯方块:

      1:方块的翻转

      2:方块的变形

      3:加速下落

      4:主界面采用位图显示

      5:通过不同的选择进入不同的游戏

      6:自动计分功能及显示

      7:背景音乐播放

      8:中途退出游戏

      9:显示预出现方块

  贪吃蛇:

      1:食物的自动出现

      2:蛇移动方向的改变

      3:自动计分功能

      4:中途退出功能

      5:背景音乐的播放

3 游戏中尚未完成的功能及其原因

在整个游戏中由于种种原因使得一些原定的共能没有实现,具体未完成的功能如下:

 1:游戏的积分榜显示

     虽然在游戏中进行了有效的计分功能,但由于一直把它定位整个游戏的最后完成部分,但由于中途要对整个的游戏从单机版改成网络版而出现了一些开发计划改变,而当初我们选择的开发环境由于是比较早的TURBO C开发环境导致实现网络部分的两个重要头文件没有能更找到,所以时间上的浪费让我们少做了很多东西,但我们已经对该功能的实现接口进行了设计,只是具体没有进行编码。

2:游戏的对战实现

由于在前期的游戏开发中没有考虑进行对战,所以前期的开发环境选择了turbo c 而在后期的改变时无法进行利用socket 进行通信因为缺少两个头文件,而在网上没有找到这两个头文件,所以一直没有没能实现对战功能。并且影响了很多后期的开发。

3:进行等级设置

在进行游戏开发是为了方便进行调试,直接定义了一个全局变量进行时间延迟设置,而不知道什么原因时间设置后导致运行时不稳定,经过很多次时间修改后得到了一个相对稳定的时间延迟,前期设计是准备利用一个函数接口进行该值的设定,待后来由于没有能够调试处一个比较很好的时间延迟,所以就没有进行对该接口的实现。

4 游戏中部分的代码实现

  1:初始界面的绘制

     void unit()

{

 int i,j;

 int gd=DETECT,gm;

 delayTime=2;

 for(i=0;i<17;i++)

        for(j=0;j<10;j++)

        {

               box[i][j]=0;

               box_color[i][j]=0;

        }

 initgraph(&gd,&gm,"D:\\tc\\bgi");

 setcolor(6);

 rectangle(40,0,600,455);

 rectangle(39,1,601,456);

 setcolor(7);

 for(i=0;i<17;i++)

 for(j=0;j<10;j++)

 rectangle(55+25*j,15+25*i,80+25*j,40+25*i);

 for(i=0;i<4;i++)

 for(j=0;j<4;j++)

 rectangle(405+25*j,50+25*i,430+25*j,75+25*i);

 setcolor(7);

 outtextxy(435,25,"NEXT");

 outtextxy(370,180,"SCORE");

 rectangle(440,170,505,195);

 outtextxy(440,210,"HELP");

 outtextxy(430,220,"LEFT:MOVE LEFT");

 outtextxy(430,240,"RIGHT:MOVE RIGHT");

 outtextxy(430,260,"DOWN:MOVE DOWN");

 outtextxy(430,280,"UP:CHANGE");

 getch();

}

2:产生下一个方块

void generate()

{

       int ra;

       randomize();

    ra=random (7);

       nowblock1=ra;

       state=0;

       switch(ra)

       {

        case 0:             /*biao shi fang kuai*/

               a1=4;

               b1=5;

               c1=14;

               d1=15;

               color=4;

               break;

         case 1:            /*biao shi shu tiao*/

               a1=4;

               b1=14;

               c1=24;

               d1=34;

               color=1;

               break;

         case 2:          /*biao shi L*/

               a1=5;

               b1=15;

               c1=25;

               d1=26;

               color=14;

               break;

          case 3:        /*biao shi fan L*/

               a1=5;

               b1=15;

               c1=25;

               d1=24;

               color=12;

               break;

           case 4:       /*biao shi Z*/

               a1=4;

               b1=5;

               c1=15;

               d1=16;

               color=15;

               break;

              case 5:     /*biao shi fan Z*/

               a1=5;

               b1=6;

               c1=15;

               d1=14;

               color=5;

               break;

              case 6:       /*biao shi fan T*/

               a1=4;

               b1=13;

               c1=14;

               d1=15;

               color=3;

               break;

       }

       draw_next(ra);

}

3:方块的消去

{

                        direction=0;

                               if(CanMove(direction))

                                      goto A;

                               else

                               {

                     box[a/10][a%10]=1;

                              box[b/10][b%10]=1;

                              box[c/10][c%10]=1;

                              box[d/10][d%10]=1;

                                    box_color[a/10][a%10]=nowcolor;

                              box_color[b/10][b%10]=nowcolor;

                              box_color[c/10][c%10]=nowcolor;

                              box_color[d/10][d%10]=nowcolor;

                              /*generate();*/

                                    goon=1;

                                    a=a1;

                              b=b1;

                              c=c1;

                              d=d1;

                                    nowBlock=nowblock1;

                                    nowcolor=color;

                                    if(box[a/10][a%10]==1||box[b/10][b%10]==1||box[c/10][c1%10]==1||box[d/10][d%10]==1)

                                    {

                                           flag=1;

                                           Repaint();

                                           break;

                                    }

                                    else

                                 Repaint();

                                    for(i=16;i>=0;i--)

                                          {

                                             for(j=9;j>=0;j--)

                                             {

                                                    if(box[i][j]==0)

                                                          break;

                                             }

                                             if(j==-1)

                                             {

                                                   score+=10;

                                                  for(m=i;m>0;m--)

                                                         for(n=0;n<10;n++)

                                                         {

                                                                box[m][n]=box[m-1][n];

                                                                box_color[m][n]=box_color[m-1][n];

                                                         }

                                                    for(m=0;m<10;m++)

                                                    {

                                                        box[0][m]=0;

                                                        box_color[0][m]=0;

                                                    }

                                                    i++;

                                                    Repaint();

                                                    sprintf(s,"%d",score);

                                                    outtextxy(450,180,s);

                                             }

                                          }

                               }

                 }

4:位图显示:

void ShowBMP(char c[])

{

  int i,j;

  unsigned int bfType;

  unsigned int biBitCount;

  unsigned long biCompression;

  unsigned int  index=0;

  char rgb[4];

  char *p;

  FILE *fp;

  if((fp=fopen(c,"rb")) == NULL)

  {

    printf("Can't open this file!");

    getch();

    exit(0);

  }

  fseek(fp,54,SEEK_SET);

  for(i=0;i<256; i++)

  {

    rgb[B]=fgetc(fp);;     /*read blue;*/

    rgb[G]=fgetc(fp);;     /*read green  */

    rgb[R]=fgetc(fp);     /*read red   */

    fgetc(fp);

    outp(0x3c6,0xff);

    outp(0x3c8,i);

    outp(0x3c9,rgb[R]>>2);           /*写入调色板*/

    outp(0x3c9,rgb[G]>>2);

    outp(0x3c9,rgb[B]>>2);

   }

     p=(char *)malloc(1);

   if(p==NULL)

     {

       printf("");

       exit(0);

     }

    for(i=SCREEN_HEIGHT-1;i>=0;i--)           /*直接写屏*/

 {

    fseek(fp,1078+(long)(i)*SCREEN_WIDTH,SEEK_SET);

/*    fread(&video_buf[i*SCREEN_WIDTH],SCREEN_WIDTH,1,fp); */

    for(j=0;j<SCREEN_WIDTH;j++)

     {

       fread(p,1,1,fp);

       video_buf[index] = *p;

        index++;

      }

 }

   free(p);

   fclose(fp);

}

4:艺术清屏:

void JalousieScreen(char c[])     /*百叶窗显示图片*/

{

    int i,j,k;

    unsigned int  index=0;

    unsigned char *p;

    FILE *fp;

    if((fp=fopen(c,"rb")) == NULL)

    {

        printf("Can't this file!");

        getch();

        exit(0);

    }

    p=(char *)malloc(1);

    if(p==NULL)

    {

        printf("");

        exit(0);

    }

    for(k=SCREEN_HEIGHT-1;k>SCREEN_HEIGHT-11; k--)

    {

    index =0;

    index += SCREEN_WIDTH*(SCREEN_HEIGHT-k-1);

    for(i=k;i>=0;i-=10)

    {

        fseek(fp,1078+(long)(i)*SCREEN_WIDTH,SEEK_SET);

        for(j=0;j<SCREEN_WIDTH;j++)

        {

            fread(p,1,1,fp);

            video_buf[index] = *p;

            index++;

        }

        delay(1000);

        index += SCREEN_WIDTH*9;

     }

   }

   free(p);

   fclose(fp);

}

5 开发总结

   虽然在开发中我们遇到了很多的难题,并且第一次利用turbo C 进行图形界面开发,所以在游戏的开发过程中前期设计出现了一些问题,但在我们团队的共同努力下还是将基本的内容完成,所以虽然很简单,但毕竟是我们几个人一起做的东西,还是有很多的收获,尽管和我们的预期值有很大的差别,我们希望在以后的时间能够将其完善。

   通过这次游戏开发我们也了解了如何进行队员分工,充分利用每一个人的特长去共同完成我们的东西。在一个团队中,团结才是最重要,同时也让自己对C语言的开发有了更进一步的理解。

 

第二篇:俄罗斯方块游戏设计报告

实训报告

设计题目:    俄罗斯方块游戏设计     

    系:                 

班  级:                      

    号:                

                          

指导教师:                    

设计地点:                 

开课时间:

 


学院  制


学生姓名                         成绩           

评语

                         指导教师(签名)              

                                                 

目录

1.设计目的和任务.... - 1 -

1.1目的:.... - 1 -

1.2任务:.... - 1 -

2.开发环境.... - 1 -

2.1硬件环境:.... - 1 -

2.2软件环境:.... - 1 -

3.设计题目.... - 2 -

3.1题目名称:.... - 2 -

3.2题目详细描述:.... - 2 -

3.3功能要求:.... - 2 -

4.相关技术以及知识点.... - 3 -

4.1编写Block类:.... - 3 -

4.2 PathGradientBrush 类:.... - 3 -

4.3 Random类:.... - 3 -

4.4 GDI图形处理:.... - 3 -

5. 设计与实现.... - 4 -

5.1 设计流程图.... - 4 -

5.2 游戏主体界面.... - 4 -

5.3 游戏图形界面.... - 11 -

5.4 图形的移动与消行.... - 13 -

5.5 得分的实现.... - 15 -

6.总结.... - 16 -

7.参考资料.... - 16 -


1.设计目的和任务

1.1目的:

在现今电子信息高速发展的时代,电子游戏已深入人们的日常生活,成为老少皆宜的娱乐方式。俄罗斯方块,是一款风靡全球的游戏,最初是由苏联人制作的,规则简单,容易上手,且游戏过程变化无穷,可以让玩家充分感受游戏中的乐趣。

在游戏设计方面,俄罗斯方块是游戏编程的入门项目,因为它可以检验编辑人员对开发语言、环境和基本数据结构知识熟练程度。

1.2任务:

使用C#语言编写一个俄罗斯方块游戏系统,要求程序运行后有一个图形用户界面,并具备下面几个功能:

(1) 实现各种方块的生产,包括形状和颜色等信息;

(2) 实现各个方块的上下左右移动和旋转的功能;

(3) 实现消行的功能;

(4) 实现开始,暂停,结束等功能。

 

2.开发环境

2.1硬件环境:

服务器 CPU:PIII 500以上, 内存:256M

客户机 CPU:P200MMX以上,内存:32M以上

2.2软件环境:

   Visual Studio2005   .net 2.0 以上

3.设计题目

3.1题目名称:

俄罗斯方块游戏系统 

3.2题目详细描述:

使用C#语言编写一个俄罗斯方块游戏系统,要求程序运行后有一个图形用户界面,实现各种方块的生产,包括形状和颜色等信息,完成左右下旋转的功能,在消行的同时分数加1,在点击暂停或者按下空格的时候暂停或开始游戏,最后结束游戏。

3.3功能要求:

功能(1) 实现各种方块的生产,包括形状和颜色等信息;

(2) 实现各个方块的上下左右移动和旋转的功能;

(3) 实现消行的功能;

(4) 实现时间和得分的统计功能;

(5) 实现开始,暂停,结束等功能;

要求(1)  编写程序要严格按照C#编程规范进行代码编写。

(2)  必须按照个体软件的过程,编写有关的文档。

(3)  按照老师的要求,每个人必须独立完成。

(4)  按照实训的时间安排进行实训,实训结束后提交有关的表格与文档

4.相关技术以及知识点

4.1编写Block类:

在游戏项目规范说明书所创建的类图中定义了Block类,现在可以把它编写为最终的类接口形式,包括属性的数据类型以及方法所使用参数的数据类型。

每个确定的方块都与正方形的某种特定排列方式相对应,因此可以考虑Block类的3个新成员:BlockType属性、方块类型的枚举集合、构造函数(用以在期望的位置、使用期望的色彩创建每个正方形)。为了给玩家一个清楚的视觉提示,每种类型的方块颜色应该是固定的,因此创建一个数组来保存每种类型方块的前景色和背景色是一种较好的想法。

4.2 PathGradientBrush 类:

封装 Brush 对象,它通过渐变填充 GraphicsPath 对象的内部。

彩色渐变是从路径的中点到路径的外边界边缘的平滑的彩色渐变。混合因子、位置和样式影响渐变起始和结束的位置,并且影响渐变变化的速度。

路径渐变画笔不遵循用于执行绘制操作的 Graphics 对象的 SmoothingMode 属性。无论是否用平滑模式,用 PathGradientBrush 对象填充的区域都以同样的方式呈现。

4.3 Random类:

伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,因为它们是用一种确定的数学算法选择的,但是从实用的角度而言,其随机程度已足够了。Random 类的当前实现基于 Donald E.Knuth 的减法随机数生成器算法。

随机数的生成是从种子值开始。如果反复使用同一个种子,就会生成相同的数字系列。产生不同序列的一种方法是使种子值与时间相关,从而对于 Random 的每个新实例,都会产生不同的系列。默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值,而参数化构造函数可根据当前时间的计时周期数采用 Int32 值。但是,因为时钟的分辨率有限,所以,如果使用无参数构造函数连续创建不同的 Random 对象,就会创建生成相同随机数序列的随机数生成器。

通过创建单个而不是多个 Random 对象可以避免此问题。

若要提高性能,请创建一个随时间推移能生成多个随机数的 Random 对象,而不要反复新建会生成同一个随机数的 Random 对象。

4.4 GDI图形处理:

GDI+提供了一个抽象层,隐藏了不同视频卡之间的区别,这样就可以调用Windows API函数完成指定的任务了,GDI还在内部指出在运行特定的代码时,如果让客户机的视频卡完成要绘制的图形。GDI还可以完成其他任务。大多数计算机都有多个显示设备---监视器、打印机。GDI成功的使应用程序所使用的打印机看起来与屏幕一样。如果要打印某些东西,而不是显示他们,只需告诉系统输出设备是打印机,再用相同的方式调用相同的Windows API函数可以。

5. 设计与实现

 5.1 设计流程图

 

                    图5.1.1

  5.2 游戏主体界面        

        

    

图5.2.1

主界面关键部分代码:

namespace 俄罗斯方块

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        static public int[,] mainField;

        static public int row = 20;  //数组mainField[,]的行

        static public int line = 15;  //数组mainField[,]的列

        private Block currentBlock;  //主界面中活动的方块

        private Block nextBlock;  //副界面中的方块

        private int level = 1;

        private int score = 0;

      

        //菜单栏中NewGame

        private void menuItemNew_Click(object sender, EventArgs e)

        {

            NewGame();

        }

        //菜单栏中Start,在暂停之后使用,继续进行游戏

        private void menuItemStart_Click(object sender, EventArgs e)

        {

            timerInterval.Start();

            menuItemStart.Enabled = false;

            menuItemPause.Enabled = true;

            btnPause.Text = "Pause";

        }

        //菜单栏中Pause,用于暂停游戏

        private void menuItemPause_Click(object sender, EventArgs e)

        {

            timerInterval.Stop();

            menuItemStart.Enabled = true;

            menuItemPause.Enabled = false;

            btnPause.Text = "Start";

        }

        //菜单栏中Exit,用于推出游戏

        private void menuItemExit_Click(object sender, EventArgs e)

        {

            this.Close();

            Application.Exit();

        }

        //菜单栏中beginner model

        private void menuItemBeginer_Click(object sender, EventArgs e)

        {

            NewGame();

            level = 1;

            timerInterval.Interval = 500 / level;

            labeLevelVisual.Text = Convert.ToString(level);

        }

        //菜单栏中normal model

        private void menuItemNormal_Click(object sender, EventArgs e)

        {

            NewGame();

            level = 2;

            timerInterval.Interval = 500 / level;

            labeLevelVisual.Text = Convert.ToString(level);

        }

        //菜单栏中insane model

        private void menuItemInsane_Click(object sender, EventArgs e)

        {

            NewGame();

            level = 3;

            timerInterval.Interval = 500 / level;

            labeLevelVisual.Text = Convert.ToString(level);

        }

        private void menuItemOnMusic_Click(object sender, EventArgs e)

        {

        }

        private void menuItemOffMusic_Click(object sender, EventArgs e)

        {

        }

        //菜单栏中的config选项

        private void menuItemConfig_Click(object sender, EventArgs e)

        {

            if (!GameIsOver())

            {

                timerInterval.Stop();

                MessageBox.Show("Left:  Arrow(←)\n\nRight:  Arrow((→)\n\nDown:  Arrow(↓)\n\nRotate:  Arrow(↑)");

                timerInterval.Start();

            }

            else

                MessageBox.Show("Left:  Arrow(←)\n\nRight:  Arrow((→)\n\nDown:  Arrow(↓)\n\nRotate:  Arrow(↑)");

        }

        //菜单栏中的version选项

           private void picBoxMainField_Click(object sender, EventArgs e)

        {

            //picBoxMainField.Focus();

        }

        //focus

        private void picBoxMainField_Paint(object sender, PaintEventArgs e)

        {

            //若没有此句,键盘焦点不能移到picBoxMainField中

            picBoxMainField.Focus();

        }

        private void labeLevelVisual_Click(object sender, EventArgs e)

        {

        }

        private void labScoreVisual_Click(object sender, EventArgs e)

        {

        }

        //主界面中的Pause按钮

        private void btnPause_Click(object sender, EventArgs e)

        {

            //按钮btnPause点击Pause后显示Start

            if (btnPause.Text == "Pause")

            {

                timerInterval.Stop();

                btnPause.Text = "Start";

                menuItemPause.Enabled = false;

                menuItemStart.Enabled = true;

            }

            //按钮btnPause点击Start后显示Pause

            else

                if (btnPause.Text == "Start")

                {

                    timerInterval.Start();

                    btnPause.Text = "Pause";

                    menuItemPause.Enabled = true;

                    menuItemStart.Enabled = false;

                }

        }

        //主界面中的NewGame按钮

        private void btnNewGame_Click(object sender, EventArgs e)

        {

            NewGame();

        }

        //主界面中的Exit按钮

        private void btnExit_Click(object sender, EventArgs e)

        {

            this.Close();

            Application.Exit();

        }

        //Null

        private void Form1_Load(object sender, EventArgs e)

        {

        }

        //Null

        private void Form1_KeyDown(object sender, KeyEventArgs e)

        {

        }

        //显示newGame,这里是必须的

        private void Form1_Shown(object sender, EventArgs e)

        {

            NewGame();

        }

        //新游戏

        private void NewGame()

        {

            mainField = new int[row, line];  //申请一个新的数组,存储整个界面方块信息

            for (int i = 0; i < row; i++)

            {

                for (int j = 0; j < line; j++)

                {

                    mainField[i, j] = 0;  

                }

            }

            level = 1;  //游戏下落速度等级

            score = 0;  //消去行数

            timerInterval.Interval = 500 / level;  //时间间隔随着等级增加而减少  

            labeLevelVisual.Text = level.ToString();  //将等级显示在label上

            labScoreVisual.Text = score.ToString();   //将分数显示再label上

            menuItemNew.Enabled = false;  //菜单按钮new game不能点击

            menuItemPause.Enabled = true;  //菜单按钮Pause可以点击

            btnPause.Text = "Pause";

            btnPause.Enabled = true;  //主界面按钮pause可以点击

            timerInterval.Start();  //计时器开始计时

            this.Refresh();   //刷新界面

            currentBlock = new Block();

            currentBlock.MoveToCenterScreen();   //为了美观,将方块出现的位置移动到中间

            do

            {

                nextBlock = new Block();

            } while (nextBlock.Type == currentBlock.Type);  //防止主界面中与副界面中出现的block相同

            //先后绘制副主界面中的block

            nextBlock.DrawBlock(picBoxSubField.CreateGraphics());

            currentBlock.DrawBlock(picBoxMainField.CreateGraphics());

        }

  5.3 游戏图形界面   


一共七个图形 

                           图5.3.1

图形部分设计代码(此类代码太多,文档中只列举其中一个)

private class Block

        {

            private Brick[,] Shape;

            private Point left;

            private Point right;

            private Point top;

            private Point bottom;

            private int type;

            public int Type

            {

                get { return type; }

                set { type = value; }

            }

            public Block()

            {

                Shape = new Brick[4, 4];

                for (int i = 0; i < 4; i++)

                {

                    for (int j = 0; j < 4; j++)

                    {

                        Shape[i, j] = new Brick();

                    }

                }

                Random RandType = new Random();

                type = RandType.Next(1, 20);

                switch (type)

                {

                    case 1:

                        //   ■□□□

                        //   ■□□□

                        //   ■□□□

                        //   ■□□□                      

                        Shape[0, 0].X = 0;

                        Shape[0, 0].Y = 0;

                        for (int i = 0; i < 4; i++)  //

                            for (int j = 0; j < 4; j++) //

                            {

                                Shape[i, j].X = Shape[0, 0].X + j;

                                Shape[i, j].Y = Shape[0, 0].Y + i;

                            }

                        Shape[0, 0].Filled = true;

                        Shape[1, 0].Filled = true;

                        Shape[2, 0].Filled = true;

                        Shape[3, 0].Filled = true;

                        left.X = Shape[0, 0].X;

                        left.Y = Shape[0, 0].Y;

                        right.X = Shape[0, 0].X;

                        right.Y = Shape[0, 0].Y;

                        bottom.X = Shape[3, 0].X;

                        bottom.Y = Shape[3, 0].Y;

                        break;

5.4 图形的移动与消行

   移动方面代码示例:

//判断是否能向下移动

            public bool CanMoveDown()

            {

                bool canDown = true;

                if (bottom.Y >= 19)

                    canDown = false;

                if (bottom.Y < 19)

                {

                    for (int i = 3; i >= 0; i--)

                    {

                        for (int j = 3; j >= 0; j--)

                        {

                            if (Shape[i, j].Filled == true)

                            {

                                if (mainField[Shape[i, j].Y + 1, Shape[i, j].X] == 1)

                                    canDown = false;

                            }

                        }

                    }

                }

                return canDown;

            }

消行方面代码示例:        

private void ClearLine()

        {

            int lines = 0;  //同时消失的行数

            int bricks;   //同一行中的砖块brick数

            for (int i = row-1; i >= 0; i--)

            {

                bricks = 0;

                for (int j = line-1; j >= 0; j--)

                {

                    if (mainField[i, j] == 1)

                        bricks++;

                }

                if (bricks == line) //如果同一行中的砖块brick个数达到了行数line,即该行满行

                {

                    lines++;

                    for(int j=line-1;j>=0;j--)

                    {

                        mainField[i,j]=0;    //将该行全部赋值为0,即消除该行

                    }

                    for(int m=i;m>0;m--)

                    {

                        for(int j=line-1;j>=0;j--)

                        {

                            mainField[m,j]=mainField[m-1,j];  //将该行以上各行,均向下一行移动一行,这里用赋值完成

                        }

                    }

                    i++;  //检查下一行

                }

            }

 5.5 得分的实现

            if (lines == 1)  //如果同时消除1行,得1分

                score += 1; 

            if (lines == 2)  //如果同时消除2行,得3分

                score += 3;

            if (lines == 3)  //如果同时消除3行,得5分

                score += 5; 

            if (lines == 4)  //如果同时消除4行,得10分

                score += 10;

            labScoreVisual.Text = score.ToString();  //主界面label显示分数score

            if (score > 20 && level == 1)  //score大于20分,进去第二个level

            {

                level++;

                timerInterval.Interval = 500 / level;

                labeLevelVisual.Text = level.ToString();

            }

            if (score > 35 && level == 2)  //score大于35分,进入第三个level

            {

                level++;

                timerInterval.Interval = 500 / level;

                labeLevelVisual.Text = level.ToString();

            }

        }

6.总结

这次C#实训是我人生中最大的收获,这次实训,让我受益匪浅。经过一周多的实训,我学到了很多知识,这为我接下来的学习做好铺垫。在这一周里我通过问老师问同学,逐步完成了俄罗斯方块的设计。现在我在一步一步的学习,制作出了俄罗斯方块,心中有一种自豪感。这是我这一周来得到的成果。

俄罗斯方块的制作的完成,让我学到了很多。在这个实训中我在编写代码的时候常常出错,经过同学的指教,才有了现在程序的正常运行。在编代码的过程中我遇到了很多小麻烦,有些小问题弄得我焦皮烂愕。实训中,有同学帮我把我的代码一遍遍的看了一下,帮我指出好多错误。在这之后我也仔细认真的查过一边,并把一些代码记住,增加了自己的知识。现在才感觉自己原来也是能做好的。在实训中我遇到很多问题:比如代码忘记了或者有些代码不认识。我都会去翻书,或者去问同学。在有些属性我不会用现在通过自己的摸索和同学的指教,我了解了很多、增加了我的知识。

   在编程中经常会遇到崩溃的问题,这些我都重新弄了一下。增加了对代码的熟悉度这次实训让我受益匪浅,我学到了很多知识。这次实训让我学会了在以后的编程中要更加仔细更加认真

7.参考资料

《Visual C#2005程序设计教程》 机械工业出版社

《Visual C# 时尚编程百例》  机械工业出版社

百度百科,baike.baidu.com

豆丁文档,docin.com

相关推荐