% FILE: game_types.pl % LINE: Defines all variants of games tested % DATE: February 20, 2021 % GAME WHERE ONLY SETS ARE USED AS MOVES AND OTHER PLAYER'S MELDS ARE PLAYED OFF OF % --------------------------------------------------------------------------------------------------------------------------------------------------------- % 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_sets2((_, Hand, Melds, _), Deck, DiscardPile, (_, NewHand3, FinalMelds, _), NewDeck1, NewDiscardPile, 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), play_on_meld_sets(NewHand2, FinalHand, NewMelds, FinalMelds, _, NewSets, FinalSets), random_discard(FinalHand, DiscardPile, NewHand3, NewDiscardPile). % initializes the game and plays an entire round of rummy play_rummy_sets2 :- sets(Sets), deck(Deck), player((player1, Hand1, Melds1, Score1)), player((player2, Hand2, Melds2, Score2)), init_rummy(Deck, (_, Hand1, _, _), (_, Hand2, _, _), DiscardPile, NewDeck, (_, NewHand1, _, _), (_, NewHand2, _, _)), play_rummy_round_sets2(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, _, _, Sets), write(Sets). % Plays an entire game of rummy with basic moves and no heuristics play_entire_game_sets2(Score1, _) :- Score1 >= 500, write("Player1 wins with score "), write(Score1). play_entire_game_sets2(_, Score2) :- Score2 >= 500, write("Player2 wins with score "), write(Score2). play_entire_game_sets2(Score1, Score2):- deck(Deck), player((player1, Hand1, Melds1, _)), player((player2, Hand2, Melds2, _)), init_rummy(Deck, (_, Hand1, _, _), (_, Hand2, _, _), DiscardPile, NewDeck, (_, NewHand1, _, _), (_, NewHand2, _, _)), play_rummy_round_sets(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2), play_entire_game_sets(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_sets2([], (_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2, Sets) :- 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(Sets, HRSets), write("SETS: "), write(HRSets), nl. play_rummy_round_sets2(_, (_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2, Sets) :- calculate_score((_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl, write("SETS: "), write(Sets), nl. play_rummy_round_sets2(_, (_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), _, UpdateScore1, UpdateScore2, Sets) :- calculate_score((_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl, write("SETS: "), write(Sets), nl. play_rummy_round_sets2(Deck, (Player1, Hand1, Melds1, Score1), (Player2, Hand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2, Sets) :- human_readable(Deck, HRDeck), write("Deck: "), write(HRDeck), nl, human_readable(DiscardPile, HRDiscardPile), write("Discard Pile: "), write(HRDiscardPile), nl, nl, write("Player 1 turn!"), nl, print_info(Hand1, Melds1, "HAND BEFORE TURN: ", "MELDS BEFORE TURN: "), nl, take_turn_sets2((Player1, Hand1, Melds1, Score1), Deck, DiscardPile, (_, NewHand1, NewMeld1, _), NewDeck1, NewDiscard1, 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_sets2((Player2, Hand2, Melds2, Score2), NewDeck1, NewDiscard1, (_, NewHand2, NewMeld2, _), NewDeck2, NewDiscard2, NewSets, FinalSets), nl, print_info(NewHand2, NewMeld2, "HAND AFTER TURN: ", "MELDS AFTER TURN: "), nl, nl, nl, play_rummy_round_sets2(NewDeck2, (Player1, NewHand1, NewMeld1, Score1), (Player2, NewHand2, NewMeld2, Score2), NewDiscard2, UpdateScore1, UpdateScore2, FinalSets). % --------------------------------------------------------------------------------------------------------------------------------------------------------- print_info(Hand, Melds, HandMessage, MeldMessage) :- human_readable(Hand, HRHand), write(HandMessage), write(HRHand), nl, human_readable_melds(Melds, HRMelds), write(MeldMessage), write(HRMelds), nl. % FILE: melds.pl % LINE: Defines rules for finding melds in a player's hand % DATE: March 14, 2021 % checks the entire hand to see if a card can be played on any sets of melds play_on_meld_sets([], [], Melds, Melds, _, Sets, Sets). play_on_meld_sets([FirstCard|RestHand], RestHand, Melds, NewMelds, CardWorked, Sets, NewSets) :- play_card_on_meld_sets(FirstCard, Melds, NewMelds, CardWorked, Sets, NewSets), length(CardWorked, L), L = 1. play_on_meld_sets([FirstCard|RestHand], [FirstCard|NewRestHand],Melds, NewMelds, CardWasFound, Sets, NewSets) :- play_on_meld_sets(RestHand, NewRestHand, Melds, NewMelds, CardWasFound, Sets, NewSets). % checks to see if a single card can be played the entire set of sets play_card_on_meld_sets(_, Melds, Melds, [], [], []). play_card_on_meld_sets(card(Face, Suit, Rank), Melds, [[card(Face, Suit, Rank)]|Melds], [card(Face, Suit, Rank)], [FirstSet|RestSet], [UpdateSet|RestSet]) :- is_playable_on_set(card(Face, Suit, Rank), FirstSet, UpdateSet). play_card_on_meld_sets(card(Face, Suit, Rank), Melds, NewMelds, [FirstSet|Sets], [FirstSet|NewSets]) :- play_card_on_meld_sets(card(Face, Suit, Rank), Melds, NewMelds, Sets, NewSets). find_set_all_melds(OrigHand, [], OldMelds, OldMelds, OrigHand, AllSets, AllSets) :- write("NO SETS FOUND"), nl. find_set_all_melds(OrigHand, [card(Face1, Suit1, Rank1)|_], OldMelds, [Move|OldMelds], NewHand, AllSets, [Move|AllSets]) :- find_same_card(OrigHand, card(Face1, Suit1, Rank1), Move, NewHand), length(Move, L), L>=3, human_readable(Move, HRMove), write("SET FOUND: "), write(HRMove), nl. find_set_all_melds(OrigHand, [_|RestHand], OldMelds, NewMelds, NewHand, AllSets, NewAllSets) :- find_set_all_melds(OrigHand, RestHand, OldMelds, NewMelds, NewHand, AllSets, NewAllSets). % Checks to see if a card can be played on a given set is_playable_on_set(card(Face1, Suit1, Rank1), [card(Face2, Suit2, Rank1)|RestMeld], [card(Face1, Suit1, Rank1), card(Face2, Suit2, Rank1)|RestMeld]). is_playable_on_run(card(Face1, Suit1, Rank1), [card(Face2, Suit2, Rank2)|RestMeld], [card(Face1, Suit1, Rank1), card(Face2, Suit2, Rank2)|RestMeld]) :- TestRank is Rank1 + 1, Rank2 = TestRank. is_playable_on_run(card(Face1, Suit1, Rank1), Meld, NewMeld) :- last(Meld, card(_, _, Rank2)), TestRank is Rank2 + 1, Rank1 = TestRank, append(card(Face1, Suit1, Rank1), Meld, NewMeld).