using System;
using System.Windows.Forms;
using System.Drawing;
using System.Media;
class me : Form
{
    int w, h, dw, dh, xsize, ysize;
    Graphics g;
    Timer t = new Timer();
    Bitmap[] bitmaps = new Bitmap[8];
    me()
    {
        createBitmaps();
        Text = "俄罗斯方块-press f1 for help";
        BackColor = Color.Black;
        xsize = 10; ysize = 20;
        ClientSize = new Size(xsize * 30, ysize * 30);
        DesktopLocation = new Point(0, 0);
        MaximumSize = MinimumSize = Size;

        t.Interval = slow;
        t.Tick += go;

        KeyUp += keyup;
        KeyDown += press;

        screen = new int[xsize, ysize];
        backup = new int[xsize, ysize];
        body = new int[xsize * ysize, 2];

        bodysize = 0;
        init();
        t.Start();

        w = ClientSize.Width / xsize;
        h = ClientSize.Height / ysize;
        dw = 1;
        dh = 1;
        g = CreateGraphics();
    }
    void createBitmaps()
    {
        Color[] colors = new Color[] { Color.White, Color.Yellow, Color.Brown, Color.Green, Color.Blue, Color.Purple, Color.Red,Color.AliceBlue };
        for (int i = 0; i < bitmaps.Length; i++)
        {
            bitmaps[i] = new Bitmap(10, 10);
            Graphics.FromImage(bitmaps[i]).FillRectangle(new SolidBrush(colors[i]), 0, 0, bitmaps[i].Width, bitmaps[i].Height);
        }
    }
    void draw()
    {
        drawBody();
        int i, j;
        for (i = 0; i < xsize; i++)
            for (j = 0; j < ysize; j++)
                if (screen[i, j] != backup[i, j])
                {
                    screen[i, j] = backup[i, j];
                    g.DrawImage(bitmaps[backup[i, j]], new Rectangle(new Point(i * w, j * h), new Size(w - dw, h - dh)));
                }
        cover();//drawBody和cover一唱一和,配合默契
    }
    void keyup(object o, KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Down: t.Interval = slow; break;
        }
    }
    void press(object o, KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Up: turn(); draw(); break;
            case Keys.Down: t.Interval = fast; break;
            case Keys.Left: left(); draw(); break;
            case Keys.Right: right(); draw(); break;
            case Keys.F1: help(); break;
        }
    }
    void help()
    {
        t.Stop();
        MessageBox.Show("up-rotate;\ndown-accelerate;\nleft-left;\nright-right;\nf1-help\n\t\t--made by weidiao.neu");
        t.Start();
    }
    static void Main()
    {
        me haha = new me();
        Application.Run(haha);
    }

    int[,] screen;
    int[,] backup;
    int[,] body;
    int bodysize;

    const int fast = 70;
    const int slow = 400;
    Random r = new Random();
    int nowColor;//现在块的颜色
    int[,] dir = new int[4, 2] { { -1, 0 }, { 0, 1 }, { 0, -1 }, { 1, 0 } };

    void init()
    {
        int i, j;
        for (i = 0; i < xsize; i++)
            for (j = 0; j < ysize; j++)
            {
                backup[i, j] = 0;
                screen[i, j] = -1;
            }
    }
    void turn()
    {
        int i;
        int[,] a = new int[bodysize, 2];
        for (i = 0; i < bodysize; i++)
        {
            a[i, 0] = body[i, 1] - body[0, 1] + body[0, 0];
            a[i, 1] = -(body[i, 0] - body[0, 0]) + body[0, 1];
            if (!legal(a[i, 0], a[i, 1])) return;
        }
        copy(a);
    }
    void left()
    {
        int i;
        int[,] a = new int[bodysize, 2];
        for (i = 0; i < bodysize; i++)
        {
            a[i, 0] = body[i, 0] - 1;
            a[i, 1] = body[i, 1];
            if (!legal(a[i, 0], a[i, 1])) return;
        }
        copy(a);
    }
    void right()
    {
        int i;
        int[,] a = new int[bodysize, 2];
        for (i = 0; i < bodysize; i++)
        {
            a[i, 0] = body[i, 0] + 1;
            a[i, 1] = body[i, 1];
            if (!legal(a[i, 0], a[i, 1])) return;
        }
        copy(a);
    }
    bool move()
    {
        if (bodysize == 0) return false;
        int i;
        int[,] a = new int[bodysize, 2];
        for (i = 0; i < bodysize; i++)
        {
            a[i, 0] = body[i, 0];
            a[i, 1] = body[i, 1] + 1;
            if (!legal(a[i, 0], a[i, 1])) return false;
        }
        copy(a);
        return true;
    }
    void copy(int[,] a)
    {
        int i;
        for (i = 0; i < bodysize; i++)
        {
            body[i, 0] = a[i, 0];
            body[i, 1] = a[i, 1];
        }
    }
    void drawBody()
    {
        int i;
        for (i = 0; i < bodysize; i++)
            backup[body[i, 0], body[i, 1]] = nowColor;
    }
    void cover()//把backup中的物体清空
    {
        int i;
        for (i = 0; i < bodysize; i++)
            backup[body[i, 0], body[i, 1]] = 0;
    }
    void lose()
    {
        t.Stop();
        DialogResult result = MessageBox.Show("你弱爆了", "lose", MessageBoxButtons.RetryCancel);
        if (result == DialogResult.Retry)
        {
            init();
            t.Start();
        }
        else Application.Exit();
    }
    void stay()
    {
        int i;
        for (i = 0; i < bodysize; i++)
            backup[body[i, 0], body[i, 1]] = nowColor;
    }
    /*新块产生方式有很多种,是决定游戏好玩和难度的主要因素
    */
    void produce(int x, int y)//产生新块
    {
        if (bodysize == 4) return;
        body[bodysize, 0] = x;
        body[bodysize, 1] = y;
        bodysize++;
        int i;
        int m, n, l;
        for (i = 0; i < 5; i++)
        {
            l = r.Next() % 4;
            m = x + dir[l, 0];
            n = y + dir[l, 1];
            if (legal(m, n))
                produce(m, n);
        }
    }
    bool newbody()
    {
        bodysize = 0;
        nowColor = r.Next() % 7 + 1;
        body[0, 0] = xsize / 2;
        body[0, 1] = 0;
        if (!legal(body[0, 0], body[0, 1])) return false;
        else
        {
            produce(body[0, 0], body[0, 1]);
            return true;
        }
    }
    void go(object o, EventArgs e)
    {
        if (!move())
        {
            stay();
            vanish();
            if (newbody() == false)
            {
                lose();
                return;
            }
        }
        draw();
    }
    void vanish()
    {
        int i, j;
        for (j = 0; j < ysize; j++)
        {
            for (i = 0; i < xsize; i++)
                if (backup[i, j] == 0) break;
            if (i == xsize) fall(j);
        }
    }
    void fall(int floor)
    {
        if (floor == 0) return;
        for (int i = 0; i < xsize; i++)
        {
            backup[i, floor] = backup[i, floor - 1];
            backup[i, floor - 1] = 0;
        }
        fall(floor - 1);
    }
    bool legal(int i, int j)
    {
        if (i >= 0 && j >= 0 && i < xsize && j < ysize) return backup[i, j] == 0;
        else return false;
    }
}

