C#实现俄罗斯方块基本功能

本文实例为大家分享了C#实现俄罗斯方块的具体代码,供大家参考,具体内容如下

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace 俄罗斯方块
{
 public partial class MainForm : Form
 {
 public MainForm()
 {
  InitializeComponent();
 }
 PictureBox pb;
 const int w = 10;
 const int h = 20;
 const int a = 40;
 int speed = 400;
 int marks = 0;
 bool gameoverflag = false;
 int[,] p = new int[w, h];
 int[,] c = new int[w, h];
 int[,] c_old = new int[w, h];
 Timer timer;

 void MainForm_Load(object sender, EventArgs e)
 {
  this.StartPosition = FormStartPosition.CenterScreen;
  this.AutoSize = true;
  this.MaximizeBox = false;
  this.FormBorderStyle = FormBorderStyle.FixedSingle;
  pb = new PictureBox();
  pb.Margin = new Padding(0, 0, 0, 0);
  pb.Width = w * a;
  pb.Height = h * a;
  pb.Location = new Point(0, 0);
  pb.BackColor = Color.LightGray;
  this.Controls.Add(pb);
  this.KeyDown += new KeyEventHandler(MainForm_KeyDown);
  this.KeyUp += new KeyEventHandler(MainForm_KeyUp);
  for(int i = 0; i < w; i++)
  {
  for(int j = 0; j < h; j++)
  {
   p[i, j] = 0;
  }
  }
  c = make_diamond(0);
  c_old = make_emptydiamond();
  timer = new Timer();
  timer.Interval = speed;
  timer.Tick += new EventHandler(timer_Tick);
  draw();
 }

 void timer_Tick(object sender, EventArgs e)
 {
  if(isequal(c, c_old))
  {
  p = add_p_c(c);
  int[] l_temp = detect_fullline();
  int lines = 0;
  for(int i = 0; i < h; i++)
  {
   if(l_temp[i] == 1)
   {
   lines++;
   }
  }
  marks += lines * lines;
  p = clear_fullline();
  if(isgameover())
  {
   timer.Enabled = false;
   gameoverflag = true;
   MessageBox.Show("Game Over!");
   return;
  }
  c = make_diamond(0);
  c_old = make_emptydiamond();
  }
  else if(isequal(c, move_down()))
  {
  c_old = c;
  }
  else if(!isequal(c, move_down()))
  {
  c = move_down();
  }
  draw();
  this.Text = "俄罗斯方块 得分:" + marks.ToString();
 }

 int[,] make_diamond(int n)
 {
  int[,] c_temp = new int[w, h];
  for(int i = 0; i < w; i++)
  {
  for(int j = 0; j < h; j++)
  {
   c_temp[i, j] = 0;
  }
  }
  switch (n)
  {
  case 0:
   int seed = (int)DateTime.Now.Millisecond;
   Random rd = new Random(seed);
   return make_diamond(rd.Next(1, 25));
  case 1:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[0, 2] = 1;
   c_temp[0, 3] = 1;
   break;
  case 2:
   c_temp[0, 0] = 1;
   c_temp[1, 0] = 1;
   c_temp[2, 0] = 1;
   c_temp[3, 0] = 1;
   break;
  case 3:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[1, 1] = 1;
   c_temp[1, 2] = 1;
   break;
  case 4:
   c_temp[1, 0] = 1;
   c_temp[2, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[1, 1] = 1;
   break;
  case 5:
   c_temp[0, 1] = 1;
   c_temp[0, 2] = 1;
   c_temp[1, 0] = 1;
   c_temp[1, 1] = 1;
   break;
  case 6:
   c_temp[0, 0] = 1;
   c_temp[1, 0] = 1;
   c_temp[1, 1] = 1;
   c_temp[2, 1] = 1;
   break;
  case 7:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[0, 2] = 1;
   c_temp[1, 1] = 1;
   break;
  case 8:
   c_temp[0, 0] = 1;
   c_temp[1, 0] = 1;
   c_temp[1, 1] = 1;
   c_temp[2, 0] = 1;
   break;
  case 9:
   c_temp[0, 1] = 1;
   c_temp[1, 0] = 1;
   c_temp[1, 1] = 1;
   c_temp[1, 2] = 1;
   break;
  case 10:
   c_temp[0, 1] = 1;
   c_temp[1, 0] = 1;
   c_temp[1, 1] = 1;
   c_temp[2, 1] = 1;
   break;
  case 11:
   c_temp[0, 0] = 1;
   c_temp[1, 0] = 1;
   c_temp[1, 1] = 1;
   c_temp[1, 2] = 1;
   break;
  case 12:
   c_temp[0, 1] = 1;
   c_temp[1, 1] = 1;
   c_temp[2, 0] = 1;
   c_temp[2, 1] = 1;
   break;
  case 13:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[0, 2] = 1;
   c_temp[1, 2] = 1;
   break;
  case 14:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[1, 0] = 1;
   c_temp[2, 0] = 1;
   break;
  case 15:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[0, 2] = 1;
   c_temp[1, 0] = 1;
   break;
  case 16:
   c_temp[0, 0] = 1;
   c_temp[1, 0] = 1;
   c_temp[2, 0] = 1;
   c_temp[2, 1] = 1;
   break;
  case 17:
   c_temp[0, 2] = 1;
   c_temp[1, 0] = 1;
   c_temp[1, 1] = 1;
   c_temp[1, 2] = 1;
   break;
  case 18:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[1, 1] = 1;
   c_temp[2, 1] = 1;
   break;
  case 19:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[1, 0] = 1;
   c_temp[1, 1] = 1;
   break;
  case 20:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[1, 0] = 1;
   c_temp[1, 1] = 1;
   break;
  case 21:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[1, 0] = 1;
   c_temp[1, 1] = 1;
   break;
  case 22:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[1, 0] = 1;
   c_temp[1, 1] = 1;
   break;
  case 23:
   c_temp[0, 0] = 1;
   c_temp[0, 1] = 1;
   c_temp[0, 2] = 1;
   c_temp[0, 3] = 1;
   break;
  case 24:
   c_temp[0, 0] = 1;
   c_temp[1, 0] = 1;
   c_temp[2, 0] = 1;
   c_temp[3, 0] = 1;
   break;
  }
  return c_temp;
 }

 int[,] add_p_c(int[,] c_temp)
 {
  int[,] p_temp = new int[w, h];
  for(int i = 0; i < w; i++)
  {
  for(int j = 0; j < h; j++)
  {
   p_temp[i, j] = p[i, j] + c_temp[i, j];
  }
  }
  return p_temp;
 }

 int[] detect_border()
 {
  int i_min = w;
  int i_max = -1;
  int j_min = h;
  int j_max = -1;
  for(int i = 0; i < w; i++)
  {
  for(int j = 0; j < h; j++)
  {
   if(c[i, j] != 0)
   {
   i_min = i;
   break;
   }
  }
  if(i_min != w)
  {
   break;
  }
  }
  for(int i = w - 1; i >= 0; i--)
  {
  for(int j = 0; j < h; j++)
  {
   if(c[i, j] != 0)
   {
   i_max = i;
   break;
   }
  }
  if(i_max != -1)
  {
   break;
  }
  }
  for(int j = 0; j < h; j++)
  {
  for(int i = 0; i < w; i++)
  {
   if(c[i, j] != 0)
   {
   j_min = j;
   break;
   }
  }
  if(j_min != h)
  {
   break;
  }
  }
  for(int j = h - 1; j >= 0; j--)
  {
  for(int i = 0; i < w; i++)
  {
   if(c[i, j] != 0)
   {
   j_max = j;
   break;
   }
  }
  if(j_max != -1)
  {
   break;
  }
  }
  int[] border = {j_min, j_max, i_min, i_max};//上下左右边界
  return border;
 }

 bool overlap(int[,] c_temp)
 {
  bool bl = false;
  int[,] p_temp = add_p_c(c_temp);
  for(int i = 0; i < w; i++)
  {
  for(int j = 0; j < h; j++)
  {
   if(p_temp[i, j] > 1)
   {
   return true;
   }
  }
  }
  return bl;
 }

 int[,] make_emptydiamond()
 {
  int[,] c_temp = new int[w, h];
  for(int i = 0; i < w; i++)
  {
  for(int j = 0; j < h; j++)
  {
   c_temp[i, j] = 0;
  }
  }
  return c_temp;
 }

 bool isempty(int[,] c_temp)
 {
  bool bl = true;
  for(int i = 0; i < w; i++)
  {
  for(int j = 0; j < h; j++)
  {
   if(c_temp[i, j] > 0)
   {
   return false;
   }
  }
  }
  return bl;
 }

 bool isequal(int[,] c1, int[,] c2)
 {
  bool bl = true;
  for(int i = 0; i < w; i++)
  {
  for(int j = 0; j < h; j++)
  {
   if(c1[i, j] != c2[i, j])
   {
   return false;
   }
  }
  }
  return bl;
 }

 int[] detect_fullline()
 {
  int[] l = new int[h];
  for(int i = 0; i < h; i++)
  {
  l[i] = 1;
  }
  for(int j = 0; j < h; j ++)
  {
  for(int i = 0; i < w; i++)
  {
   if(p[i, j] == 0)
   {
   l[j] = 0;
   break;
   }
  }
  }
  return l;
 }

 int[,] clear_fullline()
 {
  int[,] p_temp = make_emptydiamond();
  int flag = h - 1;
  int[] l = detect_fullline();
  for(int i = h - 1; i >= 0; i--)
  {
  if(l[i] == 0)
  {
   for(int j = 0; j < w; j++)
   {
   p_temp[j, flag] = p[j, i];
   }
   flag--;
  }
  }
  return p_temp;
 }

 bool isgameover()
 {
  bool bl = false;
  for(int i = 0; i < w; i++)
  {
  if(p[i, 0] > 0)
  {
   return true;
  }
  }
  return bl;
 }

 int[,] turn()
 {
  int[,] c_temp = make_emptydiamond();
  int[] border_temp = detect_border();
  int u = border_temp[0];
  int d = border_temp[1];
  int l = border_temp[2];
  int r = border_temp[3];
  if(!(w - 1 - l < d - u || h - 1 - u < r - l))
  {
  if(r - l == 1 && d - u == 1)
  {
   return c;
  }
  else if(r - l == 3)
  {
   c_temp[l, u] = c[l, u];
   c_temp[l, u + 1] = c[l + 1, u];
   c_temp[l, u + 2] = c[l + 2, u];
   c_temp[l, u + 3] = c[l + 3, u];
  }
  else if(d - u == 3)
  {
   c_temp[l, u] = c[l, u];
   c_temp[l + 1, u] = c[l, u + 1];
   c_temp[l + 2, u] = c[l, u + 2];
   c_temp[l + 3, u] = c[l, u + 3];
  }
  else if(r - l == 2)
  {
   c_temp[l, u] = c[l, u + 1];
   c_temp[l + 1, u] = c[l, u];
   c_temp[l, u + 1] = c[l + 1, u + 1];
   c_temp[l + 1, u + 1] = c[l + 1, u];
   c_temp[l, u + 2] = c[l + 2, u + 1];
   c_temp[l + 1, u + 2] = c[l + 2, u];
  }
  else if(d - u == 2)
  {
   c_temp[l, u] = c[l, u + 2];
   c_temp[l + 1, u] = c[l, u + 1];
   c_temp[l + 2, u] = c[l, u];
   c_temp[l, u + 1] = c[l + 1, u + 2];
   c_temp[l + 1, u + 1] = c[l + 1, u + 1];
   c_temp[l + 2, u + 1] = c[l + 1, u];
  }
  }
  if(overlap(c_temp) || isempty(c_temp))
  {
  return c;
  }
  return c_temp;
 }

 int[,] move_down()
 {
  int[,] c_temp = make_emptydiamond();
  if(!(detect_border()[1] == h - 1))
  {
  for (int i = 0; i < w; i++)
        {
          for (int j = 1; j < h; j++)
          {
            c_temp[i, j] = c[i, j - 1];
          }
        }
  }
  if(overlap(c_temp) || isempty(c_temp))
  {
  return c;
  }
  return c_temp;
 }

 int[,] move_left()
 {
  int[,] c_temp = make_emptydiamond();
  if(!(detect_border()[2] == 0))
  {
  for (int j = 0; j < h; j++)
        {
          for (int i = 0; i < w - 1; i++)
          {
            c_temp[i, j] = c[i + 1, j];
          }
        }
  }
  if(overlap(c_temp) || isempty(c_temp))
  {
  return c;
  }
  return c_temp;
 }

 int[,] move_right()
 {
  int[,] c_temp = make_emptydiamond();
  if(!(detect_border()[3] == w - 1))
  {
  for (int j = 0; j < h; j++)
        {
          for (int i = 1; i < w; i++)
          {
            c_temp[i, j] = c[i - 1, j];
          }
        }
  }
  if(overlap(c_temp) || isempty(c_temp))
  {
  return c;
  }
  return c_temp;
 }

 void draw()
 {
  int[,] p_temp = add_p_c(c);
  Bitmap bmp = new Bitmap(pb.Width, pb.Height);
  Graphics g = Graphics.FromImage(bmp);
  g.FillRectangle(new SolidBrush(pb.BackColor), new Rectangle(0, 0, pb.Width, pb.Height));
  for(int i = 1; i < w; i++)
  {
  g.DrawLine(new Pen(Color.Black, 1), i * a, 0, i * a, h * a);
  }
  for(int j = 1; j < h; j++)
  {
  g.DrawLine(new Pen(Color.Black, 1), 0, j * a, w * a, j * a);
  }
  for(int i = 0; i < w; i++)
  {
  for(int j = 0; j < h; j++)
  {
   switch(p_temp[i, j])
   {
   case 1:
    g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(a * i, a * j, a, a));
    break;
   default:
    break;
   }
  }
  }
  pb.Image = bmp;
  GC.Collect();
 }

 void MainForm_KeyDown(object sender, KeyEventArgs e)
 {
  if(gameoverflag)
  {
  return;
  }
  switch (e.KeyData)
  {
  case Keys.W:
   c = turn();
   break;
  case Keys.Up:
   c = turn();
   break;
  case Keys.S:
   timer.Interval = speed / 10;
   break;
  case Keys.Down:
   timer.Interval = speed / 10;
   break;
  case Keys.A:
   c = move_left();
   break;
  case Keys.Left:
   c = move_left();
   break;
  case Keys.D:
   c = move_right();
   break;
  case Keys.Right:
   c = move_right();
   break;
  case Keys.Space:
   timer.Enabled = timer.Enabled == false ? true : false;
   break;
  default:
   break;
  }
  draw();
 }

 void MainForm_KeyUp(object sender, KeyEventArgs e)
 {
  if(e.KeyData == Keys.S || e.KeyData == Keys.Down)
  {
  timer.Interval = speed;
  }
 }
 }
}

很短点的一段代码,实现了俄罗斯方块的基本功能,可以很方便的修改和扩展。

更多俄罗斯方块精彩文章请点击专题:俄罗斯方块游戏集合 进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于C#实现俄罗斯方块游戏

    最近在看C#,写了一个很水的方块游戏练手. 代码: namespace game { class Square { public Square() { state = 0; positionY = 0; positionX = 0; } public Square(int InitShapeCnt, int InitState) { state = InitState; positionY = 0; positionX = 0; InitShape(InitShapeCnt); } public

  • C#实现简单俄罗斯方块

    最近在看<.NET游戏编程入门经典 C#篇> 第一章介绍了如何制作俄罗斯方块,自己试了试按照书上的步骤,可算是完成了. 于是写下这篇文章留作纪念. 1.类的设计 在充分分析游戏的特点后,游戏大概可以分为3个类:Square 小正方形,Block 由4个小正方形组合成的一个图形, GameField 游戏的驱动引擎 2.代码的编写 按照从小到大,从简单到复杂的顺序,先完成Square类,Square很简单,只需要提供Show,Hide方法以及Size,Location属性. 接下来是Block,

  • C#实现俄罗斯方块基本功能

    本文实例为大家分享了C#实现俄罗斯方块的具体代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace 俄罗斯方块 { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } PictureBox p

  • Python控制台输出俄罗斯方块移动和旋转功能

    今天填一个坑,俄罗斯方块!! 俄罗斯方块的移动不难实现,但是旋转就不太容易实现,究其原因是因为Python中没有数组这种数据结构,所以不能用矩阵的公式.今天把旋转做出来了,刚好整理一下,把之前的都整合在一起 这两天浏览量有点离谱,说明一下,我没有使用pygame,只是在控制台可以打印.移动和旋转生成的俄罗斯方块星号图形 俄罗斯方块-打印 功能:输入字母,打印俄罗斯方块的*图形 # 尽可能吧俄罗斯方块放在中间 Tetris = {'L': [[1, 1], [1, 2], [1, 3], [2,

  • Python控制台输出俄罗斯方块的方法实例

    今天填一个坑,俄罗斯方块!! 俄罗斯方块的移动不难实现,但是旋转就不太容易实现,究其原因是因为Python中没有数组这种数据结构,所以不能用矩阵的公式.今天把旋转做出来了,刚好整理一下,把之前的都整合在一起 俄罗斯方块-打印 功能:输入字母,打印俄罗斯方块的*图形 # 尽可能吧俄罗斯方块放在中间 Tetris = {'L': [[1, 1], [1, 2], [1, 3], [2, 3]], 'O': [[1, 1], [2, 1], [1, 2], [2, 2]], 'J': [[2, 1],

  • 用Python编写一个简单的俄罗斯方块游戏的教程

    俄罗斯方块游戏,使用Python实现,总共有350+行代码,实现了俄罗斯方块游戏的基本功能,同时会记录所花费时间,消去的总行数,所得的总分,还包括一个排行榜,可以查看最高记录. 排行榜中包含一系列的统计功能,如单位时间消去的行数,单位时间得分等. 附源码: from Tkinter import * from tkMessageBox import * import random import time #俄罗斯方块界面的高度 HEIGHT = 18 #俄罗斯方块界面的宽度 WIDTH = 10

  • HTML5 实现的一个俄罗斯方块实例代码

    示例简单,运行地址为:http://chendd.cn/demo/html/canvas/elsfk.html,得需要支持html5浏览器的环境. 实现的功能:方块旋转(W键).自动下落.移动(ASD).消行.快速下落(空格键).下落阴影.游戏结束. 为实现功能:消行时的计分.等级.以及不同等级的下落速度等. 学习了xiaoE的Java版本的俄罗斯方块后,自己动手使用html5的canvas实现的, 参考效果图如下: 详细代码如下: <!DOCTYPE html> <html> &

  • Java游戏俄罗斯方块的实现实例

    Java游戏俄罗斯方块的实现实例 java小游戏主要理解应用java Swing,awt等基础组件的知识,通过本例应当掌握面向对象的知识. 实现代码: package cn.hncu.games; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import

  • 原生JavaScript编写俄罗斯方块

    首先这里感谢@jdkleo  提出的宝贵建议! 说实在的吧,我这个俄罗斯方块大家玩起来别骂我就万岁了,还没完全完成的,只完成了50%,而且还有很多BUG. 可以实现的功能: 1.掉方块 2.随机生成新方块 3.方块移动. 目前BUG还很多,由于是第一次写这么"大"的游戏,有1000多行代码,所以还请高人指点,BUG太多了. 按START开始游戏. 大家提提建议,我第一次写JS游戏. 参考了一下网上其他人的代码,但是不是照抄. 代码可以直接运行,不用引用JQUERY. 希望大神们能给点建

  • JS+Canvas实现的俄罗斯方块游戏完整实例

    本文实例讲述了JS+Canvas实现的俄罗斯方块游戏.分享给大家供大家参考,具体如下: 试玩(没有考虑兼容低版本浏览器): ********************************************************************** 9月3日更新: 修复了隐藏的比较深的BUG 加上暂停.再来一次功能 速度随分数增高而递减 添加log日志 ****************************************************************

  • Java 小游戏开发之俄罗斯方块

    Java项目 俄罗斯方块 一.心得 二.游戏实例 游戏截图 目录结构 三.代码 1.主界面 Tetris.java package com.fry.tetris; import java.util.Arrays; import java.util.Random; /** * 4格方块 */ public class Tetromino { protected Cell[] cells = new Cell[4]; /** 保存旋转的相对于轴位置状态 */ protected State[] st

  • Java俄罗斯方块小游戏

    去年就已经学了这个技术了,一直没去写,现在抽个时间写了个俄罗斯方块游戏. 只有简单的新游戏,暂停,继续,积分功能.简单的实现了俄罗斯的经典功能. 不介绍了,有兴趣的自己运行一下,后面贴出了图片. 代码: package cn.hncu; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.Act

随机推荐