转载请标明是引用于 http://blog.csdn.net/chenyujing1234

例子代码:

http://www.rayfile.com/zh-cn/files/9d09926e-736b-11e1-b9a4-0015c55db73d/

设计思路:

由10*10组成,图案更不相同,为存储游戏画面中的图案方块,采用Block类二维数组blocks[10,10];

在定时器控制下,不停地统计用户的得分,并控制生命进度条,如果生命进度条为0,则游戏结束。

当用户鼠标连续选中两相邻块firstblock2和secondblock2,交换以后调用check()检测是否有符合消去

的方块,如果有被消去的方块则修改要绘制的图案代号rectan2[10,10]数组对应的元素值,不需要绘制为0.

通过按列统计rectan2数组0值,得出每列被消去的方块的个数,并调用fill()从游戏屏幕该列上方重新随机产生新的方块,

依次下移填充被削去方块,重画需要绘制的所有方块,从而看到动态效果。

下面介绍设计过程:

1、新建一C# windows窗体工程。

将Form1.cs改名为Start.cs

在解决方案中添加两个文件平:images sound并把相关图片与声音资源包含进来.

给Start窗体的ICON选择图片小狗.ico

2、窗体Start.cs添加新控件

progressBar记得value值选100

在加载声音pictureBox时为Image属性选择图片

在加入了statusStrip contextMenuStrip timer1后,接下来为statusStrip添加toolStripDropDownButton

方法是右击statusSctrip1右选择编辑项,然后从列表中选择toolStripDropDownButton1然后点添加

3、界面算是画好了,接下来开始进行代码设计.

新建Block.cs文件来定义方块的坐标位置、小方块图案、图案种类代号字段成员及访问相应的属性.

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using SuperPeng.Properties;
namespace SuperPeng
{
/*本类描述的对象是对对碰的每个小方块*/
class Block
{
private Point location; //小方块坐标
private Bitmap blockImage; //小方块图案
private int imageType;  //图片种类
public int ImageType//ImageType属性
{
get
{
return imageType;
}
}
public Point Location//Location属性
{
get
{
return location;
}
set
{
location= value;
}
}
public Block(int imageIndex,int x,int y)
{
location = new Point(x, y);
imageType = imageIndex;
//初始化小方块图案
switch (imageIndex)
{
case 1:
blockImage = Resources._1;
break;
case 2:
blockImage = Resources._2;
break;
case 3:
blockImage = Resources._3;
break;
case 4:
blockImage = Resources._4;
break;
case 5:
blockImage = Resources._5;
break;
case 6:
blockImage = Resources._6;
break;
case 7:
blockImage = Resources._7;
break;
case 8:
blockImage = Resources._8;
break;
default:
blockImage = Resources._4;
imageType = 4;
break;
}
}
/*画对象*/
public void Draw(Image img)
{
Graphics g = Graphics.FromImage(img);
Rectangle r = new Rectangle(location, new Size(50, 50));
g.DrawImage(blockImage, r);
}
public void DrawSelectedBlock(Graphics g)
{
//画选中方块的示意边框线
Pen myPen = new Pen(Color.Black, 3);
Rectangle r = new Rectangle(location, new Size(50, 50));
g.DrawRectangle(myPen, r);
}
public void ClearSelectedBlock(int x, int y, Graphics g)
{
//清除选中方块
}
}
}