俄罗斯方块C#版的更多相关文章

  1. 俄罗斯方块SDK版

    前言 本来可以从俄罗斯方块控制台版改一版, 将UI接口换掉, 变成SDK版. 正好放假了, 有时间. 就用了一个星期来重头做一个新版, 享受一下静下心来, 有条不紊干活的感觉^_^ 这个工程用来验证S ...

  2. Pascal小游戏 俄罗斯方块怀旧版

    俄罗斯方块怀旧版(注释版) {$APPTYPE GUI}{$MODE DELPHI}program WinPiece; usesWindows; constAppName = 'WinPiece';p ...

  3. python tkinter实现俄罗斯方块 基础版

    本项目最终效果见本人b站投稿av81480858 简介部分 本项目最终代码已上传github: https://github.com/BigShuang/Tetris 的1_BASIC文件夹 .其中1 ...

  4. 俄罗斯方块 UWP 版

    UWP跟 WPF编程模型一致,不过UWP做了精简,而且不同的系统的API还略有不同.不同的地方有以下几点: 1.动画.动画除了故事版,还有其它的实现方式. 2.异步方法.UWP中的方法调用,大部分都是 ...

  5. 还是俄罗斯方块之android版

    前面的,口水话 请直接跳过. 虽然现在不比以前了 也没多少人气了,放到首页 都不到几百的点击量.也许博客园整体水平也是在往水的方向发展.不谈那些了,哥也曾经辉煌过 有过一天上千的点击量 ,哥也曾经有过 ...

  6. H5版俄罗斯方块(1)---需求分析和目标创新

    前言: 俄罗斯方块和五子棋一样, 规则简单, 上手容易. 几乎每个开发者, 都会在其青春年华时, 签下"xx到此一游". 犹记得大一老师在布置大程作业的时候提过: "什么 ...

  7. H5版俄罗斯方块(2)---游戏的基本框架和实现

    前言: 上文中谈到了H5版俄罗斯方块的需求和目标, 这次要实现一个可玩的版本. 但饭要一口一口吃, 很多东西并非一蹴而就. 本文将简单实现一个可玩的俄罗斯方块版本. 下一步会引入AI, 最终采用coc ...

  8. H5版俄罗斯方块(3)---游戏的AI算法

    前言: 算是"long long ago"的事了, 某著名互联网公司在我校举行了一次"lengend code"的比赛, 其中有一题就是"智能俄罗斯方 ...

  9. H5版俄罗斯方块(4)---火拼对战的雏形

    前言: 勿忘初心, 本系列的目标是实现一款类似QQ"火拼系列"的人机对战版俄罗斯方块. 在完成了基本游戏框架和AI的算法探索后, 让我们来尝试一下人机大战雏形编写. 本系列的文章链 ...

