Practica de Pascal

Soy una chica que necesita urgentemente resolver una practica que me han puesto para este mes, no tengo ni idea de informática y estoy a punto de volverme loca, a ver si me puedes ayudar, esto es lo que me han dado:
1.Objetivo de la práctica:
-Consiste en diseñar y codificar un programa que permita al usuario jugar a "muertos y heridos" con el ordenador.
Consiste en que dos jugadores piensen cada uno un número de 4 cifrascdiferentes y cada uno tiene que probar adivinar las cifras del otro jugador y el otro le contesta con 2 números diciéndole cuantos "muertos" (números acertados en la posición correcta) y cuantos "heridos" (núm. Acertados en la posición incorrecta)ha conseguido.
Cuando un jugados hace "4 muertos" gana la partida. Por ejemplo, una posible partida seria:
ORDENADOR: Piénsate un núm. De 4 cifras diferentes. Pulsa "return" cuando lo hayas pensado.
USUARIO:"return"
ORDENADOR:Tu tiras. ¿Cuál crees que es mi núm?
Usuario:4281
ORDENADOR:4281: 2 muertos y 0 heridos.
ORDENADOR: Yo tiro: ¿0241 Cuántos muertos?
Usuario: 1
Ordenador: ¿Cuántos heridos?
Usuario: 1
ORDENADOR: Tu tiras. ¿Cuál crees que es mi cifra?
Usuario: 4207
ORDENADOR: 4207: 1 muerto y 1 herido.
ORDENADOR: Yo tiro: 1235. ¿Cuántos muertos?
Usuario: 2
Ordenador: ¿Cuántos heridos?
Usuario: 0
- El programa proseguiría hasta que uno de los 2 jugadores consiguiera acertar las 4 cifras.
2.Información que manipula el programa:
- El modo más simple de conseguir que el programa juegue a este juego es con una tabla donde guarda tdos los posibles núm. De 4 cifras diferentes y los va eliminando a medida que obtiene la información del usuario. En total hay 5040 psibles núm. Diferentes de 4 cifras entre 0001 y 9999. Por lo tanto el programa necesita una tabla de 5040 posiciones donde guardar los posibles valores.
3.Funcionamiento del programa
-El programa controla los turnos y hace que juegue el usuario y el ordenador de forma alternada. Cuando es el turno del usuario el programa le pide un núm., lo compara con el que se ha "pensado" al principio y le da el núm. De muertos y heridos. Cuando es el turno del ordenador, el programa pone un posible núm. (p) al usuario y espera que este le ponga la cantidad de muertos (m) y heridos (f). A continuación recorre toda la tabla, descartando las cifras que no tengan el mismo núm.(m)de muertos y de heridos(f) respecto al número (p) propuesto. Para descartarlos es suficiente guardar un cero en la posición de la tabla que ocupaban.
A cada tirada el programa busca en la tabla un núm. No descartado, o sea, una posición que no contenga un cero para proponérselo al usuario.
Bueno, esta es la practica que tengo que hacer, creo que si no lo resuelvo pronto me voy a poner a llorar :( a ver si puedes ayudarme.
Respuesta
1
Aquí te mando una versión del ejercicio que pides. Dentro del código vienen algunas cosas comentadas. Espero que lo entiendas y te sea de provecho. Hasta el momento sólo no te implementé la función que pone los valores de los # en el arreglo pues estoy pensando la forma más eficiente de hacerlo.
Luego te la mando.
Saludos.
Por favor recuerda puntuarme.
type
numero = string[4]
respuesta = record
muertos,heridos:byte;
end;
numMarc = record
num:numero;
marca:boolean;
end;
arreglo = array[1..5040] of numMarc;
function Genera_Aleatorio(numpos:arreglo):numero;
begin
result:= numpos[random(5040)].num;
end;
function Resp_Maq(npensado,nUsuario:numero):respuesta;
var
i:integer;
resp:respuesta;
begin
resp.muertos = 0; resp.heridos = 0;
for i:=0 to 3 do
begin
if npensado = nusuario
then
resp.muertos = resp.muertos + 1;
if AnsiContainsStr(npensado,nusuario)
//Esta función dice si lo segundo es subcadena de lo primero, está implementado en la unit
StrUtils de DELPHI, si quieres impementarla sólo recorre la cadena preguntando si el dígito
coincide con alguna posición.
then
resp.heridos = resp.heridos + 1;
end;
result := resp;
end;
//aquí ya tienes la respuesta de la máquina.
function Es_Ganador(resp:respuesta):boolean;
begin
result := Resp.muertos = 4;
end;
//para saber si el usuario ha ganado
function Entra_Numero : numero;
var
num:numero;
begin
writeln('Entra el #');
readln(num);
result:= num;
end;
function Jug_Maq(var numpos:arreglo):respuesta;
var
i:integer;
begin
i:=1;
while (i<=5040) and (numpos.marca) do
inc(i);
numpos.marca := true;
writeln(numpos.num,'Teclee muertos y heridos');
readln(result.muertos);
readln(ressult.heridos);
end;
//este es el programa
var
respU,respM:respuesta;
nusuario,npensado:numero;
NumPos:arreglo
begin
repeat
NumPos := Genera_Numeros;
npensado := Genera_Aleatorio(NumPos);
respU.muertos:=0;
respM.muertos:=0;
while Es_Ganador(respU) or Es_Ganador(respM)) do
begin
nusuario = Entra_Numero;
resp:= Resp_Maq(npensado,nusuario);
Muestra_resp(resp);
respM:=Jug_Maq(NumPos);
end;
if Es_Ganador(respU) then
write('Has ganado') else
write('Te he ganado')
repeat
writeln('Jugamos Otra vez (S/N)');
readln(r);
until (r='n')or(r='N')or(r='s')or(r='S')
until (r = 'n') or (r='N')
end;

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas