자바 다 중 스 레 드 교통 신호등 시 뮬 레이 션 과정 상세 설명

이번 학기 우리 자바 과정의 과정 설계 프로젝트-교통 신호등 의 스 레 드 디자인
실험 목적:다 중 스 레 드 디자인,동기 화 체제4.567917.교통 신호등 류 를 디자인 하 는 데 목적 을 둔다.
  • 변수:위치,색상(빨간색,노란색,녹색),표시 시간(초)
  • 방법:신호등 을 전환 합 니 다4.567917.두 개의 스 레 드(동서 방향,남북 방향)를 만 들 고 동시에 운행 합 니 다
  •  실험 요구
    디자인 스 레 드
  • 4.567917.길목 신호등 설명도 인터페이스 디자인4.567917.각 방향의 신호등 을 3 가지 차선 등 으로 나 누 었 다.좌회전,직진 과 우회전차 의 흐름 에 따라 시간의 모호 한 통 제 를 한다수업 설계 의 시작 부분 에서 선생님 의 요 구 를 자세히 보지 않 고 신호등 이라는 것 만 알 았 다.그 다음 에 각종 자 료 를 찾기 시 작 했 습 니 다.바 이 두,인터넷 에서 대량의 신호등 에 관 한 디자인 은 모두 장 효 상 선생님 의 강 좌 를 참고 하 는 것 입 니 다.대략적인 디자인 방법 은 세 가지 유형의 lamp,road,lampcontrol 을 만 드 는 것 입 니 다.
    거위..............................................................................................
    그래서 디자인 방향 이 바로 뚜렷 해 졌 다.장 선생님 의 방법 에 따라 모든 길목 에 세 개의 등 이 있 는데 각각 좌회전,직진,우회전 이기 때문에 모두 12 개의 등 이 있다.요구 에 따라 우회전 등 은 상등 이 고 좌회전 과 직진 등 이 있어 야 빨간색 과 녹색 이 교체 된다.우회전 등 을 제외 한 8 개의 등 안 에는 동서 좌회전 남북(평행 회전 수직),남북 직진(수직 통행),남북 좌회전 동서(수직 회전 평행),동서 직진(평행 통행)등 4 개 조로 나 눌 수 있다.
    그래서 나 는 이 12 개의 등 에 번 호 를 매 겼 다.

    emmm 는 대략 이 렇 습 니 다.하지만 생활 속 의 신호등 과 달리 생활 속 의 것 은 모두 맞은편 길목 의 등 을 보 는 것 입 니 다.우 리 는 여기 서 시 뮬 레이 션 을 하 는 것 입 니까?각 길목 마다 각 길목 의 등 을 사용 하 는 것 입 니 다.
    대충 설명 하 다.
    1 번 등 은 남쪽 에서 서쪽 으로 좌회전 등,2 번 등 은 남쪽 에서 북쪽 으로 직진 등,3 번 등 은 남쪽 에서 동쪽 으로 우회전 등 이다.
    4 번 등 은 동쪽 에서 북쪽 으로 우회전 하 는 등,5 번 등 은 동쪽 에서 서쪽 으로 직진 하 는 등,6 번 등 은 동쪽 에서 남쪽 으로 좌회전 하 는 등 이다.
    7 번 등 은 북 에서 서쪽 으로 우회전 하 는 등,8 번 등 은 북 에서 남쪽 으로 직진 하 는 등,9 번 등 은 북 에서 동쪽 으로 좌회전 하 는 등 이다.
    10 번 등 은 서쪽 에서 북쪽 으로 좌회전 하 는 등,11 번 등 은 서쪽 에서 동쪽 으로 직진 하 는 등,12 번 등 은 서쪽 에서 남쪽 으로 우회전 하 는 등 이다.
    그리고 일치 하 는 원칙 에 따라 대략 이 그림 입 니 다.

    우 리 는 얻 을 수 있다.
    이 네 개의 신호등.
    여기까지 와 서 우 리 는 사고방식 이 매우 뚜렷 해 졌 다.우 리 는 각 조 의 신호등 에 하나의 프로 세 스 를 켜 고 네 개의 프로 세 스 를 순환 하여 교체 하면 녹색 신호등 의 전환 을 실현 할 수 있다.거리의 동기 화 기술 을 사용 했다.
    물론,우 리 는 이미 네 가지 과정 을 열 었 습 니 다.금상첨화 를 위해 서,나 는 당연히 작은 차 를 하나 더 추가 하 는 것 을 개의 치 않 습 니 다 hhhhhh
    실험 결과 도:

    원본 코드:
    light 클래스:
    
    package traffic;
     public class light {
    	int x,y;         //        
    	boolean status;      //    
    	public light(int x,int y,boolean islight) {
    		this.x=x;        
    		this.y=y;
    		this.status=islight;
    	}
    	public void setlight(boolean sta) {    //          
    		this.status=sta;
    	}
    }
    lamp 클래스:
    
    package traffic;
     public class lamp implements Runnable {
    	light opposite, now;      //        
    	int greentime;         //      
    	int name;            //  
    	boolean status;         //  
    	static Object lock = new Object();
     
    	public lamp(light l0, light l2,int gt, boolean st, int name) {
    		now = l0;
    		opposite = l2;
    		status = st;
    		greentime = gt;
    		this.name = name;
    		lightstatues();
    	}
     
    	public void change() { 
    		this.status = !(this.status);
    		lightstatues();
    	}
    	public void setgreentime(int time) {
    		this.greentime=time;
    	}
    	public int getgreentime() {
    		return this.greentime;
    	}
    	public void lightstatues() {
    		opposite.setlight(status);
    		now.setlight(status);
    	}
     
    	public void run() {
    		while (true) {
    			synchronized (lock) {        //  synchronized        
    				if (name == mainclass.panel.islight) {      //               
    					//System.out.println("now is: "+name);
    					change();
    					mainclass.panel.repaint();
    					try {
    						Thread.sleep(greentime);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					lock.notifyAll();        //      
    					change();
    					mainclass.panel.LampChange();
    					mainclass.panel.repaint();
    					try {
    						lock.wait();
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				} else {
    					try {
    						lock.wait();      //    
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    		}
    	}
    }
    Mypanel 클래스:
    
    package traffic;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.util.ArrayList;
    import java.util.Random;
    import javax.swing.JPanel;
    public class Mypanel extends JPanel {
    	light l0,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12;   //    
    	lamp lamp1,lamp2,lamp3,lamp4;           //     
    	static int islight;                //           
    	Random r=new Random();
    	static public ArrayList<light> lightlist= new ArrayList<light>();  //  list       
    	static public ArrayList<car> carlist= new ArrayList<car>();          //       
    	public Mypanel() {
    		// TODO Auto-generated constructor stub
    		l0=addlist(l0, 212, 316, false);
    		l2=addlist(l2, 242, 316, false);	
    		l3=addlist(l3, 272, 316, true);	
    		l4=addlist(l4, 316, 116, true);	
    		l5=addlist(l5, 316, 146, false);	
    		l6=addlist(l6, 316, 176, false);	
    		l7=addlist(l7,116 , 70, true);	
    		l8=addlist(l8, 146, 70, false);	
    		l9=addlist(l9, 176, 70, false);	
    		l10=addlist(l10, 70, 212, false);	
    		l11=addlist(l11, 70, 242, false);	
    		l12=addlist(l12, 70, 272, true		
    		lamp1=new lamp(l9,l0,2000,false,0);
    		lamp2=new lamp(l11,l5,2000,false,1);
    		lamp3=new lamp(l10,l6,2000,false,2);
    		lamp4=new lamp(l8,l2,2000,false,3);
     		islight = 0 ;		
    		Thread t1=new Thread(lamp1);      //       
    		Thread t2=new Thread(lamp2);
    		Thread t3=new Thread(lamp3);
    		Thread t4=new Thread(lamp4);
    		t1.start();
    		t2.start();
    		t3.start();
    		t4.start();
    	}
    	light addlist(light a,int x,int y,boolean sta) {
    		a=new light(x,y,sta);
    		lightlist.add(a);
    		return a;
    	}
    	public void addcar() {          //    
    		int now,next;
    		now=r.nextInt(4);
    		next=r.nextInt(4);
    		car testcar=null;
    		while(now==next) 
    			next=r.nextInt(4);
    		switch(now) {
    		case 0:
    			testcar=new car(now,next,l0,l2,l3);
    			break;
    		case 1:
    			testcar=new car(now,next,l6,l5,l4);
    			break;
    		case 2:
    			testcar=new car(now,next,l9,l8,l7);
    			break;
    		case 3:
    			testcar=new car(now,next,l10,l11,l12);
    			break;
    		}
    		carlist.add(testcar);
    		Thread catt=new Thread(testcar);
    		catt.start();
    	}
    	public void LampChange() {
    		islight=(islight+1)%4;
    	}
    	public void paint(Graphics g) {
    		super.paint(g);
    		
    		g.setColor(Color.darkGray);    //  
    		g.fillRect(0, 100, 400, 6);
    		g.fillRect(0, 300, 400, 6);
    		g.fillRect(100, 0, 6, 400);
    		g.fillRect(300, 0, 6, 400);
    		g.setColor(Color.gray);
    		g.fillRect(0, 200, 400, 2);
    		g.fillRect(200, 0, 2, 400);
    		g.setColor(Color.blue);	
    		g.setColor(Color.black);     //     
    		g.fillRect(202,306, 100, 40);
    		g.fillRect(306,106, 40, 100);
    		g.fillRect(106,60, 100, 40);
    		g.fillRect(60,202,40, 100);
    		light temp;
    		car buf;
    		for(int i=0;i<carlist.size();i++) {   //  
    			buf=carlist.get(i);
    			g.setColor(Color.BLUE);
    			g.fillRect(buf.x, buf.y, 50, 50);
    		}
    		for(int i=0;i<lightlist.size();i++) {    //  
    			temp=lightlist.get(i);
    			if(temp.status)
    				g.setColor(Color.green);
    			else
    				g.setColor(Color.RED);
    			g.fillOval(temp.x, temp.y, 20, 20);
    		}
    	}
    }
    welcome panel 클래스:
    
    package traffic; 
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import javax.swing.JPanel; 
    public class welcomepanel extends JPanel implements Runnable{  //    
    	int info = 0;
    	Boolean isLive=true; 
    	public void paint(Graphics g) {
    		super.paint(g);
    		g.fillRect(0, 0, 420,450);
    		g.setColor(Color.red);
    		g.setFont(new Font("    ", Font.BOLD, 30));
    		if (info % 2 == 0) {
    			g.drawString("        ", 80, 150);
    		}
    	}
     
    	public void run() {
    		// TODO Auto-generated method stub
    		while (true) {
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			info++;
    			this.repaint();
    			if (isLive == false) {
    				break;
    			}
    		}
    	}	
    }
    set 클래스:
    
    package traffic; 
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener; 
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField; 
    public class set extends JFrame implements ActionListener {   //    
      JLabel lab1,lab2,lab3,lab4;
      JTextField jtext1,jtext2,jtext3,jtext4;
      JPanel panel1,panel2,panel3,panel4;
      JButton jb1,jb2;
      int time1,time2,time3,time4;
    	public set(){ 
      	lab1=new JLabel("      :");
      	lab2=new JLabel("    :");
      	lab3=new JLabel("      :");
      	lab4=new JLabel("    :");
      	time1=mainclass.panel.lamp1.getgreentime();
      	time2=mainclass.panel.lamp2.getgreentime();
      	time3=mainclass.panel.lamp3.getgreentime();
      	time4=mainclass.panel.lamp4.getgreentime();
      	jtext1=new JTextField(String.valueOf(time1));
      	jtext2=new JTextField(String.valueOf(time2));
      	jtext3=new JTextField(String.valueOf(time3));
      	jtext4=new JTextField(String.valueOf(time4));
      	
      	jb1=new JButton("  ");
      	jb1.addActionListener(this);
      	jb2=new JButton("  ");
      	jb2.addActionListener(this);  	
      	this.setLayout(new GridLayout(5,2,10,5));
      	this.add(lab1);
      	this.add(jtext1);
      	this.add(lab2);
      	this.add(jtext2);
      	this.add(lab3);
      	this.add(jtext3);
      	this.add(lab4);
      	this.add(jtext4);
      	this.add(jb1);
      	this.add(jb2);  	
      	this.setLocationRelativeTo(null); 
      	this.setSize(200, 200); 
      	this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      	this.setResizable(false);
        this.setVisible(true); 
      }
      public void actionPerformed(ActionEvent e) {
      	if(e.getSource()==jb1) {
      		
      		if(jtext1.getText().length()==0||jtext2.getText().length()==0||jtext3.getText().length()==0||jtext4.getText().length()==0) 
      			JOptionPane.showMessageDialog(this, "       !", "  ", JOptionPane.INFORMATION_MESSAGE);
      		else {
      			mainclass.panel.lamp1.setgreentime(Integer.parseInt(jtext1.getText()));
      			mainclass.panel.lamp2.setgreentime(Integer.parseInt(jtext2.getText()));
      			mainclass.panel.lamp3.setgreentime(Integer.parseInt(jtext3.getText()));
      			mainclass.panel.lamp4.setgreentime(Integer.parseInt(jtext4.getText()));
      			this.dispose();
      		}
      	}else if(e.getSource()==jb2){
      		this.dispose();
      	}
      }
    }
    mainclass 주 클래스:
    
    package traffic;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener; 
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JOptionPane; 
    public class mainclass extends JFrame implements ActionListener{
    	static Mypanel panel;	
    	JMenuBar jmb;
    	JMenu jm1, jm2;
    	JMenuItem jmi1, jmi2,jmi3,jmi4;
    	welcomepanel sp;	
    	mainclass(){
    		this.setTitle("traffic lamp");
    		this.setSize(420,450);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		jmb=new JMenuBar();	
    		jm1=new JMenu("  ");
    		jm2=new JMenu("  ");	
    		jmi1=new JMenuItem("    ");
    		jmi1.addActionListener(this);
    		jmi2=new JMenuItem("    ");
    		jmi2.addActionListener(this);
    		jmi3=new JMenuItem("      ");
    		jmi3.addActionListener(this);
    		jmi4=new JMenuItem("      ");
    		jmi4.addActionListener(this);
    		jm1.add(jmi1);
    		jm1.add(jmi2);
    		jm1.add(jmi3);
    		jm2.add(jmi4);
    		jmb.add(jm1);
    		jmb.add(jm2);
    		
    		this.setJMenuBar(jmb);
    		
    		sp=new welcomepanel();
    		Thread t=new Thread(sp);
    		t.start();
    		this.setContentPane(sp);
    		
    		this.setLocationRelativeTo(null); 
    		this.setResizable(false);
    		this.setVisible(true);
    	}
    	
    	public void actionPerformed(ActionEvent e) {
    		if(e.getSource()==jmi1) {
    			sp.isLive=false;
    			this.remove(sp);
    			panel = new Mypanel();
    			this.setContentPane(panel);
    			this.setVisible(true);
    		}else if(e.getSource()==jmi2) {
    			System.exit(0);
    		}else if(e.getSource()==jmi3) {
    			if(panel==null)
      			JOptionPane.showMessageDialog(this, "          ", "  ", JOptionPane.INFORMATION_MESSAGE);
    			else panel.addcar();
    		}else if (e.getSource() == jmi4) {
    			if(mainclass.panel==null)
      			JOptionPane.showMessageDialog(this, "          ", "  ", JOptionPane.INFORMATION_MESSAGE);
    			else new set();
    			}
    		}
    	public static void main(String[] args) {
    		new mainclass();
    	}
    }
    다 중 스 레 드 정확성 테스트:
    저 희 는 lamp 류 의 run()방법 에 콘 솔 인쇄 명령 을 추가 하 였 습 니 다.프로 세 스 가 실 행 될 때마다 이 프로 세 스 의 name 구성원 을 인쇄 합 니 다.

    정확 한 인쇄 결 과 는 0-1-2-3-4-0-1-2-3-4-...-1-2-3-...
    콘 솔 의 출력 결 과 는 다음 과 같 습 니 다.

    예측 결과 에 부합 하여 실험 이 완성 되 었 습 니 다!
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기