随机推荐

  1. Angular2 小贴士 Name

    Angular2 正式版已经发布了一个月了,我也是通过各种方式在进行验证是否可以满足我们的需求,今天我就发现了一个问题.现在我们来一起说明一下,这个可能不算是bug,而应该需要我们记住就可以了. 我们 ...

  2. C#中级-常用多线程操作(持续更新)

    一.前言       多线程操作一直是编程的常用操作,掌握好基本的操作可以让程序运行的更加有效.本文不求大而全,只是将我自己工作中常常用到的多线程操作做个分类和总结.平时记性不好的时候还能看看.本文参 ...

  3. 居然是Firefox没有抛弃我们

    面向企业级市场,一款网页浏览器的很多特性不是说改就改,说丢弃就丢弃.就像微软不能抛弃IE一样,Firefox也有类似的定位和使命. Firefox即尝试提供企业级市场所需的特性稳定的软件版本(LTS) ...

  4. php的面向对象

    今天PO一段php的面向对象相关知识吧.面向对象的相关概念和理论知识是很抽象的,要结合现实中的事物来理解,这样有助于类比记忆.还有就是要多接触吧,量变引质变这个应该还是一个硬道理吧,有时候量够了的话, ...

  5. 分金币 bzoj 3293

    分金币(1s 128M)  coin [问题描述] 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的 ...

  6. 初识Git

    Git是目前世界上最先进的分布式版本控制系统.在Git诞生之前,我们一直使用的是集中式版本控制系统(如CVS.SVN等),那么两者有什么不同呢?分布式的优势又在哪里呢? 分布式vs集中式 集中式版本控 ...

  7. js picker webapp仿ios picker

    iosselect 在webapp下的一个picker组件 可以轻松实现各类选择器效果.比如地区选择 时间选择 日期选择等. 可以定制依赖关系,可以定制选择层级,可以定制高度 展示项数.无论你是px还 ...

  8. [deviceone开发]-do_Webview加载JQueryMobile的示例

    一.简介 JQueryMobile是JQuery的移动版,不过它并没有像JQuery那么成功.我们只是使用JQueryMobile来展示do_Webview加载第三方js框架.适合所有开发者.二.效果 ...

  9. 如何采用easyui tree编写简单角色权限代码

    首先每个管理员得对应一个角色: 而角色可以操作多个栏目,这种情况下我们可以采用tree多选的方式: 在页面上js代码: $('#Permission').dialog({ title: '栏目权限', ...

  10. LaunchScreen.storyboard启动图遇到的坑

    Xcode有时候在LaunchScreen.storyBoard中修改了启动图片之后,运行却没有效果,直接白屏,而往storyboard中拖插件是可以显示的,设置成Assets.xcassets中的其 ...