private void generateSite() {
		int street = 1, step = 0;
		int[] siteNum = new int[] {0,4,2,2,3,2,3};  // Refer to Vocab.CellTypeName
		// create 8 streets, 4*((4+6)||(5+5)||(6+4))
		int randStMaxNo = 0, randSiteType = 0;
		for (int i = 0; i < 4; i++) {
			randStMaxNo = Helper.rand(3) + 4;
			// create a street
			for (int j = 0; j < randStMaxNo; j++) {
				route[step].street = street;
				route[step].streetNo = j + 1;
				route[step].price = randPrice();
				step++;
			}
			street++;
			// create 1 or 2 special site
			for (int j = 0; j < Helper.rand(2) + 1; j++) {
				do {
					randSiteType = Helper.rand(6) + 1;
				} while (siteNum[randSiteType] == 0); 
				route[step].type = randSiteType;
				route[step].icon = Vocab.CellIcon[randSiteType];
				step++;
			}
			// create a street
			for (int j = 0; j < (10 - randStMaxNo); j++) {
				route[step].street = street;
				route[step].streetNo = j + 1;
				route[step].price = randPrice();
				step++;
			}
			street++;
			// create 1 or 2 special site
			for (int j = 0; j < Helper.rand(2) + 1; j++) {
				do {
					randSiteType = Helper.rand(6) + 1;
				} while (siteNum[randSiteType] == 0); 
				route[step].type = randSiteType;
				route[step].icon = Vocab.CellIcon[randSiteType];
				step++;
			}
		}
		// create remaining special site
		for (int j = step; j < route.length; j++) {
			do {
				randSiteType = Helper.rand(6) + 1;
			} while (siteNum[randSiteType] == 0); 
			route[step].type = randSiteType;
			route[step].icon = Vocab.CellIcon[randSiteType];
			step++;
		}
	}