Na verdade é simples!
Veja o que você está fazendo…
// Existe esse atributo recebido pelo método.
Tabuleiro tabDimensionado
// Então você gera duas coordenadas (tipo x e y):
int l = geraAleatorio(tabDimensionado.getBiDimensao());
int c = geraAleatorio(tabDimensionado.getBiDimensao());
// Você está tentando fazer isso:
tabDimensionado[l][c]=new Casa()
Tem várias coisas erradas aqui, Mas é falta de conhecimento e prática com os conceitos envolvidos! Vamos por partes…
tabDimensionado é um objeto do tipo Tabuleiro.
Pra começar esse objeto não é uma matriz!
Seria uma matriz se fosse alguma coisa assim:
Nesse caso você teria instanciado uma matriz de tabuleiros com 8 x 8 posições nulas, e em cada posição poderia adicionar uma nova instância de Tabuleiro:
for(int y=0; y<tabDimensionado.length; y++) {
for(int x=0; x<tabDimensionado[y].length; y++) {
tabDimensionado[y][x] = new Tabuleiro();
}
}
MAS logicamente isso não me parece fazer sentido, você deve querer uma matriz de casas no seu tabuleiro, não uma matriz de tabuleiros!
A sua classe Tabuleiro possui uma matriz de casas? Tipo…
public class Tabuleiro {
private Casa[][] casas;
// construtores, getters, setters, etc...
}
Nesse caso você acessaria o atributo casas (uma matriz de objetos do tipo Casa inicialmente nula e após instanciada com as posições nulas) pelos getters e setters, e ficaria com alguma coisa assim:
tabDimensionado.setCasas(new Casa[8][8]);
for(int y=0; y<tabDimensionado.getCasas().length; y++) {
for(int x=0; x<tabDimensionado.getCasas()[y].length; x++) {
// Entenda essa parte:
tabDimensionado.getCasas()[y][x] = new Casa();
}
}
Ou mais fácil:
Tabuleiro tab = new Tabuleiro();
Casa[][] casas = new Casa[8][8];
for(int y=0; y<casas.length; y++) {
for(int x=0; x<casas[y].length; x++) {
// Entenda essa parte:
casas[y][x] = new Casa();
}
}
// Entenda essa parte:
tab.setCasas(casas);
}
Agora sim, veja que eu tenho um objeto tabDimensionado do tipo Tabuleiro, esse objeto contém uma matriz Casa[][] que é uma matriz, não um objeto do tipo Casa. Essa matriz pode ser instanciada com largura e altura x e y, ficando inicalmente com as posições nulas, e pode receber em cada posição uma nova instância (um novo objeto) do tipo Casa: new Casa();
Quando eu fiz a federal de Ciência da Computação, eu tinha um professor de mil quinhentos e guaraná com rolha que era muito enfático em dizer: é importante conhecer os conceitos antes de pensar em programar. Senão não dá pra saber o que se está fazendo.
Orientação a objetos pode parecer uma coisa muito confusa no começo, mas todo novo paradigma é um mistério até que a gente estude melhor. Programação orientada a objetos tem seus blocos “procedurais”, mas o conceito da orientação a objetos é fundamental, e não é intuitivo nem automático para quem programa procedural, mas eu te garanto que uma vez que você estude esse conceito cuidadosamente em breve você vai entender e dominar essa programação.
Não tenha medo da linguagem e não desista, você só vai dominá-la com paciência e persistência, e pode ir tão longe quanto quiser. Veja:
Tabuleiro é uma classe, é um tipo, uma “forma de prensa” de fábrica para “prensar” vários objetos do tipo tabuleiro (ou só um se você só precisar de um).
new Tabuleiro() é uma ordem para que seja “prensado” um novo objeto com as características da forma Tabuleiro.
Eu posso atribuir essa nova instância a uma variável do tipo Tabuleiro:
Tabuleiro tab1 = new Tabuleiro();
Agora tab1 referencia esse novo objeto prensado na forma da classe Tabuleiro.
Essa classe pode conter outras classes, por exemplo uma Casa:
Casa c = new Casa();
Mas isso é uma casa (um objeto prensado na forma da classe Casa), e não tem nada a ver com um vetor ou uma matriz de casas, que é um conjunto de posições vazias que podem ser preenchidas com novos objetos prensados na forma da classe Casa, assim:
[code]public class Tabuleiro { // Uma classe para criar objetos do tipo Tabuleiro
private Casa[][] casas = new Casa[][]{ // Uma nova matriz para objetos do tipo Casa
{new Casa(), new Casa()}, // Duas novas casas na primeira linha
{new Casa(), null}, // Uma nova casa e uma posição vazia na segunda linha
{null, new Casa()} // Uma posição vazia e uma nova casa na terceira linha
};
public Casa[][] getCasas() {
return casas;
}
public void setCasas(Casa[][] casas) {
this.casas = casas;
}
}[/code]
Nesse exemplo eu já instanciei a matriz de casas no momento da declaração, ou seja, eu já criei a variável e já atribuí valores a ela.
Depois forneci um método get e outro método set para permitir acesso a essa matriz de casas, obtendo os seus valores ou setando uma nova matriz.
Existem muitos jeitos de fazer essas instâncias (como eu fiz acima, no momento da declaração), várias sintaxes possíveis, eu procurei escolher uma sintaxe didática.
Mas o importante é fixar esses conceitos, e com a prática você poderá compreendê-los de forma cada vez mais transparente facilitando muito a sua codificação.
Outros conceitos importantes são os construtores, getters, setters, classes abstratas, interfaces, sobrecarga e sobrescrição de métodos, herança, polimorfismo, como usar collections…
Quanto tempo você leva pra aprender depende só da sua vontade, se você estiver motivado pode ler o Deitel todo em uma semana, fazendo os exercícios, e você vai ver como vai chegar um momento em que vai ficar muito fácil criar o que você quiser com Java!

Boa sorte!
-