Buscaminas en C#


Buscaminas (Minesweeper en inglés) es un juego para un jugador cuyo objetivo es descubrir toda una cuadrícula sin destapar las minas. El mapa proporciona información sobre que casillas no se deben destapar mediante números que indican la cantidad de bombas cercanas. Este videojuego es muy conocido ya que viene incluido en todas las versiones del sistema operativo Windows desde su versión 3.0 (1990)

Recientemente he desarrollado una version de este juego en c# y he decido ponerla a disposición de todos los lectores de Informatica En Red. Este clon del buscaminas no está diseñado para ser ni muy eficiente, ni muy bonito, pero cumple su cometido a la perfección: entretener.

Buscaminas

Para aquellos con conocimientos de programación que estén interesados en su funcionamiento, el código fuente está disponible libremente

Descargar juego (.zip, 8 kB)

Descargar código fuente (.zip, 20 kB)

Anuncios

Visual Studio 2010. F#, un nuevo lenguaje para .NET


Tras hablaros el otro día sobre lo nuevo en C# 4.0 hoy quiero hablaros de otra de las interesantes incorporaciones en .NET Framework 4:  F#, un nuevo lenguaje de programación.

F#, a diferencia de los otros lenguajes para .NET, es un lenguaje funcional. Este paradigma, muy utilizado con propósitos académicos, es muy diferente al orientado a objetos y es quizás la causa de que no se usen este tipo de lenguajes en el ámbito comercial.

Sin embargo en F#, que lleva desarrollandose en Microsoft Research desde hace bastantes años, se ha sabido crear una estupenda interoperabilidad con los otros lenguajes del .NET (C#, VB.NET y C++/CLR).

Esta fuerte influencia nos permite utilizar todas las clases del framework y trabajar con ellas como si lo hiciéramos en C# o VB.NET con absoluta transparencia. De hecho, incluso se pueden crear  aplicaciones de Silverlight usando este estupendo lenguaje

En el ejemplo siguiente se puede ver como podemos crear un formulario de Windows Forms usando F#:
#light
open System.Drawing
open System.Windows.Forms
let form = new Form(BackColor = Color.Purple, Text = "Introducing WinForms")
Application.Run(form)

Otra función que se incluye es la consola interactiva de F# (fsi.exe), un interprete en el que podemos programar de forma dinámica, es decir, conforme vamos programando ir obteniendo los resultados.

Un ejemplo que ilustra bastante bien la utilidad del intérprete de F# es crear un formulario al cual podemos cambiar las propiedades cuando queramos.

> #light
open System.Drawing
open System.Windows.Forms
let form = new Form(BackColor=Color.Purple, Text="Introducing WinForms", Visible=true);;

Con este código crearíamos un formulario, pero si quisiéramos modificar por ejemplo el título pondríamos lo siguiente:

> form.Text <- "Un nuevo título!";;

También se podría, por poner otro ejemplo, modificar el color de fondo:

> form.BackColor <- Color.Red;;

Si estáis interesados en utilizar este F#  hay dos opciones: usando Visual Studio o si no tenéis acceso a él, (no sirven las versiones express) podeis descargar el compilador y el intérprte desde la web de Microsoft Research: research.microsoft.com/en-us/um/cambridge/projects/fsharp/release.aspx. También se puede descargar desde ese mismo sitio una versión para Mac y Linux a través de Mono, la implementación libre de .NET Framework.

Si no conocéis el lenguaje, que es lo más seguro, (yo estoy intentando todavía aprenderlo…) existe un tutorial de básico en español que podéis consultar en esta web o descargaros un libro en inglés y mucho mas completo tiutlado “Foundations of F#” desde aqui.

Visual Studio 2010: C# 4.0


Recientemente ha salido Visual Studio 2010, la última versión de la suite de programación de microsoft. Entre las novedades están las novedades están: un IDE mejorado con soporte para varios monitores, mejoras en el lenguaje C#, que alcanza su 4ª edición; y un nuevo lenguaje para .NET Framework: F#, que trataremos en un artículo próximo.

