Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2017, 14:42   #1
Nukz
 
Регистрация: 16.03.2017
Сообщений: 5
По умолчанию помогите разобраться - Пишу маленькую игру на Swing по типу PacMan, сделать генерацию случайных объектов на игровом поле

Пишу маленькую игру на Swing по типу PacMan
вот хочу что б мои яблоки выскакивали рандомно в массиве , но не совпадали со стенками которые под числом 0

Код:
public class MyGame extends JFrame implements KeyListener{
	JLabel [][] maps;
	Pac pac;
	Round round;
	Frut frut;
	JPanel panel;
	JLabel PacMan;
	JLabel[][] map;
	ImageIcon str;
	private String wall="0";
	private String road="1";
	private int i=1;
	
	private int j=1;

	MyGame(){
		super("My Pacman v.1.0");
		panel= new JPanel();
		round=new Round();
	
		
		setMaps();
		
		frut= new Frut();
		pac = new Pac();
		map[i][j].setIcon(pac.setPac());
		map[i][j].setText(pac.setPacStr());
		
		
		
		
		
		this.addKeyListener(this);
		panel.setBackground(Color.BLACK);
		panel.setLayout(new GridLayout(15, 15));
		setContentPane(panel);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(800, 600);
		setVisible(true);
	}
	@Override
public void keyPressed(KeyEvent e){
		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			if (!map[i][j + 1].getText().toString().equals(wall) ) {
				map[i][j++].setIcon(round.road());
				map[i][j].setIcon(pac.setPac());
				map[i][j].setText(pac.setPacStr());
				
			}
		} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			if (!map[i][j - 1].getText().toString().equals(wall)) {
				map[i][j--].setIcon(round.road());
				map[i][j].setIcon(pac.setPac());
				map[i][j].setText(pac.setPacStr());
				
			}
		} else if (e.getKeyCode() == KeyEvent.VK_UP) {
			if (!map[i - 1][j].getText().toString().equals(wall)){
				map[i--][j].setIcon(round.road());
				map[i][j].setIcon(pac.setPac());
				map[i][j].setText(pac.setPacStr());
			}
		} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			if (!map[i + 1][j].getText().toString().equals(wall) ) {
				map[i++][j].setIcon(round.road());
				map[i][j].setIcon(pac.setPac());
				map[i][j].setText(pac.setPacStr());
			}
		}
	}
	
	@Override
	public void keyReleased(KeyEvent e){
		return;
	}
	@Override
	public void keyTyped(KeyEvent e){
		return;
	}

public void setMaps(){
	
		int SIZE = 15;
		map = new JLabel[SIZE][SIZE];
		for (int i = 0; i < SIZE; i++) {
			for (int j = 0; j < SIZE; j++) {
				map[i][j] = new JLabel();
				map[i][j].setSize(96, 60);
				map[i][j].setText(road);
				map[i][j].setIcon(round.road());
				panel.add(map[i][j]);
				
				
			}
		}
		setRound();
		
		
		
	}


	
	
	

public void setRound(){
	
	for(int i=0;i<=14;i++){
		for(int j=0;j<=14;j++){
			map[0][j].setText(wall);
			map[0][j].setIcon(round.wall());
			
			map[i][14].setText(wall);
			map[i][14].setIcon(round.wall());
			map[14][j].setText(wall);
			map[14][j].setIcon(round.wall());
			map[i][0].setText(wall);
			map[i][0].setIcon(round.wall());
			
			
		}
	}
	map[3][2].setText(wall); map[3][2].setIcon(round.wall());
	map[3][3].setText(wall); map[3][3].setIcon(round.wall());
	map[3][4].setText(wall); map[3][4].setIcon(round.wall());
	
	map[3][10].setText(wall); map[3][10].setIcon(round.wall());
	map[3][11].setText(wall); map[3][11].setIcon(round.wall());
	map[3][12].setText(wall); map[3][12].setIcon(round.wall());
	
	map[1][7].setText(wall); map[1][7].setIcon(round.wall());
	map[2][7].setText(wall); map[2][7].setIcon(round.wall());
	map[3][7].setText(wall); map[3][7].setIcon(round.wall());
	map[4][7].setText(wall); map[4][7].setIcon(round.wall());
	

	map[13][7].setText(wall); map[12][7].setIcon(round.wall());
	map[12][7].setText(wall); map[13][7].setIcon(round.wall());
	
	map[7][1].setText(wall); map[7][1].setIcon(round.wall());
	map[7][2].setText(wall); map[7][2].setIcon(round.wall());
	map[7][3].setText(wall); map[7][3].setIcon(round.wall());
	map[7][4].setText(wall); map[7][4].setIcon(round.wall());
	map[7][5].setText(wall); map[7][5].setIcon(round.wall());
	
	map[7][13].setText(wall); map[7][13].setIcon(round.wall());
	map[7][12].setText(wall); map[7][12].setIcon(round.wall());
	map[7][11].setText(wall); map[7][11].setIcon(round.wall());
	map[7][10].setText(wall); map[7][10].setIcon(round.wall());
	map[7][9].setText(wall); map[7][9].setIcon(round.wall());
	
	map[12][1].setText(wall); map[12][1].setIcon(round.wall());
	map[12][2].setText(wall); map[12][2].setIcon(round.wall());
	map[12][3].setText(wall); map[12][3].setIcon(round.wall());
	
	map[12][11].setText(wall); map[12][11].setIcon(round.wall());
	map[12][12].setText(wall); map[12][12].setIcon(round.wall());
	map[12][13].setText(wall); map[12][13].setIcon(round.wall());
	
	map[10][4].setText(wall); map[10][4].setIcon(round.wall());
	map[10][5].setText(wall); map[10][5].setIcon(round.wall());
	map[10][6].setText(wall); map[10][6].setIcon(round.wall());
	map[10][7].setText(wall); map[10][7].setIcon(round.wall());
	map[10][8].setText(wall); map[10][8].setIcon(round.wall());
	map[10][9].setText(wall); map[10][9].setIcon(round.wall());
	map[10][10].setText(wall); map[10][10].setIcon(round.wall());
	
	map[9][7].setText(wall); map[9][7].setIcon(round.wall());
	map[8][7].setText(wall); map[8][7].setIcon(round.wall());
	map[7][7].setText(wall); map[7][7].setIcon(round.wall());
	
	
}


