LINUX.ORG.RU

[Java] короткий метод сравнения двух объектов

 


0

1

Есть доска 9x9. На доске рисуется фигура (в определённой последовательности) из массива координат (x,y). Массивы координат каждой фигуры запоминаются.

Внимание вопрос, как узнать, если фигура появилась хотя бы три раза на доске, не создавая доп. классов? (возможно в разных местах).


циклом проверить.. или как написали тут счетчик сделать самый норм вариант... а сравниваются объекты методом equals.. но тут это неприменимо

pozitiffcat ★★★
()
Ответ на: комментарий от RedPossum

не понял..

ну вот сама программа:

package life;

import ...

class Life {
	
	static final int WIDTH = 9,
					   HEIGHT = 9;
	
	int[][] board;
	
	int totalSteps, maxPeriod;
	
	CoordinateRow alives;
	
	GameHistory game;
	
	PrintStream log;
	
	LifeUserInterface ui;
	
	Life() {
		
		board = new int[WIDTH][HEIGHT];
		
		alives = new CoordinateRow();
		
		game = new GameHistory();
		
		log = new PrintStream(System.out);
		
		ui = UserInterfaceFactory.geefLifeUI(WIDTH, HEIGHT);
		UIHulpMethodes.vraagGebruikerOmInvoer();
	}
	
	
	boolean isAlive(Coordinate alive) {
		
		for (int i = 0; i < game.history[game.lastStep()].amountOfCoordinates; i++) {
			if (alive.x == game.history[game.lastStep()].coordinatesRow[i].x) {
				if (alive.y == game.history[game.lastStep()].coordinatesRow[i].y) {
					return true;
				}
			}
		}
		return false;
	}
	
	
	int neighbors(Coordinate cell) {
		int amountOfneighbors = 0;
		
		for (int h = 0; h < 3; h++) {
			for (int w = 0; w < 3; w++) {
				Coordinate neighbor = new Coordinate(cell.x + w - 1, cell.y + h - 1);
				
					if (isAlive(neighbor)) { amountOfneighbors += 1; }
			}
		}
		
		return amountOfneighbors;
	}
	
	
	void playStep() {
		
		for (int y = 0; y < board.length; y++) {
			for (int x = 0; x < board[y].length; x++) {
				
				Coordinate cell = new Coordinate(x, y);
				
					if (isAlive(cell)) {
						int neighbors = neighbors(cell) - 1;
						
						if (neighbors < 2 || neighbors > 3) {
							alives.removeFromRow(cell);
						}
					}
					
					else { 
						
						if (neighbors(cell) == 3)  {
							alives.addOneAfterRow(cell);
						}
					}
			}
		}
	}
	
	
	
	void showBoard() ...
	
	
	...

	
	void readGame() {...
	}
	
	
	void start() {
		readGame();
		
		showBoard();
		
		for (int step = 0; step < totalSteps; step++) {
			
			game.addOneToHistory(alives.lastStep());
			
			playStep();
			
			showBoard();
			
			checkPeriod(step);
		}
		
		log.println("Game ended. Max was reached. Total amount of steps: " + totalSteps);
		System.exit(1);
	}
	
	
	public static void main(String[] argv) {
		new Life().start();
	}
}

класс GameHistory:

package life;

class GameHistory {
	
	static final int MAX_AMOUNT_TURNS = 10000;
	
	CoordinateRow[] history;
	
	int amountOfTurns;
	
	GameHistory() {
		
		history = new CoordinateRow[MAX_AMOUNT_TURNS];
		
		amountOfTurns = 0;
	}
	
	
	void addOneToHistory(CoordinateRow currentGeneration) {
		history[amountOfTurns] = currentGeneration;
		amountOfTurns += 1;
	}
	
	
	int lastStep () {
		int last = this.amountOfTurns - 1;
		
		return last;
	}
}

класс CoordinateRow:

package life;

class CoordinateRow {

	static final int MAX_AMOUNT_COORDINATES = 1000; //

	Coordinate[] coordinatesRow;

	int amountOfCoordinates;

	CoordinateRow() {

		coordinatesRow = new Coordinate[MAX_AMOUNT_COORDINATES];

		amountOfCoordinates = 0;

	}
	
	
	CoordinateRow lastStep () {
		
		CoordinateRow next = new CoordinateRow();
		
		for (int i = 0; i < amountOfCoordinates; i++) {
			Coordinate temp = new Coordinate(coordinatesRow[i].x, coordinatesRow[i].y);
			next.addOneAfterRow(temp);
		}
		
		return next;
	}
	

	void addOneAfterRow(Coordinate currentCoordinate) {
		coordinatesRow[amountOfCoordinates] = currentCoordinate;
		amountOfCoordinates += 1;
	}

	void removeFromRow(Coordinate currentCoordinate) {
		for (int i = 0; i < amountOfCoordinates; i++) {
			if (currentCoordinate.x == coordinatesRow[i].x) {
				if (currentCoordinate.y == coordinatesRow[i].y) {
					coordinatesRow[i] = coordinatesRow[amountOfCoordinates - 1];
					amountOfCoordinates -= 1;
				}
			}
		}
	}
}

и класс Coordinate склеивает два int'а.

о каком именно конструкторе ты говоришь?

p.s. правила создания новой фигуры в методе playStep().

Sonsee
() автор топика
Ответ на: комментарий от pozitiffcat

фигуры могут появляться в разных местах! поэтому массивы не будут равными, потому что координаты разные. Другое дело - как сравнить последовательность..?

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

Похоже чем-то на поиск подстроки

ну, накодишь короткий метод? :)

Постановку задачи очень трудно понять. Может это поиск «подмассива в массиве»?

pathfinder ★★★★
()
Ответ на: комментарий от Sonsee

Если без учета симметрий и поворотов, можно взять одну точку за начало координат и вычислять расстояние до нее. Если фигуры одинаковы, то эти расстояния у них будут равны

anonymous
()
Ответ на: комментарий от Sonsee

>>фигуры могут появляться в разных местах! поэтому массивы не будут равными, потому что координаты разные.

Что мешает фигуру записывать в координатах относительно предыдущего шага, а не в абсолютных?

mclaudt
()
Ответ на: комментарий от Sonsee

короче если фигура заранее известна


int mask[][] = new int[3][3];
mask[0][0]=1;
mask[1][1]=1;
mask[2][2]=1;
mask[0][2]=1;
mask[2][0]=1;//крестик

//искать
int counter = 0;

for(int i=0;i<9;i++) for(int j=0;j<9;j++)
{
   if(board[i][j] == 1)
   { 
      for(int i1=0;i1<3;i1++) for(int j1=0;j1<3;j1++)
      {
          if(board[i1+i,j2+j] != mask[i1,j1]) 
             break;
          else if((i1==3) && (j1 ==3)) counter++;
      }
   }
}

както так если я правильно понял

pozitiffcat ★★★
()
Ответ на: комментарий от Sonsee

пардон, я не осилил вашего объяснения и сейчас не совсем понимаю, что ты хочешь. то есть у тебя есть фигура( некоторый подмассив) и нужно пройтись по полю в поиске таких-же?

RedPossum ★★★★★
()
Ответ на: комментарий от RedPossum

к примеру есть фигура:

**
  **

массив этой фигуры со-но: {«0.0», «1,0», «1,1», «2,1»}

но фигура может появиться и вот так: {«3,3», «4,3», «4,4», «5,4»};

и она при этом одинаково выглядит.

как мне определить, что они одинаковые?

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

нормализуй. то есть найди минимальное значение в массиве по иксу, вычти его из каждого икса. сделай то же самое по игрику. сравни. тадам.

RedPossum ★★★★★
()
Ответ на: комментарий от Sonsee

>>Похоже чем-то на поиск подстроки

ну, накодишь короткий метод? :)


ну, открой Кнута :)

Shtucer
()
Ответ на: комментарий от elverion

Ищи минимальную координату по x и вычитай ее из всех иксов. Аналогично для y

{"5.5", "5.6", "6.6"};

{"7.7","7.8","8.8"}; 

?

т.е. это ещё нужно будет написать 5 -if'ов ради вычисления больше оно, или меньше, потом отнять/прибавить разницу, и т.д.

а попроще в голову никак? (проще, в плане кода)

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

Ну ты и тупой. Пройдись по масиву циклом и при помощи Math.min() сравни предидущее минимальное и текущее значение итерации.

anonymous
()
Ответ на: комментарий от anonymous

без создания классов, же!

это я тупой? )))))

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

хорошо. вычти x1 из значения x1 другого массива. это и будет та штука на которую надо уменьшить второй массив по иксу. тоже по игрику.

RedPossum ★★★★★
()
Ответ на: комментарий от RedPossum

это не будет работатть, потому что оно может быть как меньше так и больше.

я придумал, ёмаё.

матрицу можно сравнивать, а создавать её вычитая первый х и всех остальных.

Sonsee
() автор топика
Ответ на: комментарий от RedPossum

да тут 100500 способов решения, остается выбрать менее ресурсоемкий.

pozitiffcat ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.