Block()构造函数,参数提供了方块图案种类的代号imageIndex 及坐标位置(x,y),该构造函数中Switch(/case根据方块种类代号设置相应的方块图案。

Draw(方法将方块画在Image对象上,而不是游戏面板上,这样便于采用双缓冲技术。

DrawSelectedBlock将方块周围选中的示意边框线,这是直接画在传递过来的游戏面板上,而不是IMage对象上

4、接下来设计GameField.cs。

它是游戏实例,首先定义在游戏面板中存储所有方块的容器 ----  二维数组 blocks[10,10],记录要绘制方块的图案代号rectan2[10,10]数组

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Threading;
using System.Media;
using SuperPeng.Properties;
namespace SuperPeng
{
/*
* 场景大小:500×500
* 方块大小:50×50
*/
class GameField
{
public  IntPtr winHandle;
public  Image bufferImage;  //双缓存
public  Block[,] blocks=new Block[10,10]; //场景中所有的小图片
//存储绘制的方块图案带代号的数组,不需绘制的值为0
private int[,] rectan2 = new int[10, 10];
private int[] empty = new int[10];//每列有多少个可以消去方块
private int RowSames = 1; //检测到同行相同数
private int ColumSames = 1; //检测到同列相同数
private SoundPlayer sound = new SoundPlayer();
public  bool soundSwitch = true;//声音开关   true为开

游戏场景类GameField中生成场景中所有的Block方块对象,调用createAll画在游戏面板中

  /*生成场景中所有的对象*/
public void createAll()
{
Random rand = new Random();
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
{
Block b = new Block(rand.Next(8) + 1, j * 50, i * 50);
blocks[i, j] = b;
//rectan[i,j] = b.ImageType;//******************7-06
rectan2[i, j] = b.ImageType;
}
reDraw();
}

reDraw();采用双缓冲技术。先将所有的方块绘制在Image对象bufferImage上,然后将绘制好的bufferImage显示在游戏面板上.

exchange(int x1, int y1, int x2, int y2)交换选中两个相邻的方块

   /*交换两个方块,参数x,y为矩阵坐标*/
public void exchange(int x1, int y1, int x2, int y2)
{
//交换blocks
Block temp = blocks[x1, y1];
blocks[x1, y1] = blocks[x2, y2];
blocks[x2, y2] = temp;
交换rectan  //******************7-06
//rectan[x1, y1] = blocks[x1, y1].ImageType;
//rectan[x2, y2] = blocks[x2, y2].ImageType;
//交换rectan2
rectan2[x1, y1] = blocks[x1, y1].ImageType;
rectan2[x2, y2] = blocks[x2, y2].ImageType;
//交换坐标
Point tmploc = blocks[x1, y1].Location;
blocks[x1, y1].Location = blocks[x2, y2].Location;
blocks[x2, y2].Location = tmploc;
PlaySound("Exchange");
//重画一下
reDraw();
}

check()完成检测是否有3上以上方块对象有相同的图像并返回可以消除的方块个数。

若有超过3个(含3个)则保存要绘制方块的图案代号的rectan2[10,10]数组对应元素的值为0,通过统计rectan2数组0值,

得出每列被消去方块的个数及所有列被消去方块的总线.

  /*对对碰检测,返回可以消除方块对象的个数*/
public  int check()
{
//检测是否同行或列有超过3个一样
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
//for内开始
//行检测
if (j == 0)
RowSames = 1;
else
{
if (blocks[i, j - 1].ImageType == blocks[i, j].ImageType)//图案相同
RowSames++;
else
{
if (RowSames >= 3)
{
//该位置之前rowsames个格子的物体都要消除
for (int n = 1; n <= RowSames; n++)
rectan2[i, j - n] = 0;
}
RowSames = 1;
}
if (j==9&&RowSames >= 3)
{
//该位置之前rowsames个格子的物体都要消除
for (int n = 1; n <= RowSames; n++)
rectan2[i, 10 - n] = 0;
}
}
//列检测
if (j == 0)
ColumSames = 1;
else
{
if (blocks[j - 1, i].ImageType == blocks[j, i].ImageType)//图案相同
ColumSames++;
else
{
if (ColumSames >= 3)
{
//该位置之上的columsames个格子的物体要消除
for (int n = 1; n <= ColumSames; n++)
rectan2[j - n, i] = 0;
}
ColumSames = 1;
}
if (j==9&&ColumSames >= 3)
{
//该位置之前rowsames个格子的物体都要消除
for (int n = 1; n <= ColumSames; n++)
rectan2[10 - n, i] = 0;
}
}
//for内结束
}
}
RowSames = 1;
ColumSames = 1;
//检测每列有多少个空格
int temp=0;
int result = 0;//总和
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (rectan2[j, i] == 0)
temp++;
}
empty[i] = temp;
result += temp;
temp = 0;
}
//reDraw();
return result;
}

fill()从游戏屏幕该列上方重新随机产生新的方块,依次下移填充被削去的方块,重画需要绘制的所有方块

 /*生成填补*/
public  void fill()
{
Random rand = new Random();
for (int j = 0; j < 10;j++ ) //每列
{
if(empty[j] > 0)
{
for (int i = 0; i < 10; i++) //每行
{
while(rectan2[i, j] == 0)
{
if (i >0)
{//空格之后的所有图片向下移一位
for (int n = i-1; n>=0; n--)
down(n,j);
}
//填充最顶上一格方块
Block tb = new Block(rand.Next(8) + 1, j * 50,0 );
blocks[0, j] = tb;
//rectan[0, j] = tb.ImageType;
rectan2[0, j] = tb.ImageType;
}
}
//本来想在这里重画,不料令游戏速度太慢
}
}
PlaySound("AddScore");
//重画一下
reDraw();
}

