protected void deal(){
		//Create a new deck
		dealing = true;
		turns = 0;
		//First, reset all deck variables
		Arrays.fill(in_play, false);
		Arrays.fill(memory, 0);
		draw_count = 0;
		discard_count = cards;
		for (int i=0; i<cards; i++)
			discard[i] = i+1;
		shuffle(true);
		//Reset memory variables
		Arrays.fill(memory_hash, -1);
		memory_head = 0;
		memory_count = 0;
		has_shuffled = false;
		//Deal out the cards
		for (Player p: players){
			//Fill each rack from top to bottom
			int[] hand = new int[rack_size];
			for (int j=rack_size-1; j>=0; j--){
				//We could call the "draw()" function here, but this is more efficient
				hand[j] = draw[--draw_count];
				in_play[hand[j]-1] = true;
			}
			p.rack.deal(hand);
			p.beginRound();
		}
		action = false;
		dealing = false;
	}