Como el tablero tiene 5*5=25 posiciones tienes que generar un numero aleatorio entre [1..25], si dicha casilla hay un obstaculo o el protagonista generas otro numero aleatorio, asi con los n Moustros.
Eso se hace mucha veces, pero definitivamente no me agrada.
Tiene una terminación indefinida, si el número aleatorio te sale siempre una casilla ocupada por obstaculos. Puede ser todo lo improbable que quieras, pero creo que es mala programación fiarse de la probabilidad de que un programa termine o no.
La cantidad de casilleros para colocar monstruos es 24-numero de obstáculos (para todos los monstruos, ya que los siguientes que coloques pueden superponerse dice).
Yo haría lo siguiente (que conste que no estoy haciendo la tarea de nadie porque no digo como implementarlo):
para simplificarlo, mi tablero es de 3x3=9 casillas
nº de obstaculos: 2
nº de monstruos: 3
Tablero inicial:
0 0 0 0 0 0 0 0 0
Elijo aleatoriamente un numero del 0 al 8-obstaculos ubicados hasta el momento (cantidad de posiciones disponibles)
numero elegido: 2
Tablero luego de colocar el obstaculo
0 0 'X' 1 1 1 1 1 1
Elijo aleatoriamente un numero del 0 al 8-obstaculos ubicados hasta el momento
numero elegido: 3
0 0 'X' 1 X 2 2 2 2
Nota: Cuando ubicamos el obstaculo en la posición x, introducimos en dicha posicion el valor 'X' (caracter 'X'=88.
Reglas para ubicar el obstaculo:
Genero un numero random entre 0 y "9-numero de obstaculos" ubicado hasta el momento, lo llamo r a dicho numero.
Si en r hay un numero a lo ubico en g(r+a)
Si en r hay un obstaculo lo ubico en g(r+1)
g(x)=x Si en x no hay obstaculo.
g(x)=g(x+1) Si en x hay obstaculo.
Incluso conviene no hacerlo recursivo, es mucho más rápido obviamente.
Luego actualizo el tablero de la siguiente manera:
Para las casillas posteriores a donde ubiqué el obstáculo, le sumo 1+o si es un numero, de ser un obstaculo, no modifico la casilla, pero incremento o en 1. o empiza siendo 0 y vendría a ser el numero de obstáculos con el que me topé en este proceso de actualización.
El proceso de ubicación de monstruos es análogo, pero no necesito actualizar el tablero luego de ubicar un monstruos porque es posible superponerlos. g(x) sigue igual ya que no puedo superponer con obstaculos.
Obviamente que las casillas que contengan un monstruo no van a ser todas "m" ya que esto no nos diría nada sobre la cantidad de monstruos que hay, podemos entonces hacer "m+x" siendo x igual a "la cantidad de monstruos sobre esa casilla-1"
Total, cuanto mucho habrá 24 monstruos... osea, el valor de la variable no superará el máximo de un char (255).
Por que "m" minuscula, porque si fuese mayuscula y tuviese 12 monstruos, les dejo a ustedes deducir las consecuencias...