排块游戏(陈景润“十五子游戏”编程实现)

const int N = 4; //按钮的行、列数

Button[,] buttons = new Button[N, N]; //按钮的数组

private void Form1_Load(object sender, EventArgs e)

{

//产生所有按钮

GenerateAllButtons();

}

private void button1_Click(object sender, EventArgs e)

{

//打乱顺序

Shuffle();

}

//打乱顺序

void Shuffle()

{

//多次随机交换两个按钮

Random rnd = new Random();

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

{

int a = rnd.Next(N);

int b = rnd.Next(N);

int c = rnd.Next(N);

int d = rnd.Next(N);

Swap(buttons[a, b], buttons[c, d]);

}

}

//生成所有的按钮

void GenerateAllButtons()

{

int x0 = 100, y0 = 10, w = 45, d = 50;

for (int r = 0; r < N; r++)

for (int c = 0; c < N; c++)

{

int num = r * N + c;

Button btn = new Button();

btn.Text = (num + 1).ToString();

btn.Top = y0 + r * d;

btn.Left = x0 + c * d;

btn.Width = w;

btn.Height = w;

btn.Visible = true;

btn.Tag = r * N + c; //这个数据用来表示它所在行列位置

//注册事件

btn.Click += new EventHandler(btn_Click);

buttons[r, c] = btn; //放到数组中

this.Controls.Add(btn); //加到界面上

}

buttons[N - 1, N - 1].Visible = false; //最后一个不可见

}

//交换两个按钮

void Swap(Button btna, Button btnb)

{

string t = btna.Text;

btna.Text = btnb.Text;

btnb.Text = t;

bool v = btna.Visible;

btna.Visible = btnb.Visible;

btnb.Visible = v;

}

//按钮点击事件处理

void btn_Click(object sender, EventArgs e)

{

Button btn = sender as Button; //当前点中的按钮

Button blank = FindHiddenButton(); //空白按钮

//判断是否与空白块相邻,如果是,则交换

if (IsNeighbor(btn, blank))

{

Swap(btn, blank);

blank.Focus();

}

//判断是否完成了

if (ResultIsOk())

{

MessageBox.Show("ok");

}

}

//查找要隐藏的按钮

Button FindHiddenButton()

{

for (int r = 0; r < N; r++)

for (int c = 0; c < N; c++)

{

if (!buttons[r, c].Visible)

{

return buttons[r, c];

}

}

return null;

}

//判断是否相邻

bool IsNeighbor(Button btnA, Button btnB)

{

int a = (int)btnA.Tag; //Tag中记录是行列位置

int b = (int)btnB.Tag;

int r1 = a / N, c1 = a % N;

int r2 = b / N, c2 = b % N;

if (r1 == r2 && (c1 == c2 - 1 || c1 == c2 + 1) //左右相邻

|| c1 == c2 && (r1 == r2 - 1 || r1 == r2 + 1))

return true;

return false;

}

//检查是否完成

bool ResultIsOk()

{

for (int r = 0; r < N; r++)

for (int c = 0; c < N; c++)

{

if (buttons[r, c].Text != (r * N + c + 1).ToString())

{

return false;

}

}

return true;

}

原文地址:https://www.cnblogs.com/chenlong991223/p/11245574.html

时间: 2024-10-17 12:01:08

排块游戏(陈景润“十五子游戏”编程实现)的相关文章

排块游戏 (c#实现)

一个小时候经常玩的游戏: 通过只移动空白处周围的小方块 最终将所有方块移动到目标位置即完成游戏 程序的逻辑并不难: 1.初始化所有(4X4)按钮属性(位置 ,大小,标号,是否可见) 和方法(点击按钮 交换),并按顺序排列 2.点击洗牌 开始游戏 (通过随机交换任意两个按钮X次) 3.每次点击某个按钮 判断是否在隐藏按钮周围,在周围则交换这两个按钮,否则无反应 4.每次点击按钮 判断所有按钮是否达到目标位置,达到则弹出消息窗口 Project是 Windows form  Application

开始写游戏 --- 第十五篇

今天主要做了以下工作: 1.创建虚拟数据. 2.完成 城市具体场景 中 交易功能的配置 上图: 1.创建虚拟数据. 2.完成 城市具体场景 中 交易功能的配置 这是配置文件: 这是使用方法: 这是效果: 可以看到,点击交易按钮,进入的商店场景后: 1.对话内容 根据配置而显示 2.商店背景 根据配置而显示 3.商店售卖的物品 也根据配置而显示 今天就到这里. 原文地址:https://www.cnblogs.com/dmc-nero/p/12003173.html

Java从零开始学四十五(Socket编程基础)

一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客户则

转:【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17290021 在http://blog.csdn.net/ns_code/article/details/17288243这篇博文中,讲述了通过同步实现内存可见性的方法,在http://blog.csdn.net/ns_code/article/details/17101369这篇博文中,讲述了通过volatile变量实现内存可见性的方法,这里比较下二者的区别. 1.volatile变量

【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量

在http://blog.csdn.net/ns_code/article/details/17288243这篇博文中,讲述了通过同步实现内存可见性的方法,在http://blog.csdn.net/ns_code/article/details/17101369这篇博文中,讲述了通过volatile变量实现内存可见性的方法,这里比较下二者的区别. 1.volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种

由几道JS笔试题引发的知识点探究十五——JS面向对象编程

JS初学者大都没有认识到其强大的面向对象编程的特性,只是把JS当作一门简单实用的脚本语言来用.也正因如此,JS程序员往往处于程序员鄙视链的最低端,很多人觉得JS是HTML一类的语言,甚至连语言都称不上.事实完全不是如此,你若也有这种想法,说明你对JS的认识太浅薄了.要想正真迈入JS的大门,你必须深入了解JS面向对象编程的特性.下面就让我为大家一一道来. 一.创建对象 既然是面向对象,那肯定先得有对象吧,要有对象,肯定得知道对象是什么吧,那JS中的对象是什么呢?在C++里我们知道,对象就是类或结构

C Primer Plus (第五版) 第十五章 位操作 编程练习

1.编写一个将二进制字符串转化为数字值的函数.也就是说,如果您有以下语句: char * pbin = "01001001"; 那么您可以将pbin作为一个参数传送给该函数,使该函数返回一个int的值25 #include <stdio.h> int bitoi(char *); int main(void) { char * pbin = "00011001"; printf("二进制:%s 等于十进制止:%d\n", pbin, 

C++primer第十五章. 面向对象编程

面向对象编程基于三个基本概念:数据抽象.继承和动态绑定. 15.1. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism). 之所以称通过继承而相关联的类型为多态类型,是因为在许多情况下可以互换地使用派生类型或基类型的“许多形态”.正如我们将看到的,在 C++ 中,多态性仅用于通过继承而相关联的类型的引用或指针. 继承 派生类(derived class)能够继承基类(baseclass)定义的成员,派生类可以无须改变而使用那些与派生类型具体特性不相关的操作,派生类可以

《疯狂Java讲义》(三十五)---- 网络编程

Java网络通信非常简单,服务器端通过ServerSocket建立监听,客户端通过Socket连接到指定服务器后,通信双方就可以通过IO流进行通信. IP地址用于唯一地标识网络中的一个通信实体.端口用于表示数据交给哪个通信程序处理. 公认端口从0到1023,紧密绑定一些特定的服务.注册端口从1024到49151,应用程序通常应该使用这个范围的端口.动态端口从49152到65535,是应用程序使用的动态端口,应用程序一般不会主动使用这些端口. package com.ivy.net; import