Auto Busca minas

Robots la parte programada en el ordenador, cibernetica, autoguiado del pc, algoritmos, recursividad
Responder
Avatar de Usuario
Juanchi
Aprendiz de Mago
Mensajes: 33
Registrado: 26 Mar 2010, 00:24

Auto Busca minas

Mensaje por Juanchi »

Emmm no se si va aca, pero igual.

Alguien me podria decir como funciona ese programa q "juega" al Busca minas solo ?



Y si tubieran tambien el codigo fuente...
Me han dicho que es x algo de los pixeles pero no se bien como funciona...

Salu2!
Y gracias desde ya... :smt003
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-

Imagen
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Auto Busca minas

Mensaje por BasicOs »

Hola
Está ahora en la sección de Ocr,IA. :smt032 :smt031 :smt030 :smt030 buscando máquinas inteligentes :)
hay unos cuantos posts sobre el buscaminas, usando las funciones pixels, y algo de algoritmos, etc... "inteligencia" Artificial si quieres llamarlo así..

Ves que va pasando por cada cuadrito y en ese momento va procesando los pixeles, como un captcha, haciendo un reconocimiento de lo que se muestra en el buscaminas.
Una búsqueda en el foro soluciona el problema, hay muchas maneras de solucionarlo como el ajedréz, muchas maneras de llegar al objetivo y de crear el ALGORITMO
http://www.emesn.com/autoitforum/search ... buscaminas

Salu22:)
Avatar de Usuario
Juanchi
Aprendiz de Mago
Mensajes: 33
Registrado: 26 Mar 2010, 00:24

Re: Auto Busca minas

Mensaje por Juanchi »

XD
Eso me pasa x no buscar jeje...
Gracias :smt003
__________________________________________________________
-=Editado=-
Ya entendi como funciona... pero igual me gustaria ver el code :smt003
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-

Imagen
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Auto Busca minas

Mensaje por BasicOs »

Con una busqueda de defuse.au3 se encuentra rápido xDDD :smt020 :smt020 :smt024
En inglés, Minesweeper es buscaminas, posiblemente hay que modificarlo para la versión del buscaminas que uses, pero la lógica está aquí:

Código: Seleccionar todo

#include <GUIConstants.au3>
#NoTrayIcon
If WinExists('Defuse') Then Exit
$aq = 0
While 1
	If WinExists('Minesweeper') Then
	Else
		GUICreate('Defuse', 150, 45)
		GUICtrlCreateLabel('Empieza el buscaminas!', 10, 0, 135, 15)
		GUICtrlCreateLabel('Created by: Sean Buckley', 10, 15, 135, 15)
		GUICtrlCreateLabel('Email: [email protected]', 10, 30, 135, 15)
		GUISetState()
	EndIf
	Do
		$m = GUIGetMsg()
		If $m = -3 Then Exit
	Until WinExists('Minesweeper')
	GUIDelete()
	GUICreate('Defuse', 77, 17, -100, -100, $WS_POPUP, $WS_EX_TOPMOST)
	$exit = GUICtrlCreateButton('Exit', -1, -1, 30, 19)
	$gob = GUICtrlCreateButton('Defuse', 38, -1, 40, 19)
	GUISetState()
	WinActivate('Minesweeper')
	While WinExists('Minesweeper')
		$m = GUIGetMsg()
		If $m = -3 Or $m = $exit Then Exit
		If $m = $gob Then first()
		If WinActive('Minesweeper') Or WinActive('Defuse') Then
			$i = WinGetPos('Minesweeper')
			If IsArray($i) Then WinMove('Defuse', '', $i[0] + 80, $i[1] + 30)
		Else
			WinMove('Defuse', '', -100, -100)
		EndIf
		$dimention = WinGetClientSize('Minesweeper')
		If IsArray($dimention) Then
			If $dimention[0] = 500 Then
				$hibox = 16
				$widebox = 30
			EndIf
			If $dimention[0] = 276 Then
				$hibox = 16
				$widebox = 16
			EndIf
			If $dimention[0] = 164 Then
				$hibox = 9
				$widebox = 9
			EndIf
		EndIf
	WEnd
	GUIDelete()