Una de las característica más comentadas de C# 4.0 son los “Parámetros Opcionales”, que ya estaban presentes en Visual Basic y que por fín llegan a C#.

En C# 3.0 y los anteriores si queríamos, por ejemplo, un método para sumar un distinto número de sumandos, era necesario sobrecargarlo como se muestra en el siguiente ejemplo:

int Sumar() { return Sumar(0, 0, 0, 0); }
int Sumar(int a) { return Sumar(a, 0, 0, 0); }
int Sumar(int a, int b) { return Sumar(a, b, 0, 0); }
int Sumar(int a, int b, int c) { return Sumar(a, b, c, 0); }
int Sumar(int a, int b, int c, int d) { return a + b + c + d; }

En C# 4 esto sería mucho más simple pues tan solo hace falta escribier un solo método con parámetros opcionales, a los que les indicamos sus valores predeterminados:

int Sumar(int a = 0, int b = 0, int c = 0, int d = 0) { return a + b + c + d; }

Si ahora quisiéramos utilizar esta función tendríamos varias posibilidades

int x = Util.Sumar();
int y = Util.Sumar(4, 3);
int z = Util.Sumar(b: 5, c: 7);

Como vemos, tenemos control total en los parámetros pudiendo omitir los que queramos de manera sencilla.

Ejemplos sacados de la web esasp.net

Portabilidad, la gran ventaja de .NET Framework y Mono


.NET y MonoDesde los inicios de la informática, uno de los grandes problemas ha sido la interoperabilidad entre los sistemas operativos y las diferentes arquitecturas de hardware. Esto quiere decir que un programa diseñado para un sistema operativo y un procesador concretos no puede ser ejecutado en nigún otro.

Los programas, independientemente del lenguaje en el que han sido escritos, son compilados en código máquina (código binario), el único lenguaje que es capaz de interpretar el hardware y que es específico para cada tipo de procesador. Además, debido a la complejidad de los sistemas actuales, los programas no pueden comunicarse directamente con la máquina y deben hacerlo a través de las librerías que proporcionan los sistemas operativos. Tomando en cuenta estos dos factores el software resultante solo puede ser ejecutado en máquinas determinadas.

Entonces, ¿Como podríamos construir software que fuera útil en cualquier plataforma? Muy simple, utilizando un lenguaje intermedio común a todos los sistemas operativos que sea convertido a cada arquitectura cuando sea necesario.

.NET Framework y Mono, la versión opensource de .NET Framework, hacen precisamente eso: al compilar un programa que hayamos escrito, no lo hacemos en código máquina, sino en un lenguaje intermedio conocido como CIL (Common Intermediate Language). Este lenguaje universal, al no ser cercano a la máquina, es independiente de ella y se puede utilizar en cualquier ordenador.

Pero, ¿No hemos dicho que los ordenadores solo entienden el código máquina? .NET Framework y Mono son máquinas virtuales cuya función es “traducir” el programa al lenguaje que cada ordenador entiende conforme se va ejecutando. De esta forma, lo único que dependerá de cada plataforma será la máquina virtual pues los programas serán interpretados al vuelo (a esto se le llama compilación Just-In-Time).

Esquema del funcionamiento de un programa en .NET Framework

¿Que ventajas aporta el tener un lenguaje único?

Como dice el título, la Portabilidad. Si yo compilo un programa en CIL podré ejecutarlo en cualquier plataforma que tenga alguna de estas dos máquinas virtuales.

Actualmente existen versiones para cualquier sistema operativo: Windows, GNU/Linux, Mac OS  y para móviles con Windows Mobile o iPhone OS (este último gracias a la plataforma Mono)

Como ejemplo de programa portable tenemos TomBoy, la conocida aplicación de notas para Gnome en GNU/Linux, que al estar escrita en C# podemos instalar no solo en Linux, sino en Windows o Mac OS sin hacer modificaciones en el código fuente. Para utilizarla además necesitamos GTK#, una versión en CIL de las librerías gráficas de Gnome, y que por tanto nos permitiría ejecutar cualquier programa que las utilice en cualquier sistema operativo.


Enlaces: