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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2012, 04:50   #1
yazZ3va
Пользователь
 
Регистрация: 07.11.2012
Сообщений: 14
По умолчанию Вопрос по Java

доброго времени суток
Я студент 1 курса так что прошу сильно не ругатся)
Вот решил написать Battle city(если кто не знает эта игра такая с 8-ми битной приставки))
Не могли бы вы ответить на пару вопросов?
1.Я более менее правильно написал код?))
2.Если пуля(Прямоугольник Rectangle) сталкивается с другим прямоугольникам(танкам) то они должны удалятся.
Но почему то это работает толька с одной пулей, и то 9 раз из 10 срабатвает. На 10 ана проста тупа пролетает сквозь него.
С 2 пулями и более вот что происходит.
Цитата:
ml 1
ms 1
ms 2
ms 3
ms 4
ms 5
ml 1
ms 1
ms 2
ms 3
ms 4
ms 5
ml 2
Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException
at java.util.ArrayList$Itr.next(Unknow n Source)
at Map.Balltest(Map.java:98)
at Map.actionPerformed(Map.java:76)
at javax.swing.Timer.fireActionPerform ed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(U nknown Source)
at java.awt.event.InvocationEvent.disp atch(Unknown Source)
at java.awt.EventQueue.dispatchEventIm pl(Unknown Source)
at java.awt.EventQueue.access$200(Unkn own Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPr ivileged(Native Method)
at java.security.ProtectionDomain$1.do IntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(U nknown Source)
at java.awt.EventDispatchThread.pumpOn eEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEv entsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEv entsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEv ents(Unknown Source)
at java.awt.EventDispatchThread.pumpEv ents(Unknown Source)
at java.awt.EventDispatchThread.run(Un known Source)
Цитата:
public void Balltest() {
int ml=0 , ms=0;
Iterator<enemy> i = enemies.iterator();
Iterator<Ball> j = Bald.iterator();
m= enemies.size() ;
s= Bald.size() ;

for (int n=0; n<s; n++ ) {
Ball l = j.next();
ml++;
System.out.println("ml "+ml);
for (int c=0; c<m; c++ ) {
enemy d = i.next();

ms++;
System.out.println("ms "+ms);
if (l.Bal().intersects(d.RecE())) {
System.out.println("two fd ");
j.remove();
i.remove();
}


}

}
}
yazZ3va вне форума Ответить с цитированием
Старый 07.11.2012, 04:51   #2
yazZ3va
Пользователь
 
Регистрация: 07.11.2012
Сообщений: 14
По умолчанию

Вот код полностью
Цитата:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;









public class Map extends JPanel implements ActionListener, Runnable {
Timer MyTimer = new Timer(20, this);

Image img_1 = new ImageIcon("res/map.jpg").getImage();
Image img = img_1;
Player p = new Player();



int x, y, s, m;
static int stop=0, stopb=0, stopc=0, stopd=0;


Thread naw = new Thread(this, "respawn");
Random random = new Random();

List<enemy> enemies = new ArrayList<enemy>();
List<Ball> Bald = new ArrayList<Ball>();




public Map() {
naw.start();
MyTimer.start();



addKeyListener(new MyKeyAdapter());
setFocusable(true);


}
private class MyKeyAdapter extends KeyAdapter {
public void keyPressed(KeyEvent e) {
p.KeyPressed(e);
}
public void keyReleased(KeyEvent e) {
p.keyReleased(e);
}
}
public void actionPerformed(ActionEvent e) {

p.move();
repaint();
TestCollisium();
respawn ();
Balltest();




}
public void Balltest() {
int ml=0 , ms=0;
Iterator<enemy> i = enemies.iterator();
Iterator<Ball> j = Bald.iterator();
m= enemies.size() ;
s= Bald.size() ;

for (int n=0; n<s; n++ ) {
Ball l = j.next();
ml++;
System.out.println("ml "+ml);
for (int c=0; c<m; c++ ) {
enemy d = i.next();

ms++;
System.out.println("ms "+ms);
if (l.Bal().intersects(d.RecE())) {
System.out.println("two fd ");
j.remove();
i.remove();
}


}

}
}


public void TestCollisium(){





Iterator<enemy> i = enemies.iterator();
while (i.hasNext()) {
enemy e = i.next();



if (p.RecP().intersects(e.RecE())) {

if (Player.r==Player.go) {
Player.r=0;
stop=1;
Player.go=1;
}
if (Player.d==Player.go) {
Player.d=0;
stopb=1;
Player.go=1;
}
if (Player.l==Player.go) {
Player.l=0;
stopc=1;
Player.go=1;
}
if (Player.u==Player.go) {
Player.u=0;
stopd=1;
Player.go=1;
}
e.b=0;
e.v=0;

}
else Player.go=4;

}
}









public void respawn () {
if (p.space==1 && Bald.size()<=0) {


Bald.add(new Ball(p.x, p.y));


}
}

public void paint (Graphics g) {
g = (Graphics2D) g;
g.drawImage(img, 0, 0, null);


Iterator<Ball> k = Bald.iterator();
while(k.hasNext()) {
Ball z = k.next();
z.move();


if (z.x >= 843 || z.y>=739) {
k.remove();
}
if (z.x <= 25 || z.y <=25) {
k.remove();
}

g.drawImage(z.img, z.x+z.n, z.y+z.m, null);
}

Iterator<enemy> i = enemies.iterator();
while(i.hasNext()) {
enemy e = i.next();
e.move();

g.drawImage(e.imag_1, e.x, e.y, null);
}
g.drawImage(p.img, p.x, p.y, null);

}

public void run() {



while (true) {

try {
Thread.sleep(4000);

m= enemies.size() ;
Random rand = new Random();
if (m<=4) {
enemies.add(new enemy(25 + rand.nextInt(815), 25 + rand.nextInt(200)));
}

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

}

Последний раз редактировалось yazZ3va; 07.11.2012 в 13:40.
yazZ3va вне форума Ответить с цитированием
Старый 07.11.2012, 04:52   #3
yazZ3va
Пользователь
 
Регистрация: 07.11.2012
Сообщений: 14
По умолчанию

Собственно пуля)
Цитата:
import java.awt.Image;
import java.awt.Rectangle;

import javax.swing.ImageIcon;


public class Ball {
Image img_1 = new ImageIcon("res/ballA.png").getImage();
Image img_2 = new ImageIcon("res/ballB.png").getImage();
Image img_3 = new ImageIcon("res/ballC.png").getImage();
Image img_4 = new ImageIcon("res/ballD.png").getImage();
Image img = img_1;


int x, y, b, v, s, t, n, m;

Ball (int x, int y) {
this.x = x;
this.y = y;



}



public Rectangle Bal() {
return new Rectangle(x, y, 5, 5);
}

public void move () {

if (s==0) {
if (Player.tyt==0) {
v=-5;
img = img_1;
n=15;
s=1;
t=0;
}
if (Player.tyt==1) {
b=5;
img = img_2;
m=14;
s=1;
t=1;
}
if (Player.tyt==2) {
v=5;
img = img_3;
n=18;
s=1;
t=2;
}
if (Player.tyt==3) {
b=-5;
img = img_4;
m=17;
s=1;
t=3;
} }
if (s==1) {

if (t==0) {
v=-5;

}
if (t==1) {
b=5;

}
if (t==2) {
v=5;

}
if (t==3) {
b=-5;

}

}
x +=b;
y +=v;

}








}
yazZ3va вне форума Ответить с цитированием
Старый 07.11.2012, 04:54   #4
yazZ3va
Пользователь
 
Регистрация: 07.11.2012
Сообщений: 14
По умолчанию

И танк.....
Цитата:
import java.awt.Image;
import java.awt.Rectangle;
import java.util.Random;

import javax.swing.ImageIcon;






public class enemy implements Runnable {
int x, y, s, u, d, b, v;

Image imag_11 = new ImageIcon("res/enemy1A.png").getImage();
Image imag_12 = new ImageIcon("res/enemy1B.png").getImage();
Image imag_13 = new ImageIcon("res/enemy1C.png").getImage();
Image imag_14 = new ImageIcon("res/enemy1D.png").getImage();
Image imag_1 = imag_13;

Image imag_41 = new ImageIcon("res/enemy4A.png").getImage();
Image imag_42 = new ImageIcon("res/enemy4B.png").getImage();
Image imag_43 = new ImageIcon("res/enemy4C.png").getImage();
Image imag_44 = new ImageIcon("res/enemy4D.png").getImage();
Image imag_4 = imag_43;


public static final int max_x=843;
public static final int max_y=739;
public static final int min_x=25;
public static final int min_y=25;
Player p = new Player();
Thread run = new Thread(this, "enemy");



enemy (int x, int y) {
this.x =x;
this.y =y;
run.start();
}




public Rectangle RecE () {
return new Rectangle(x, y, 43, 43);

}






public void move () {
int j;
Random random = new Random();
x += b;
y += v;



if (b==1) {
imag_1 = imag_12;
imag_4 = imag_42;
}
if (b==-1) {

imag_1 = imag_14;
imag_4 = imag_44;
}
if (v==1) {
imag_1 = imag_13;
imag_4 = imag_43;
}
if (v==-1) {
imag_1 = imag_11;
imag_4 = imag_41;
}



if (x >= max_x && b==1) {
b = 0;
j = random.nextInt(3);
if (j==0)
b = -1;
if (j==1)
v = 1;
if (j==2)
v = -1;

}
if (x <= min_x && b==-1) {
b = 0;
j = random.nextInt(3);
if (j==0)
b = 1;
if (j==1)
v = 1;
if (j==2)
v = -1;

}
if (y <= min_y && v==-1) {
v = 0;
j = random.nextInt(3);
if (j==0)
b = -1;
if (j==1)
v = 1;
if (j==2)
b = 1;

}
if (y >= max_y && v==1) {
v = 0;
j = random.nextInt(3);
if (j==0)
b = -1;
if (j==1)
b = 1;
if (j==2)
v = -1;

}

}



public void run(){
int s;
while (true) {

Random rand = new Random();
try {
Thread.sleep(2000+rand.nextInt(1000 ));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
b=v=0;
s = rand.nextInt(4);
if (s == 0) {
b = 1;
}
if (s == 1) {
b = -1;
}
if (s == 2) {
v = 1;
}
if (s == 3) {
v = -1;
}


}




}






}

yazZ3va вне форума Ответить с цитированием
Старый 07.11.2012, 11:33   #5
bedman
Пользователь
 
Регистрация: 24.07.2012
Сообщений: 28
По умолчанию

в функции Balltest все изменения массива надо синхронизировать
bedman вне форума Ответить с цитированием
Старый 07.11.2012, 13:41   #6
yazZ3va
Пользователь
 
Регистрация: 07.11.2012
Сообщений: 14
По умолчанию

а как это сделать?
И еще один вопрос.
В классе Rectangle есть какой нибудь метод чтобы прямоугольники не могли пересекаться?

Последний раз редактировалось yazZ3va; 07.11.2012 в 13:54.
yazZ3va вне форума Ответить с цитированием
Старый 07.11.2012, 17:00   #7
bedman
Пользователь
 
Регистрация: 24.07.2012
Сообщений: 28
По умолчанию

вы не бойтесь гуглить, например java arraylist synchronization
bedman вне форума Ответить с цитированием
Старый 07.11.2012, 18:22   #8
yazZ3va
Пользователь
 
Регистрация: 07.11.2012
Сообщений: 14
По умолчанию

Что то не получается синхронизировать.
yazZ3va вне форума Ответить с цитированием
Старый 07.11.2012, 18:50   #9
bedman
Пользователь
 
Регистрация: 24.07.2012
Сообщений: 28
По умолчанию

Object obj=new Object();
Synchronized(obj){
Balltest();
}
bedman вне форума Ответить с цитированием
Старый 07.11.2012, 20:28   #10
yazZ3va
Пользователь
 
Регистрация: 07.11.2012
Сообщений: 14
По умолчанию

По прежнему ошибка
Код:
]ml  1
ms  1
ms  2
ms  3
ms  4
ms  5
ml  2
Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException
	at java.util.ArrayList$Itr.next(Unknown Source)
	at Map.Balltest(Map.java:96)
	at Map.actionPerformed(Map.java:74)
	at javax.swing.Timer.fireActionPerformed(Unknown Source)
	at javax.swing.Timer$DoPostEvent.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
]
Я что та нетак сделал?
Код:
]public void Balltest() {
int ml=0 , ms=0;
Collection<enemy> enem = Collections.synchronizedCollection(enemies);
Collection<Ball> bal = Collections.synchronizedCollection(Bald);
synchronized (enem) {
	synchronized (bal) {
	Iterator<enemy> i = enem.iterator();
	Iterator<Ball> j = bal.iterator();
	  m= enemies.size() ;
      s= Bald.size() ;
    
		for (int n=0; n<s; n++ ) {
		Ball l = j.next();
             ml++;
             System.out.println("ml  "+ml);
			for (int c=0; c<m; c++ ) {
		enemy d = i.next();
	
		ms++;
        System.out.println("ms  "+ms);
			if (l.Bal().intersects(d.RecE())) {
				System.out.println("two    fd    ");
				j.remove();
				i.remove();
			}
			
				
			}
			
		}
      }	
} }
]

Последний раз редактировалось yazZ3va; 08.11.2012 в 01:21.
yazZ3va вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по java, стоит ли начать изучать Anton911 Помощь студентам 2 18.09.2012 15:47
Вопрос по аргументу. Java Shmelgun Помощь студентам 2 05.06.2012 12:57
Просто вопрос по Java otorvish Помощь студентам 1 17.12.2011 13:42
Вопрос по java megostudent Помощь студентам 0 06.12.2011 15:49
Глупый вопрос по Java MyLastHit Свободное общение 15 08.07.2011 14:18