WEnd
Func first()
	$qw = 0
	WinActivate('Minesweeper')
	$dimention = WinGetClientSize('Minesweeper')
	If $dimention[1] = 319 Then
		If $dimention[0] = 500 Then $qw = 1
		If $dimention[0] = 276 Then $qw = 1
	EndIf
	If $dimention[1] = 207 Then
		If $dimention[0] = 164 Then $qw = 1
	EndIf
	If $qw = 1 Then
		second()
	Else
		MsgBox(0, 'Error', 'Unrecognized Window.' & @CRLF & 'Defuse works only with the three standard levels.' & @CRLF & 'This error can also be caused by a title bar width other than 25.')
	EndIf
EndFunc   ;==>first
Func second()
	BlockInput(1)
	$dimention = WinGetClientSize('Minesweeper')
	WinActivate('Minesweeper')
	Send('xyzzy')
	Send('+{enter}')
	$qqpos = WinGetPos('Minesweeper')
	MouseMove($qqpos[0] + 20, $qqpos[1] + 110, 0)
	$pos = MouseGetPos()
	MouseMove($pos[0] - 16, $pos[1], 0)
	$hi = 0
	$ii = 0
	Do
		$wide = 0
		$hi = $hi + 1
		Do
			$wide = $wide + 1
			d()
			If WinActive('Minesweeper') Then
			Else
				$ii = 1
			EndIf
		Until $wide = $widebox Or $ii
		$pos = MouseGetPos()
		MouseMove($pos[0] - 16 * $widebox, $pos[1] + 16, 0)
	Until $hi = $hibox Or $ii
	WinActivate('Minesweeper')
	Send('xyzzy')
	Send('+{enter}')
	SplashTextOn('', '', 1, 1, 0, 0, 1)
	SplashOff()
	BlockInput(0)
EndFunc   ;==>second
Func d()
	$pos = MouseGetPos()
	MouseMove($pos[0] + 16, $pos[1], 0)
	Sleep(1)
	main()
EndFunc   ;==>d
Func main()
	$color = PixelSearch(0, 0, 1, 1, 0xFFFFFF)
	If $color = 1 Then
	Else
		MouseClick('main')
	EndIf
EndFunc   ;==>main
Func done()
	Exit
EndFunc   ;==>done
Salu22:)
Avatar de Usuario
Juanchi
Aprendiz de Mago
Mensajes: 33
Registrado: 26 Mar 2010, 00:24

Re: Auto Busca minas

Mensaje por Juanchi »

gracias BasicOs :smt003
Lo voy a probar a ver como anda :smt003
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-

Imagen
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Auto Busca minas

Mensaje por Ximorro »

¡Vaya hombre! el error en el alojamiento se ha cargado estas respuestas.

Por si a alguien le interesa creo que hay que puntualizar que en este caso el programa no juega para nada al buscaminas, sino que hace trampitas. Desde luego como en muchas cosas seguro que sirve para aprender algo más de AutoIt, pero si alguien espera un programa de inteligencia artificial que "piensa" cómo evitar las bombas, pues no es éste.

Si veis el video se puede notar de que el cursor va celda a celda de forma ordenada, y pincha o marca bomba directamente. Lógicamente es imposible resolver así el tablero, no puedes ir una a una en orden, tienes que moverte por donde hay información.
Y por si alguien tiene dudas sólo hay que analizar el programa, quizás no corresponda exactamente al que se ve en el video pero hace lo mismo, con mismo resultado. Se puede ver en el código que hace:

Código: Seleccionar todo

   Send('xyzzy')
   Send('+{enter}')
con la ventana del buscaminas activa. Eso activa el modo cheating, a partir de ahí cuando pones el cursor sobre una celda, el pixel (0,0) del escritorio cambia a blanco si debajo no hay bomba, y a negro si sí que la hay. Eso lo comprueba más abajo con:

Código: Seleccionar todo

$color = PixelSearch(0, 0, 1, 1, 0xFFFFFF)
If $color = 1 Then
Else
   MouseClick('main')
