俄罗斯方块C#版
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#版的更多相关文章
- 俄罗斯方块SDK版
前言 本来可以从俄罗斯方块控制台版改一版, 将UI接口换掉, 变成SDK版. 正好放假了, 有时间. 就用了一个星期来重头做一个新版, 享受一下静下心来, 有条不紊干活的感觉^_^ 这个工程用来验证S ...
- Pascal小游戏 俄罗斯方块怀旧版
俄罗斯方块怀旧版(注释版) {$APPTYPE GUI}{$MODE DELPHI}program WinPiece; usesWindows; constAppName = 'WinPiece';p ...
- python tkinter实现俄罗斯方块 基础版
本项目最终效果见本人b站投稿av81480858 简介部分 本项目最终代码已上传github: https://github.com/BigShuang/Tetris 的1_BASIC文件夹 .其中1 ...
- 俄罗斯方块 UWP 版
UWP跟 WPF编程模型一致,不过UWP做了精简,而且不同的系统的API还略有不同.不同的地方有以下几点: 1.动画.动画除了故事版,还有其它的实现方式. 2.异步方法.UWP中的方法调用,大部分都是 ...
- 还是俄罗斯方块之android版
前面的,口水话 请直接跳过. 虽然现在不比以前了 也没多少人气了,放到首页 都不到几百的点击量.也许博客园整体水平也是在往水的方向发展.不谈那些了,哥也曾经辉煌过 有过一天上千的点击量 ,哥也曾经有过 ...
- H5版俄罗斯方块(1)---需求分析和目标创新
前言: 俄罗斯方块和五子棋一样, 规则简单, 上手容易. 几乎每个开发者, 都会在其青春年华时, 签下"xx到此一游". 犹记得大一老师在布置大程作业的时候提过: "什么 ...
- H5版俄罗斯方块(2)---游戏的基本框架和实现
前言: 上文中谈到了H5版俄罗斯方块的需求和目标, 这次要实现一个可玩的版本. 但饭要一口一口吃, 很多东西并非一蹴而就. 本文将简单实现一个可玩的俄罗斯方块版本. 下一步会引入AI, 最终采用coc ...
- H5版俄罗斯方块(3)---游戏的AI算法
前言: 算是"long long ago"的事了, 某著名互联网公司在我校举行了一次"lengend code"的比赛, 其中有一题就是"智能俄罗斯方 ...
- H5版俄罗斯方块(4)---火拼对战的雏形
前言: 勿忘初心, 本系列的目标是实现一款类似QQ"火拼系列"的人机对战版俄罗斯方块. 在完成了基本游戏框架和AI的算法探索后, 让我们来尝试一下人机大战雏形编写. 本系列的文章链 ...
随机推荐
- 自己手写的自动完成js类
在web开发中,为了提高用户体验,会经常用到输入框的自动完成功能,不仅帮助用户进行快速输入,最重要的是帮助那些“记不全要输入什么”的用户进行选择.这个功能有很多插件已经实现了,为了适应项目的特殊需求, ...
- 如果你也会C#,那不妨了解下F#(6):面向对象编程之“类”
前言 面向对象的思想已经非常成熟,而使用C#的程序员对面向对象也是非常熟悉,所以我就不对面向对象进行介绍了,在这篇文章中将只会介绍面向对象在F#中的使用. F#是支持面向对象的函数式编程语言,所以你用 ...
- Docker 基础 : 数据管理
用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这必然涉及容器的数据管理操作.容器中管理数据主要有两种方式:数据 ...
- FastSocket学习笔记~再说客户端与服务端的组成
废话多说 很久之前,我写过几篇FastSocket的文章,基本属于使用的方法,而缺乏对概念的总结讲解,而本讲就是弥补一下上几讲的不足,将核心的模块再说说,再谈谈,再聊聊! 首先FastSocket由C ...
- Boost条件变量condition_variable_any
Boost条件变量可以用来实现线程同步,它必须与互斥量配合使用.使用条件变量实现生产者消费者的简单例子如下,需要注意的是cond_put.wait(lock)是在等待条件满足.如果条件不满足,则释放锁 ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)
硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...
- awk应用
h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...
- 深入理解javascript选择器API系列第二篇——getElementsByClassName
× 目录 [1]使用 [2]classList [3]扩展 前面的话 既然有getElementById()和getElementsByTagName()方法,为什么没有getElementsByCl ...
- 分别用ToolBar和自定义导航栏实现沉浸式状态栏
一.ToolBar 1.在build.gradle中添加依赖,例如: compile 'com.android.support:appcompat-v7:23.4.0' 2.去掉应用的ActionBa ...
- 软件工程第二次作业——git的使用
1. 参照 http://www.cnblogs.com/xinz/p/3803109.html 的第一题,每人建立一个GitHub账号,组长建立一个Project,将本组成员纳入此Porject中的 ...