| |
|
3401
|
Programación / Programación C/C++ / Re: Maquina Inteligente Hundir la flota (Battleship) código C
|
en: 29 Diciembre 2017, 20:23 pm
|
Al margen de como muestres por pantalla el mapa, es acertado que en tu array mantengas lo más coherente los datos referentes al estado del mapa. No sé si te piden-puedes crear clases o si va todo en 'spaguetticode'... yo creraría una clase llamada mapa, que al inicio, al crearse recibe como parámetros el tamaño del mapa, y un array indicando cuantos buques tendrá y de qué tamaño... pero al caso puedes dejar las funciones fuera si no usas clases, duplicando datos para cada jugador... Las ideas: - Un array Mapa, contiene el estado del mapa, incialmente sus valoren valen 0, es decir todo agua, las casillas 'tocadas se marcan con valor 255, cualquier otro valor corresponde a la nave x. - Un array de Naves, tiene tantos elementos como naves se alojarán en el mapa, y el valor de cada ínidice, indica cuantas casillas ocupa la nave... por ejmplo: NavesA(0) = 2 NavesA(1) = 3 NavesA(2) = 3 NavesA(3) = 4 ...etc... hay dos naves de 3 casillas, 1 de 2 casillas y una de 4... (no importa el orden en que estén). - Hay dos flotas, luego hay dos arrays con el mapa de estado de cada jugador y del estado de sus naves. Esto se refleja en el siguiente pseudocodigo. // Datos jugador A arrayBytes MapJA(x,y) //x,y expresa dos dimensiones arrayBytes NavesA() entero NumNavesA
// Datos Jugador B arrayBytes MapB(x,y) arrayBytes NavesB() entero NumNavesB
Funcion NuevoMapa(ancho, alto, buques() ) alojar tamaño para MapA(ancho, alto) alojar tamaño para MapB(ancho, alto)
numNavesA = buques.count numNavesB = buques.count
NavesA = buques NavesB = buques Fin Funcion - Cuando se posiciona una nave en el mapa, por ejemplo la nave de 4 casillas, donde se ubique en el mapa, tales casillas ocupadas, se rellenan con el valor del índice de dicho buque. por ejemplo: 3 3 3 3. Señala que la nave de índice 3 (NavesA(3), está ubicado en esas casillas). - Cuando se toca una casilla de la nave, en el mapa se marca (por ejemplo), 255 (tocado), y se resta una casilla en la nave. - Cuando la nave llega a 0 casillas, la nave está hundida, se resta una nave del jugador. - Cuando un jugador se queda sin naves, la partida acaba. Esas reglas se reúnen en este fragmento de pseudocódigo: entero = Funcion Disparar(x,y, Jugador) byte estado
Si (jugador = 0) luego // A dispara a B estado = MapB(x,y) // valor de estado del mapa para esa casilla.
Si ((estado > 0) y (estado < 255) ) // se acaba de tocar un barco. MapB(x,y) = 255 // casilla tocada, se marca en el mapa, el nuevo estado. NavesB(estado) -=1 // se resta una casilla a este barco. Si (NavesB(estado) = 0) //Hundido, cuando a una nave no le quedan casillas, se considera hundido numNaves -=1 Si (numNaves = 0) // no le quedan naves. 'jugador' ganó la partida. Devolver -1 Fin si Fin si Devolver 1 // esto es 'tocado/hundido' jugador sigue tirando, sigue en su turno. fin si Devolver 0 // 'agua' o ya tocada. Sino // jugador =1, B dispara a A // igual que arriba pero cambiando B, por A Fin si Fin funcion El bucle principal del juego (simplificado al máximo)... funcion MainPartida entero d, t, n //d=resultado del disparo, t=turno de qué jugador.
DecidirTamañoMapa(x,y) // jugadores indican que tamaño tendrá el mapa. ArrayBytes Buques = DecidirNumeroNavesYTamaños NuevoMapa(x,y, buques) PosicionarFlota(buques, 0) // 0=Jugador A, se le pide que posicione sus buques en el mapa. PosicionarFlota(buques, 1) // 0=Jugador B, " "
t = ElegirTurnoalAzar(entre 0 y 1) //t indica el jugador que tiene el turno
// Bucle del juego hasta fin de partida. Hacer ElegirNuevasCordenadasDeDisparo(t,x,y) // se usa 't', para que el jugador específico elija las cordenadas. d = Disparar(x,y, t) //t hace referencia a que mapa del jugador afecta, // con clases 't' en vez de ser un parámetro sería un objeto y disparo un método de dicho objeto. Si (d = -1) luego llamar FinalPartida("Perdiste, no te quedan naves. Ganó el jugador xxxx (que tiene el turno de disparo" Osi (d = 0) luego // tocado o hundido //CambiarTurnoJugador t = ValorAbsoluto(1 - t) //cambiamos el turno de jugador: esto alterna cada vez entre 0,1,0,1,0,1,0,1 sino // el jugador que tiene el turno, sigue disparando hasta que falle (d=0), o no queden naves (d=-1) Fin si n += 1 Repetir mientras ( d<> -1) // '<>' distinto de // ó: mientras FinalPartida(d) = False
MostrarMensaje (La partida precisó 'n' disparos para llegar a su fin...) //no es ni mucho menos la estadística que requieres, // pero no cuesta constar los disparos realizados por ambos jugadores. Fin funcion Queda a tu esfuerzo, el resto de funciones: - DecidirTamañoMapa, DecidirNumeroNavesYTamaños: El trabajo de estas funciones podría quedar fijado por diseño o inicializarse con unos valores y al inicio de cada partida pedir al usuario si quiere cambiarlo. - Con los valores previos establecidos (de las dos previas funciones), la función: NuevoMapa ya está descrita en pseudocódigo... - PosicionarFlota: esta función se invoca dos veces. En cada una se pide al jugador que posicione sus naves en el mapa. Dicha función marcará en el mapa las casillas que ocupa cada nave, metiendo el valor de la nave que ahí se aloja. Debe impedirse que una nave solape otra, o que no quepa... ...luego es imprescindible que para ubicar una nave en el mapa, se consulte si la posición 'x,y' que indica el usuario como 'punto central de la nave' (o de comienzo) cabe la nave (dado su tamaño), en vertical u horizontal, contando las casillas 'agua' adhiacentes a la marcada, si cabe tanto en vertical como horizontal, luego pedir al usuario que decida la orientación, si solo cabe en una orientación se deja en esa, y al final se exige que pulse 'intro' para confirmar, o 'esc' para reposicionar en otro lado. Si pulsa 'esc', se borran las casillas marcadas para ese buque. Si pulsa intro, se avanza en el array para posicionar la siguiente nave. Cuando todas las naves en el array estén alojadas en el mapa, también se pedirá si confirmar con intro o si se desea cambiar una nave específica, para ello pulsar el índice de la misma.... - ElegirTurnoalAzar: esta función simplemente decide que jugador empieza a jugar. 0 = representa al jugador A, y es su turno y 1 =representa al jugador B y será su turno. - CambiarTurnoJugador: es una función tan simple que ni se crea, se alterna siempre del uno al otro, luego una línea de código basta... - ElegirNuevasCordenadasDeDisparo: Esta función es la que puede entretenerte un poco más, ya que es donde tu reparas en como operar sobre ella. Cuando juega la máquina contra la máquina, una estrategia de disparar al azar, puede ser aceptable incialmente, sin embargo una mejor estrategia es elegir zonas y sobre zonas, una casilla en la zona... entendiendo por zonas la división del mapa en cuadrantes, del tamaño de la nave mayor, es decir supongamos que el mapa tiene 16x16 casillas y que la nave mayor ocupa 4 casillas, entonces sería útil considerar al mapa dividido en 4x4 zonas, entonces si disparas a distancias de zona, vas asegurando que tocarás la nave mayor si o sí, de forma más coherente que al azar. linea 3, linea 7, 11 y 15 verticales y horizontales. Una vez cubierto así el mapa habrás dado con todas las de 4, se divide cada zona en la mitad y así... naturalmente cuando tocas una nave, te ciñes sobre ella hasta hundirla... Al caso para cada jugador deberías guardar como va la estrategia. Como por ejemplo copia de donde ha disparado previamente el jugador, para no repetir disparos... es decir se elige al azar, pero si ya se disparó allí se elige otra posición. Diseñado con objetos sería más sencillo de hacer y mantener el código. - Disparar: Esta función evalúa sobre el mapa el resultado que afecta a la flota contra la que se dispara, y el resultado del disparo se evalúa tras dicha función como parte del bucle principal del juego. - FinalPartida: En el pseudocódigo se usa para indicar un mensaje del resultado de la partida, pero podría trasladarse allí parte del código del bucle principal... y sería quien evaluara si al jugador le quedan naves o no... En fin, ya tienes un planteamiento general y la distribución de funciones, ahora solo toca rellenar el código para cada función y probarlo...
|
|
|
|
|
3402
|
Foros Generales / Noticias / Re: Nokia se da cuenta de su error y lanzará un Nokia 3310 4G que podría ejecutar...
|
en: 29 Diciembre 2017, 18:28 pm
|
|
La unión en un solo dispositivo del teléfono y el ordenador, es algo que se esperaba desde comienzo de los 90 (incluso antes), y no hay duda que es algo muy acertado, sin embargo debeiera mantenerse la separación absokuta de las características. En un mismo dispositivo?: SÍ. compartiendo todo en común?: NO. Pero los fabricantes solo atienden a cifras de negocio, les importa un egg, la seguridad ni nada de nada. Los cambios forzados, solo lo son por quejas que pueden producir la inestabilidad de la empresa... es decir porcos o nulos, si al final los vehiculan con falsedades (como acostumbran a hacer).
En ese sentido, por tanto que vuelvan a existir teléfonos 'unSmart', es todo un paradójico avance en la seguridad. Qué necesitas seguridad ante todo?. Pasas de un dudoso Smart-phone... Qué necesitas hacer un poco de todo?. Regreso a un PC, o incluso a un miniPC.
Frente a la abochornable, insoportable, insufrible ilimitadas opciones, serivcios y programas innecesarios (para el usuario doméstico) de los PC con Microsoft al frente y en el otro frente, la nula capacidad de control auténtico (sin hacer root y jugártela con una ROM hackeada y pérdida de garantías) de los teléfonos móviles (con Google o peor con Apple), podría sacarse un término medio, donde el usuario tenga opción y control de todo, pero donde no vengan preinstalado nada inútil... que exista, vale, pero que venga preinstalado no. En fin, un dispositivo así, creo que se llevaría la palma al menos para todo usuario entendido en tecnología... y con una separación clara y definida de lo que es el teléfono y lo que es el resto. Que no venga a suceder que un maldito intruso se haga dueño del teléfono, algo solo posible cuando la fusión es absoluta. Con cierta separación en funciones, nada de eso pasaría...
|
|
|
|
|
3403
|
Foros Generales / Noticias / Re: Las universidades de EEUU al fin lo han reconocido: empezar a programar por ...
|
en: 29 Diciembre 2017, 18:08 pm
|
|
Mal hecho...
Debieran empezar aprendiendo con pseudocodigo, sin ni siquiera tocar el ordenador.
Repartir simples papeles con los nombres d elos meses o los días d ela semana, y por ejemplo sugerirles que creen órdenes parar ordenar los meses dados en un desorden específico que el profesor (por ejemplo), escribiese en la pizarra...
El alumno, lo primero que debe aprender (de programación), es a pensar a expresar sus ideas de forma cabal y ordenada. E incidir en ello, unos 3 meses. Más adelante será solo cuestión de traducir el pseudocódigo a los términos de lenguaje que se pretenda usar para enseñar al alumno.
De todos modos, creo que lo ideal es que en la Universidad y con fines didácticos, se creara y usara un lenguaje específico para tales propósitos, el aprendizaje. Un lenguaje bastante limitado, pero que toque todos los palos (desde el manejo de datos básicos hasta estructuras complejas, desde manejo con ficheros a manejo en red (aunque sea sólo local), desde ordenar arrays hasta cifrado y compresión. ... y la razón es que los lenguajes modernos, son hoy día una auténtica jungla imposible de abarcar (ya) por nadie, entonces enfrentar a un novato a algo tan gigantesco, puede causarles frustración muy fácilmente
...esta es la razón, por la que las dos generaciones previas, aprendieron mucho mejor desde algo tan simple como el BASIC, tan denostado hoy día. A pesar de que luego los que no se profesionalizaron se quedaron en el mismo BASIC que aprendieron.
El primer lenguaje debe ser uno que permita al docente centrarse en el tema que trata de enseñar y al aprendiz centrarse en el problema para entenderlo y dominarlo, alejado de la problemática propia que encierra el propio lenguaje (abstraerse de todo lo que no sea aprender la lección en curso, de cosas por ahora innecesarias pero que consumen tiempo, esfuerzo y expectativas). A medida que se tenga un dominio práctico de dicho lenguaje académico y que se vea al alumno fluído en entender y aplicar sus conocimientos, es cuando puede pasarse a un lenguaje de producción.
...por eso hoy día las Universidades son una de las principales fuentes generadoras de frustración e incluso entre los que salen adelante de crear personas susceptibles a la ansiedad en edades muy tempranas.
|
|
|
|
|
3404
|
Foros Generales / Foro Libre / Re: Tabarnia arrasa en internet
|
en: 28 Diciembre 2017, 20:13 pm
|
No es exactamente eso. La idea que no se si va en serio o no, es la siguiente:
Tu ajustas con más precisión, pero es lo de siempre. El dinero. Pero insisto que es como digo... ya que dentro de esa misma supuesta nueva comunidad, también habrá alguna población en concreto que destaque del resto y CON LOS MISMOS ARGUMENTOS, también pretenda que sus impuestos sean solo para ellos... pero, no acabaría ahía la cosa, dentro de la misma población también hay barrios y siempre habrá uno o dos barrios más ricos, y media docena mucho más pobres, luego el problema y la solución se repiten hasta llegar a "Casalandia", donde mi sola casa sea una comunidad autónoma-país (alcaso es lo mismo de absurdo, aunque ciertamente la legalidad puede diferir), y donde mis impuestos sean solo para mi... ...la pregunta pertinente entonces es: ¿Para qué sirven los impuestos , si al final cada uno va a tener devuelta exactamente los mismos impuestos que pagó?. El fundamento de la comunidad, es que nos ayudemos entre todos, el que más gana, favoreciendo al que menos gana, y desde luego no es un favorecimiento 'gratuito'. El que más gana, lo hace por que las leyes lo permiten, porque las leyes son laxas en la forma y cantidad de conseguir riqueza, luego hay que colocar siempre los dos platillos en la balanza: el de lo que suma y el de lo que resta, y no solamente el que suma... Ahí, ese el el pozo donde acaba toda la hipocresía del 'todo para mi', del 'no quiero-queremos repartir los impuestos'... en ver solo la parte d elas leyes, donde puede enriquecerse de mil maneras a costa de los demás, pero donde se niegan en rotundo a ver donde PARTE de ello ,es devuelto a todos en forma de impuestos. ...es lo mismo de siempre, egoísmo pesetero (aunque la peseta, quede en la Historia ya como moneda aparacada, sigue procediendo de 'peso' y esto siempre estará en el presente.).
|
|
|
|
|
3405
|
Foros Generales / Foro Libre / Re: Tabarnia arrasa en internet
|
en: 28 Diciembre 2017, 10:20 am
|
|
Yo voy a 'Casalandia', es decir a hacer de tu casa un país independiente, y la razón?. Pués ya puestos, porque sí... "...porque si vivimos en democracia, tengo 'derecho' a lo que me dé la gana, y si no, es una dictadura opresiva" .
Es la presumible respuesta, de los que creen equivocadamente que una democracia significa "hago lo que me da la gana".
|
|
|
|
|
3406
|
Programación / .NET (C#, VB.NET, ASP) / Re: Consulta 1
|
en: 28 Diciembre 2017, 10:11 am
|
|
Vas por mal camino. Insistes en programar sin saber lo más mínimo, ni siquiera el nombre de cosas elementales... coger un par de libros y empapartye con ello, es lo mínimo que debería hacer cualquiera, para como mínimo hablar con algo de propiedad, sin obligación de llegar a la precisión absoluta (la cual es igual de odiosa)... en fin allá tú...
--------------- El asunto que planteras, no es realmente un tema de programación, es un tema de ingenio. Tú eres capaz de guardar en un texto, solo una palabra?. o cinco palabras?, o 500 palabras?... La cuestión puerilmente se reduce a que siempre que seas capaz de descomponerlas e interpretarlas correctamente, posible será posible...
...otra cosa es: ¿resulta conveniente?. Si el código que te quieres ahorrar, lo vas a perder descomponiendo e intrepretando únivocamente cada 'cadena', añadiendo posibilidades de error y teniendo en cuenta que precisamente todo eso ya es algo que hace el propio entorno de programación por tí entonces, la cuestión se limita a: ¿¿¿¿¿Cuál es el objetivo????.
¿No se te ocurre pensar que el propio entorno de programación tiene necesidad de distinguir (él mismo), unas cadenas de texto de otras...y... qué hará, cómo lo hará?. Intenta responderte las cosas a tí mismo antes de preguntar a nadie, la mitad de las veces (al menos), deberías ser capaz de responderte a tí mismo... y luego investigar un poco (al menos un poco), en google por tu cuenta... y sin llegar al XML, deberías encontrar que es un tema que se debió de solucionar, al poco de 'inventarse' la programación... pero solo pensando un poco por tu cuenta hubieras llegado a esa conclusión, incluso sin consuiltar nada...
...Respóndete a tí mismo a estas preguntas: ¿Qué es un byte?. ¿Puede hacerse organizaciones de más de un byte, y si es así, cómo? (el para qué es obvio). y entonces entenderás desde los propios datos numéricos, hasta el array, las listas y diversas colecciones, las bases de datos y ficheros, etc... etc... pero tú sigue ignorando tomar un libro y leerte los fundamentos básicos, sigue de espaldas, porque tras 20 años así, seguirás tropezando, en las mismas piedras todos los días y en cosas elementales que resultan hasta ridículas de responder.
|
|
|
|
|
3409
|
Foros Generales / Noticias / Re: ¿Deberían los buscadores filtrar todas las búsquedas que contengan la palabra “t
|
en: 25 Diciembre 2017, 22:27 pm
|
|
Supongo que no filtrarán contenido con la palabra "Trump", "Putin", etc...
Si deciden eliminar (términos de búsqueda con) la palabra Torrent de los buscadores, basta que a apartir de entonces se llamen a los programas y descargas torrent con el nombre del presidente de turno, et voilá... eliminarán también las búsquedas con la palabra "Trump", "Putin", etc...????
Cuantas tontadas se les ocurren a algunos descerebrados... al campo no se le pueden poner puertas.
|
|
|
|
|
3410
|
Foros Generales / Noticias / Re: Goldman Sachs realizará transacciones de bitcoin en 2018
|
en: 23 Diciembre 2017, 03:46 am
|
|
Esto supondrá un espaldarazo de apoyo a la moneda...
Sí... es como inventar el oro como moneda y durante 10 años repartirse el botín entre unos pocos y después de ese plazo, forzar a participar a todos... que injusto resulta.
Yo veo con buenos ojos las criptomonedas, pero no así las 'reglas del juego', para mí, las criptomonedas actuales son un juego, una experiencia para demostrar si son o no válidas y pasado cierto plazo, si se demuestra que son válidas, creo que deberían finiquitarse y crearse una única moneda internacional y donde todo el mundo tenga las mismas oportunidades, esto es que se repartan x monedas a todo ser pensante en este planeta mayor de edad (y lo mismo a cualquiera cuando alcance su mayoría de edad), y a partir de ahí... avanzar.
Que ya haya archimillonarios cuando el 99'99% del palneta aún no tiene un mísero céntimo, no es forma de penetración al mercado, opino yo...
|
|
|
|
|
|
| |
|