EndIf
(que podría haber sido directamente un PixelGetColor, pero bueno. Y ese If vacío no denota conocimientos avanzados de programación...
Igual meto la gamba pero creo que bastaría con un:

Código: Seleccionar todo

If PixelGetColor(0,0) = 0xFFFFFF Then MouseClick('main')
... ¿De verdad funciona ese código? PixelSearch devuelve un array con los dos elementos (x,y), no un número. Sí que devuelve un 1 cuando no se encuentra... pero lo devuelve en @error...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Juanchi
Aprendiz de Mago
Mensajes: 33
Registrado: 26 Mar 2010, 00:24

Re: Auto Busca minas

Mensaje por Juanchi »

-_-''
Me borro la respuesta.
De verdad no funcion O.o
Solamente hace click en todos los cuadritos, haya o no una bomba.
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-

Imagen
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Auto Busca minas

Mensaje por Ximorro »

Ese programa es la misma idea que el del video... ¡pero el del video funciona y este no!
Encima de hacer trampas lo hace mal ;-)

Os propongo, ahora que sabéis cómo hacerlo, que en vez de buscar un programa que vaya lo hagáis vosotros. No creo que usara éste porque está muy mal estructurado pero puede venir muy bien para lo de activar el truco y recorrer celda a celda, luego hay que mirar bien el pixel... ;-)
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Juanchi
Aprendiz de Mago
Mensajes: 33
Registrado: 26 Mar 2010, 00:24

Re: Auto Busca minas

Mensaje por Juanchi »

Ximorro escribió:Ese programa es la misma idea que el del video... ¡pero el del video funciona y este no!
Encima de hacer trampas lo hace mal ;-)

Os propongo, ahora que sabéis cómo hacerlo, que en vez de buscar un programa que vaya lo hagáis vosotros. No creo que usara éste porque está muy mal estructurado pero puede venir muy bien para lo de activar el truco y recorrer celda a celda, luego hay que mirar bien el pixel... ;-)
A que no haces uno que, en vez de usar esa "trampa", analise todos los cuadros q rodean al q se le hace click, como ya habias hecho... (Creo q fuiste vos XD) pero ahora terminalo :smt003 :smt003 :smt003
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-

Imagen
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Auto Busca minas

Mensaje por Ximorro »

Perdona pero eso ya está hecho, y va a la velocidad del rayo. ;-)
Aunque no uso el del windows, sino uno que se llama SwineKeeper:
http://freenet-homepage.de/hskopp/swinekeeper.html
Este permite tableros mucho más grandes, yo juego a 75x43 con 600 bombas.

Juega analizando el tablero (mirando uno o dos píxeles en cada celda averiguo qué contiene) y juega legalmente como haría un humano, por ahora sólo es capaz de hacer las cosas más directas, que son:
a) Cuando una casilla con número está rodeada de tantos espacios como minas le faltan, esos espacios son minas.
b) Cuando una casilla con número y con casillas vecinas sin descubrir está rodeada de tantas minas como su número, entonces esas vecinas están libres.

En este caso en vez de minas habría que decir trufas ;-)

Con eso hace bastante tablero pero se deja cosas que sé resolver mentalmente y mi programa no, la idea es que haga deducciones más inteligentes que esas básicas. Además pulso las casillas con ControlClick en vez de MouseClick, con lo que puedo estar yo paralelamente resolviendo con el ratón las zonas en las que se queda atascado, jugamos juntos ;-)

Estaba pensando en cambiar el sistema de resolución usando lo que se llama satisfacción de restricciones, que en este caso es montar sistemas de ecuaciones enteras en las que las variables valen 1 (hay mina) o cero (libre). Explican el método en este documento, está en inglés pero quien pueda leerlo que lo haga porque es una pasada ;-) :
http://www.minesweeper.info/articles/Mi ... action.pdf

El problema de resolver esto en AutoIt y por lo que me desmotivé un poco para atacarlo: los sistemas de ecuaciones generados normalmente no tienen solución única, pues tienen más variables (casillas por resolver) que ecuaciones (restricciones), en esos casos hay que buscar todas las soluciones para ver si por ejemplo una casilla es bomba en todas ellas, entonces sabes que es bomba sea cual sea la solución. El problema es que para implementar eso hay que ir dando valores a las variables viendo cuáles son soluciones, y es necesario hacer un algoritmo recursivo que haga "backtracking" y deshaga los cambios cuando se encuentra en un callejón sin salida (los valores que se han dado a algunas variables no dan solución alguna). La limitación está en que se abre un árbol de recursividad que crece exponencialmente con el número de variables del sistema, y AutoIt tiene una capacidad de recursión muy limitada... :smt010
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder