% FILE: game_types.pl % LINE: Defines all variants of games tested % DATE: February 20, 2021 % takes the most basic turn for a player % draws from the deck, % possibly add variable for player for writing purposes % GAME WHERE ONLY SETS ARE USED AS MOVES % --------------------------------------------------------------------------------------------------------------------------------------------------------- % 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_sets((_, Hand, Melds, _), Deck, DiscardPile, (_, NewHand3, NewMelds, _), NewDeck1, NewDiscardPile) :- draw_from_deck(Deck, NewDeck1, Hand, NewHand1), write("LOOKING FOR SETS..."), nl, find_set(NewHand1, NewHand1, Melds, NewMelds, NewHand2), random_discard(NewHand2, DiscardPile, NewHand3, NewDiscardPile). % initializes the game and plays an entire round of rummy play_rummy_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_sets(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, _, _). % Plays an entire game of rummy with basic moves and no heuristics play_entire_game_sets(Score1, _) :- Score1 >= 500, write("Player1 wins with score "), write(Score1). play_entire_game_sets(_, Score2) :- Score2 >= 500, write("Player2 wins with score "), write(Score2). play_entire_game_sets(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_sets([], (_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_sets(_, (_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_sets(_, (_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_sets(Deck, (Player1, Hand1, Melds1, Score1), (Player2, Hand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2) :- 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_sets((Player1, Hand1, Melds1, Score1), Deck, DiscardPile, (_, NewHand1, NewMeld1, _), NewDeck1, NewDiscard1), 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_sets((Player2, Hand2, Melds2, Score2), NewDeck1, NewDiscard1, (_, NewHand2, NewMeld2, _), NewDeck2, NewDiscard2), nl, print_info(NewHand1, NewMeld1, "HAND AFTER TURN: ", "MELDS AFTER TURN: "), nl, nl, nl, play_rummy_round_sets(NewDeck2, (Player1, NewHand1, NewMeld1, Score1), (Player2, NewHand2, NewMeld2, Score2), NewDiscard2, UpdateScore1, UpdateScore2). % --------------------------------------------------------------------------------------------------------------------------------------------------------- % GAME WHERE ONLY RUNS ARE USED AS MOVES %---------------------------------------------------------------------------------------------------------------------------------------------------------- % 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_runs((_, Hand, Melds, _), Deck, DiscardPile, (_, NewHand4, NewestMelds, _), NewDeck1, NewDiscardPile) :- draw_from_deck(Deck, NewDeck1, Hand, NewHand1), merge_sort(NewHand1, NewHand2), write("LOOKING FOR RUNS..."), nl, find_run(NewHand2, NewHand3, [diamonds, clubs, hearts, spades], Melds, NewestMelds), random_discard(NewHand3, DiscardPile, NewHand4, NewDiscardPile). % initializes the game and plays an entire round of rummy play_rummy_runs :- deck(Deck), player((player1, Hand1, Melds1, Score1)), player((player2, Hand2, Melds2, Score2)), init_rummy(Deck, (_, Hand1, _, _), (_, Hand2, _, _), DiscardPile, NewDeck, (_, NewHand1, _, _), (_, NewHand2, _, _)), play_rummy_round_runs(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, _, _). % Plays an entire game of rummy with basic moves and no heuristics play_entire_game_runs(Score1, _) :- Score1 >= 500, write("Player1 wins with score "), write(Score1). play_entire_game_runs(_, Score2) :- Score2 >= 500, write("Player2 wins with score "), write(Score2). play_entire_game_runs(Score1, Score2):- deck(Deck), player((player1, Hand1, Melds1, _)), player((player2, Hand2, Melds2, _)), init_rummy(Deck, (_, Hand1, _, _), (_, Hand2, _, _), DiscardPile, NewDeck, (_, NewHand1, _, _), (_, NewHand2, _, _)), play_rummy_round_runs(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2), play_entire_game_runs(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_runs([], (_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_runs(_, (_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_runs(_, (_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_runs(Deck, (Player1, Hand1, Melds1, Score1), (Player2, Hand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2) :- 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_runs((Player1, Hand1, Melds1, Score1), Deck, DiscardPile, (_, NewHand1, NewMeld1, _), NewDeck1, NewDiscard1), 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_runs((Player2, Hand2, Melds2, Score2), NewDeck1, NewDiscard1, (_, NewHand2, NewMeld2, _), NewDeck2, NewDiscard2), nl, print_info(NewHand2, NewMeld2, "HAND AFTER TURN: ", "MELDS AFTER TURN: "), nl, nl, nl, play_rummy_round_runs(NewDeck2, (Player1, NewHand1, NewMeld1, Score1), (Player2, NewHand2, NewMeld2, Score2), NewDiscard2, UpdateScore1, UpdateScore2). % GAME WHERE BOTH PLAYERS USE BOTH SETS AND RUNS %---------------------------------------------------------------------------------------------------------------------------------------------------------- take_turn_both((_, Hand, Melds, _), Deck, DiscardPile, (_, FinalHand, NewestMelds, _), NewDeck1, NewDiscardPile) :- draw_from_deck(Deck, NewDeck1, Hand, NewHand1), write("LOOKING FOR SETS..."), nl, find_set(NewHand1, NewHand1, Melds, NewMelds, NewHand2), merge_sort(NewHand2, SortedHand), write("LOOKING FOR RUNS..."), nl, find_run(SortedHand, NewHand3, [diamonds, clubs, hearts, spades], NewMelds, NewestMelds), random_discard(NewHand3, DiscardPile, FinalHand, NewDiscardPile). % initializes the game and plays an entire round of rummy play_rummy_both :- deck(Deck), player((player1, Hand1, Melds1, Score1)), player((player2, Hand2, Melds2, Score2)), init_rummy(Deck, (_, Hand1, _, _), (_, Hand2, _, _), DiscardPile, NewDeck, (_, NewHand1, _, _), (_, NewHand2, _, _)), play_rummy_round_both(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, _, _). % Plays an entire game of rummy where one player uses only runs and one player uses only sets play_entire_game_both(Score1, _) :- Score1 >= 500, write("Player1 wins with score "), write(Score1). play_entire_game_both(_, Score2) :- Score2 >= 500, write("Player2 wins with score "), write(Score2). play_entire_game_both(Score1, Score2):- deck(Deck), player((player1, Hand1, Melds1, _)), player((player2, Hand2, Melds2, _)), init_rummy(Deck, (_, Hand1, _, _), (_, Hand2, _, _), DiscardPile, NewDeck, (_, NewHand1, _, _), (_, NewHand2, _, _)), play_rummy_round_both(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2), play_entire_game_both(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_both([], (_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_both(_, (_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_both(_, (_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_both(Deck, (Player1, Hand1, Melds1, Score1), (Player2, Hand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2) :- 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_both((Player1, Hand1, Melds1, Score1), Deck, DiscardPile, (_, NewHand1, NewMeld1, _), NewDeck1, NewDiscard1), 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_both((Player2, Hand2, Melds2, Score2), NewDeck1, NewDiscard1, (_, NewHand2, NewMeld2, _), FinalDeck, FinalDiscard), nl, print_info(NewHand2, NewMeld2, "HAND AFTER TURN: ", "MELDS AFTER TURN: "), nl, nl, nl, play_rummy_round_both(FinalDeck, (Player1, NewHand1, NewMeld1, Score1), (Player2, NewHand2, NewMeld2, Score2), FinalDiscard, UpdateScore1, UpdateScore2). % GAME WHERE ONE PLAYER USES SETS AND ONE USES RUNS %---------------------------------------------------------------------------------------------------------------------------------------------------------- % initializes the game and plays an entire round of rummy play_rummy_one_of_each :- deck(Deck), player((player1, Hand1, Melds1, Score1)), player((player2, Hand2, Melds2, Score2)), init_rummy(Deck, (_, Hand1, _, _), (_, Hand2, _, _), DiscardPile, NewDeck, (_, NewHand1, _, _), (_, NewHand2, _, _)), play_rummy_round_one_of_each(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, _, _). % Plays an entire game of rummy where one player uses only runs and one player uses only sets play_entire_game_one_of_each(Score1, _) :- Score1 >= 500, write("Player1 wins with score "), write(Score1). play_entire_game_one_of_each(_, Score2) :- Score2 >= 500, write("Player2 wins with score "), write(Score2). play_entire_game_one_of_each(Score1, Score2):- deck(Deck), player((player1, Hand1, Melds1, _)), player((player2, Hand2, Melds2, _)), init_rummy(Deck, (_, Hand1, _, _), (_, Hand2, _, _), DiscardPile, NewDeck, (_, NewHand1, _, _), (_, NewHand2, _, _)), play_rummy_round_one_of_each(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2), play_entire_game_one_of_each(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_one_of_each([], (_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_one_of_each(_, (_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_one_of_each(_, (_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), _, UpdateScore1, UpdateScore2) :- calculate_score((_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), UpdateScore1, UpdateScore2), write("Player 1 Score: "), write(UpdateScore1), nl, write("Player 2 Score: "), write(UpdateScore2), nl. play_rummy_round_one_of_each(Deck, (Player1, Hand1, Melds1, Score1), (Player2, Hand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2) :- 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_sets((Player1, Hand1, Melds1, Score1), Deck, DiscardPile, (_, NewHand1, NewMeld1, _), NewDeck1, NewDiscard1), 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_runs((Player2, Hand2, Melds2, Score2), NewDeck1, NewDiscard1, (_, NewHand2, NewMeld2, _), NewDeck2, NewDiscard2), nl, print_info(NewHand2, NewMeld2, "HAND AFTER TURN: ", "MELDS AFTER TURN: "), nl, nl, nl, play_rummy_round_one_of_each(NewDeck2, (Player1, NewHand1, NewMeld1, Score1), (Player2, NewHand2, NewMeld2, Score2), NewDiscard2, UpdateScore1, UpdateScore2). %---------------------------------------------------------------------------------------------------------------------------------------------------------- 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.