% ALL HEURISTICS APPLIED TO AN OPPONENT %---------------------------------------------------------------------------------------------------------------------------------------------------------- % The player given will take a turn, where a turn consists of picking a card (from the deck), checking to see if any melds can be played % and then randomly discarding a card take_turn_everything((_, Hand, Melds, _), Deck, DiscardPile, (_, FinalHand, RealMelds, _), NewDeck1, NewDiscardPile, Runs, FinalRuns, Sets, FinalSets) :- draw_from_deck(Deck, NewDeck1, Hand, NewHand1), write("LOOKING FOR SETS..."), nl, find_set_all_melds(NewHand1, NewHand1, Melds, NewMelds, NewHand2, Sets, NewSets), merge_sort(NewHand2, SortedHand), write("LOOKING FOR RUNS..."), nl, find_run_melds(SortedHand, NewHand3, [diamonds, clubs, hearts, spades], NewMelds, NewestMelds, Runs, NewRuns), write("TRYING TO PLAY ON SETS..."), nl, play_on_meld_sets(NewHand3, NewHand4, NewestMelds, FinalMelds, _, NewSets, FinalSets), write("TRYING TO PLAY ON RUNS..."), nl, play_on_meld_runs(NewHand4, UpdateHand, FinalMelds, RealMelds, _, NewRuns, FinalRuns), random_discard(UpdateHand, DiscardPile, FinalHand, NewDiscardPile). % initializes the game and plays an entire round of rummy play_rummy_everything :- deck(Deck), sets(Sets), runs(Runs), player((player1, Hand1, Melds1, Score1)), player((player2, Hand2, Melds2, Score2)), init_rummy(Deck, (_, Hand1, _, _), (_, Hand2, _, _), DiscardPile, NewDeck, (_, NewHand1, _, _), (_, NewHand2, _, _)), play_rummy_round_everything(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, _, _, Sets, Runs), write(Runs), nl, write(Sets), nl. % Plays an entire game of rummy with basic moves and no heuristics play_entire_game_everything(Score1, _) :- Score1 >= 500, write("Player1 wins with score "), write(Score1). play_entire_game_everything(_, Score2) :- Score2 >= 500, write("Player2 wins with score "), write(Score2). play_entire_game_everything(Score1, Score2):- deck(Deck), sets(Sets), runs(Runs), player((player1, Hand1, Melds1, _)), player((player2, Hand2, Melds2, _)), init_rummy(Deck, (_, Hand1, _, _), (_, Hand2, _, _), DiscardPile, NewDeck, (_, NewHand1, _, _), (_, NewHand2, _, _)), play_rummy_round_everything(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2, Sets, Runs), play_entire_game_everything(UpdateScore1, UpdateScore2). % Plays an entire round of rummy. The round ends when either the deck, or one of the players' % hands is empty play_rummy_round_everything([], (_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2, Sets, Runs) :- calculate_score((_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl, human_readable_melds(Runs, HRRuns), write("RUNS: "), write(HRRuns), nl, human_readable_melds(Sets, HRSets), write("SETS: "), write(HRSets), nl, nl. play_rummy_round_everything(_, (_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2, Sets, Runs) :- calculate_score((_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl, human_readable_melds(Runs, HRRuns), write("RUNS: "), write(HRRuns), nl, human_readable_melds(Sets, HRSets), write("SETS: "), write(HRSets), nl, nl. play_rummy_round_everything(_, (_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), _, UpdateScore1, UpdateScore2, Sets, Runs) :- calculate_score((_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl, human_readable_melds(Runs, HRRuns), write("RUNS: "), write(HRRuns), nl, human_readable_melds(Sets, HRSets), write("SETS: "), write(HRSets), nl, nl. play_rummy_round_everything(Deck, (Player1, Hand1, Melds1, Score1), (Player2, Hand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2, Sets, Runs) :- human_readable(Deck, HRDeck), write("Deck: "), write(HRDeck), nl, human_readable(DiscardPile, HRDiscardPile), write("Discard Pile: "), write(HRDiscardPile), nl, human_readable_melds(Runs, HRRuns), write("Runs: "), write(HRRuns), nl, human_readable_melds(Sets, HRSets), write("Sets: "), write(HRSets), nl, nl, write("Player 1 turn!"), nl, print_info(Hand1, Melds1, "HAND BEFORE TURN: ", "MELDS BEFORE TURN: "), nl, take_turn_everything((Player1, Hand1, Melds1, Score1), Deck, DiscardPile, (_, NewHand1, NewMeld1, _), NewDeck1, NewDiscard1, Runs, NewRuns, Sets, NewSets), nl, print_info(NewHand1, NewMeld1, "HAND AFTER TURN: ", "MELDS AFTER TURN: "), nl, nl, write("Player 2 turn!"), nl, print_info(Hand2, Melds2, "HAND BEFORE TURN: ", "MELDS BEFORE TURN: "), nl, take_turn_everything((Player2, Hand2, Melds2, Score2), NewDeck1, NewDiscard1, (_, NewHand2, NewMeld2, _), NewDeck2, NewDiscard2, NewRuns, FinalRuns, NewSets, FinalSets), nl, print_info(NewHand2, NewMeld2, "HAND AFTER TURN: ", "MELDS AFTER TURN: "), nl, nl, nl, play_rummy_round_everything(NewDeck2, (Player1, NewHand1, NewMeld1, Score1), (Player2, NewHand2, NewMeld2, Score2), NewDiscard2, UpdateScore1, UpdateScore2, FinalSets, FinalRuns).