public void setFrut(){
	if(map[][].getText().equals(frut.name)){
		
	}
}


}
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 30.03.2017 в 15:01.
Nukz вне форума Ответить с цитированием
Старый 30.03.2017, 15:09   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

два способа.
первый. простой, но не супер быстрый и эффективный.
в цикле генерировать два случайных числа от 0 до 14, проверять,
если map[appleX][appleY] пустое - записать туда яблоко и выход из цикла,
иначе повторять цикл ( пока map[appleX][appleY] не пустое).

второй. сложнее. но в идеале более эффективный.
составить список из координат пустых ячеек.
получать случайное число (от 0 до количество_элементов_в_списке), брать из списка координаты выпавшей ячейки и удалять её из списка.

какой способ выбрать зависит от Вас (и от деталей - может ли всё игровое поле оказаться полностью или почти полностью занятым).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.03.2017, 15:30   #3
Nukz
 
Регистрация: 16.03.2017
Сообщений: 5
По умолчанию

вы знаете я делаю метод
Код:
public void setApple(){
  int appleY=(int)(Math.random()*14);
  int appleX=(int)(Math.random()*14);
  if(!map[appleX][appleY].setText().equals(wall)){
            map[appleX][appleY].setIcon(frut.setImFrut)
             map[appleX][appleY].setText(frut.getName)
  }
}
но у меня одинкаово выпадает на стенках яблоки!

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 30.03.2017 в 15:39.
Nukz вне форума Ответить с цитированием
Старый 30.03.2017, 15:44   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

ну, логично. цикла же нет!

ну и setText() тут не к месту!! ( map[appleX][appleY].setText() )

попробуйте ПРИМЕРНО так:
Код:

public void setApple(){
  do {
     int appleY=1+(int)(Math.random()*13);
     int appleX=1+(int)(Math.random()*13);
   } while (map[appleX][appleY].getText().equals(wall));
   map[appleX][appleY].setIcon(frut.setImFrut);
   map[appleX][appleY].setText(frut.getName);
}
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.03.2017, 18:39   #5
Nukz
 
Регистрация: 16.03.2017
Сообщений: 5
По умолчанию

Вы знаете и так не получается !!! говорит что надо создать Локальные переменные AppleX,AppleY
а нет смысла их создавать не в цыкле!
Nukz вне форума Ответить с цитированием
Старый 30.03.2017, 20:52   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Мне кажется, что переменные нужно все-таки объявить вне цикла, так как они используются не только в цикле, но и после.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 30.03.2017, 22:22   #7
Nukz
 
Регистрация: 16.03.2017
Сообщений: 5
По умолчанию

сейчас попробуем !!!
Nukz вне форума Ответить с цитированием
Старый 30.03.2017, 22:45   #8
Nukz
 
Регистрация: 16.03.2017
Сообщений: 5
По умолчанию

Вы знаете ничего не получается !!!
Nukz вне форума Ответить с цитированием
Старый 31.03.2017, 10:20   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Мне кажется, что переменные нужно все-таки объявить вне цикла, так как они используются не только в цикле, но и после.
Вы абсолютно правы, это мой косяк!
но я же сказал - "ПРИМЕРНО так". Код я же не проверял!

ну, конечно, описание переменных нужно вынести за цикл:

Код:
public void setApple(){
  int appleY, appleX;
  do {
     appleY=1+(int)(Math.random()*13);
     appleX=1+(int)(Math.random()*13);
   } while (map[appleX][appleY].getText().equals(wall));
   map[appleX][appleY].setIcon(frut.setImFrut);
   map[appleX][appleY].setText(frut.getName);
}
Внимание! Код не проверял! Требуется проверка!


Цитата:
Сообщение от Nukz Посмотреть сообщение
Вы знаете ничего не получается !!!
что именно не получается? Код не копируется? Его редактор отвергает?
Компилятор выдаёт ошибку о том, что не будет компилировать код, взятый в Интернете? При работе программы выскакивает неизвестная ошибка?
Компьютер зависает в бесконечном цикле?
"яблоки" на игровом поле не появляются или появляются не там, где должны быть?
Что не получается то?!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.03.2017, 12:57   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
но я же сказал - "ПРИМЕРНО так". Код я же не проверял!
Да я без претензий Просто показалось, что ТС отверг идею выноса переменных вне цикла, когда код не заработал.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с кодом - вопрос по типу данных bool marenko.lilia Общие вопросы C/C++ 24 11.02.2014 21:14
Пишу 2д игру. Помогите плиз Xzen Gamedev - cоздание игр: Unity, OpenGL, DirectX 95 21.12.2009 12:08
Прошу чуточку помочь. пишу игру Pacman на Turbo C++... Олегус Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 20.05.2009 23:57
Пишу Pacman. Нужна помощь. AngelOfDeath Gamedev - cоздание игр: Unity, OpenGL, DirectX 12 07.10.2008 14:34
Помогите пишу дипломку, срочно надо разобраться Irinka Помощь студентам 7 29.03.2008 11:25