C#开发------对对碰游戏相关推荐

  1. 用90%的c语言开发对对碰游戏,希望大家指点哈

    用90%的c语言开发对对碰游戏,希望大家指点哈 **还有部分是c++语言哈**第一次写博客哈,有什么不足望大家指出我能写出来也参考网上的一些代码哈 #include <iomanip> # ...

  2. C++开发对对碰游戏

    相信大家都玩过开心消消乐,对对碰游戏类似于开心消消乐,利用C++语言开发的小游戏,编译器vs2010版本开发. #include "stdafx.h" #include <g ...

  3. 程序员炫技:用c语言开发对对碰游戏,你打几分?

    我发现不少游戏都是这样,泡泡龙,对对碰,连连看,三重镇--众多游戏都是汇集三个单位便会进行消除.那么今天小编就用C语言开发出一款对对碰小游戏 这篇文章主要为大家分享了C语言对对碰游戏源码,具有一定的参 ...

  4. 对对碰java_Java开发学习之用Java打造一款对对碰游戏(下篇)

    本文主要向大家介绍了Java开发学习之用Java打造一款对对碰游戏,通过具体的内容向大家展现,希望对大家Java开发的学习有所帮助. 在之前的文章介绍了对对碰游戏的理论部分和介绍了JLabel.JBu ...

  5. Java游戏开发——对对碰

    游戏介绍: 对对碰游戏在n*n的游戏池中进行,每个格子中有一个图案.鼠标连续选中两个横排或竖排相邻的图案,它们的位置会互换,互换后如果横排或者竖排有3个以上相同的图像,则可以消去该图像,并得分. 游戏 ...

  6. Java课设对对碰_第11章对对碰游戏(图形版)(Java游戏编程原理与实践教程课件).ppt...

    游戏界面和相关图片素材 11.3 程序设计的步骤 11.3.1 设计游戏窗口类(GameRoom.java) 游戏窗口类GameRoom实现游戏全部功能,继承JFrame组件实现的.是由上方Panel ...

  7. Unity 简易的对对碰游戏

    游戏规则:制作对对碰游戏,在4X4地图上随机生成8对不同(形状)的物体,第一次点击被选中的物体会变红色,第二次点击相同物体,则两个物体共同消失,第二次点击是不同物体则第一个物体变回原来的颜色,再次点击 ...

  8. java对对碰游戏设计报告_手把手带你用Java打造一款对对碰游戏(下篇)

    上篇文章介绍了对对碰游戏的理论部分和介绍了JLabel.JButton.JPanel.ImageIcon.JTextField.JProgressBar等组件的基本使用,介绍了进度条(JProgres ...

  9. MATLAB学习笔记 实现超简单对对碰游戏

    对对碰游戏,通过匹配相同的图像来赢得游戏.使用 uicontrol 中的按钮和一些图像来实现这个游戏. 设计有一个 2 x 2 矩阵,其中隐藏了 2 对等效图像(读取文件夹下的图片,至少含有两张rgb ...

最新文章

  1. 网络工程师成长日记333-某城市政府项目
  2. pthreads v3在centos7下的安装与配置
  3. void slove C语言什么意思,菜鸟求助-如何用指针法将一串字符按单词的倒序输出?如:i love yo...
  4. 使用report COM_PRODUCT_DELETE_SINGLE删除product
  5. 全球异常高温:虾熟了我也要“熟”了
  6. 年度最强浏览器插件来袭,打造个人完美生产力
  7. 盘点wps函数公式大全
  8. access9磅字体是多_字体大小(几号-几磅)
  9. 前端快速上手APICloud App开发
  10. android平板评测,最火7吋Android平板 三星P1010全面评测
  11. 循环报错: 远程主机强迫关闭了一个现有的连接
  12. swift 时间时间戳获取及相互转换
  13. 2016年,对我影响最大的三本书
  14. 爬取最好大学网排名数据
  15. Linux软件包管理-rpm、yum
  16. 登录注册主页面的实现
  17. ns手柄pc驱动_PC和Switch通吃利器,北通宙斯精英手柄助你一臂之力!
  18. 路由器dhcp服务异常不能上网_路由器dhcp服务异常 关于路由器dhcp服务异常怎么办?...
  19. 试着用U盘做一个微PE启动盘
  20. matlab 基金业绩归因,5分钟搞定基金从业:绝对收益归因和相对收益归因

热门文章

  1. 单片机c语言编程实现中间向两边,再从两边向中间亮的程序流程图,单片机控制LED流水灯从中间向两边.doc...
  2. win10定时任务问题解决:任务尚未运行(0x41303)
  3. [附源码]计算机毕业设计JAVA面向服装集群企业的个性化定制服务系统
  4. 网络技能大赛做路由交换部分-赛前注意事项[非常重要]
  5. 单调队列优化DP 上 day46
  6. 防止别人蹭网的较常用方法
  7. 如何防止无线路由器被蹭网
  8. 微信小程序之退款功能
  9. 在Visual Basic 中使用C++ 类
  10. 青龙面板之小黄鸟抓包