JAVA – 큐로 구현한 룰렛 (Roulette)

package test;

import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;

class Queue {
	int max;
	ArrayList<String> queue;
	
	// 큐 정의
	public Queue(int max) {
		this.max=max;
		queue=new ArrayList<>(max);
	}
	
	
	// 큐 삽입 
	public void enqueue(String e) {
		if(!is_full()) 
			queue.add(e);
		else
			System.out.println("큐가 꽉 찼음!");
	}
	
	// 큐 삭제 
	public String dequeue() {
		if(!is_empty()) {
			String r=queue.get(0);
			queue.remove(0);
			return r;
		}
		else {
			System.out.println("큐가 비었음!");
			return null;
		}
	}
	
	// 큐가 비었는지 확인 
	public boolean is_empty() {
		if(queue.size()==0)
			return true;
		else
			return false;
	}
	
	// 큐가 꽉 찼는지 확인 
	public boolean is_full() {
		if(queue.size()==max)
			return true;
		else
			return false;
	}
	
	// 큐 사이즈 보내기
	public int size() {
		return queue.size();
	}
	
	// 큐 아이템 전체 보내기
	public String[] pass() {
		String[] r=new String[queue.size()];
		for(int i=0; i<queue.size(); i++) 
			r[i]=queue.get(i);
		return r;
	}

}

public class test extends JFrame{
	JTextField[] box=new JTextField[3];
	Font font1 = new Font("SansSerif", Font.BOLD, 30);
	
	public test() {
		 setTitle("Roulette");
		 setSize(400,300);
		 setLocation(700,300);
		 setLayout(new GridLayout(3,1));
		 setDefaultCloseOperation(EXIT_ON_CLOSE);
		 
		 for(int i=0; i<3; i++) {
			 box[i]=new JTextField(15);
			 box[i].setFont(font1);
			 box[i].setForeground(new Color(128,128,128));
			 if(i==1) { 
				 box[i].setForeground(Color.black);
				 box[i].setBackground(new Color(123,211,247));}
			 box[i].setEditable(false);
			 add(box[i]);
		 }		 
		 
		 setVisible(true);
	}
	
	public static void main(String[] args) {
		test t=new test();
		JTextField[] box=t.box;
		
		Queue q1=new Queue(10);
		Queue q2=new Queue(3);
		
		for(int i=0; i<q1.max; i++)
			q1.enqueue(i+"");
		
		for(int i=0; i<q2.max; i++) {
			String r=q1.dequeue();
			q2.enqueue(r);
		}
		
		for(int i=0; i<150; i++) {
			 try {
				Thread.sleep(10+i); // 0.01초부터 (0.1x)초로 서서히 딜레이 
				String[] qdata=q2.pass();
				for(int j=0; j<3; j++) 
					box[j].setText(qdata[2-j]);
			 } 
			 
			 catch (InterruptedException e) {
		        // TODO Auto-generated catch block
		     }

			String r=q2.dequeue();
			q1.enqueue(r);
			String r2=q1.dequeue();
			q2.enqueue(r2);
						
		}

	}
}

0 -> 1,2,…, 9 -> 0 -> … 이 반복되며 룰렛을 구현하는 방식!

프로그램 로직

큐 2개를 만들어서

하나는 데이터를 저장하는 큐(q1)
나머지는 데이터를 보여주는 큐(q2)로 지정합니다!

q1와 q2를 반전된 모습으로 생각합니다.


1) q1에 나타낼 데이터를 모두 저장합니다.

Queue q1=new Queue(10);
Queue q2=new Queue(3);

for(int i=0; i<q1.max; i++)
    q1.enqueue(i+"");

데이터를 저장하는 큐 (빨간 색으로 표시)
데이터를 보여주는 큐 (파란 색으로 표시)


2) q1에서 q2의 용량만큼 데이터를 삭제하고, q2에 삽입합니다.

for(int i=0; i<q2.max; i++) {
    String r=q1.dequeue();
    q2.enqueue(r);
}


3) q2의 데이터를 한 개 삭제해서 q1에 삽입합니다.
4) q1의 데이터를 한 개 삭제해서 q2에 삽입합니다.

String r=q2.dequeue();
q1.enqueue(r);
String r2=q1.dequeue();
q2.enqueue(r2);


5) (3)-(4) 과정을 반복합니다.
q2에는 데이터가 삭제되자마자 새로운 데이터가 삽입되므로,
계속 데이터가 한 칸씩 변하는 형태를 띕니다.

큐의 FIFO(먼저 들어온 데이터가 먼저 나가는 구조)를 이용해서 위처럼 문제를 해결할 수 있습니다!

Leave a Reply

Your email address will not be published. Required fields are marked *