% GAME WHERE ONLY RUNS ARE USED AS MOVES AND OTHER PLAYERS' 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_runs2((_, Hand, Melds, _), Deck, DiscardPile, (_, FinalHand, FinalMelds, _), NewDeck1, NewDiscardPile, Runs, FinalRuns) :- draw_from_deck(Deck, NewDeck1, Hand, NewHand1), merge_sort(NewHand1, NewHand2), write("LOOKING FOR RUNS..."), nl, find_run_melds(NewHand2, NewHand3, [diamonds, clubs, hearts, spades], Melds, NewestMelds, Runs, NewRuns), write("TRYING TO PLAY ON RUNS..."), nl, play_on_meld_runs(NewHand3, UpdateHand, NewestMelds, FinalMelds, _, NewRuns, FinalRuns), random_discard(UpdateHand, DiscardPile, FinalHand, NewDiscardPile). % initializes the game and plays an entire round of rummy play_rummy_runs2 :- deck(Deck), player((player1, Hand1, Melds1, Score1)), player((player2, Hand2, Melds2, Score2)), init_rummy(Deck, (_, Hand1, _, _), (_, Hand2, _, _), DiscardPile, NewDeck, (_, NewHand1, _, _), (_, NewHand2, _, _)), play_rummy_round_runs2(NewDeck, (player1, NewHand1, Melds1, Score1), (player2, NewHand2, Melds2, Score2), DiscardPile, _, _, Runs), write(Runs), nl. % Plays an entire game of rummy with basic moves and no heuristics play_entire_game_runs2(Score1, _) :- Score1 >= 500, write("Player1 wins with score "), write(Score1). play_entire_game_runs2(_, Score2) :- Score2 >= 500, write("Player2 wins with score "), write(Score2). play_entire_game_runs2(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_runs2(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_runs2([], (_, Hand1, Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2, 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. play_rummy_round_runs2(_, (_, [], Melds1, Score1), (_, Hand2, Melds2, Score2), _, UpdateScore1, UpdateScore2, 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. play_rummy_round_runs2(_, (_, Hand1, Melds1, Score1), (_, [], Melds2, Score2), _, UpdateScore1, UpdateScore2, 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, nl. play_rummy_round_runs2(Deck, (Player1, Hand1, Melds1, Score1), (Player2, Hand2, Melds2, Score2), DiscardPile, UpdateScore1, UpdateScore2, 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, nl, write("Player 1 turn!"), nl, print_info(Hand1, Melds1, "HAND BEFORE TURN: ", "MELDS BEFORE TURN: "), nl, take_turn_runs2((Player1, Hand1, Melds1, Score1), Deck, DiscardPile, (_, NewHand1, NewMeld1, _), NewDeck1, NewDiscard1, Runs, NewRuns), 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_runs2((Player2, Hand2, Melds2, Score2), NewDeck1, NewDiscard1, (_, NewHand2, NewMeld2, _), NewDeck2, NewDiscard2, NewRuns, FinalRuns), nl, print_info(NewHand2, NewMeld2, "HAND AFTER TURN: ", "MELDS AFTER TURN: "), nl, nl, nl, play_rummy_round_runs2(NewDeck2, (Player1, NewHand1, NewMeld1, Score1), (Player2, NewHand2, NewMeld2, Score2), NewDiscard2, UpdateScore1, UpdateScore2, FinalRuns). % --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 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. % ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- %PLAYING ON PREMADE RUNS play_on_meld_runs([], [], Melds, Melds, _, Runs, Runs) :- write("NO MELD PLAYABLE"), nl. play_on_meld_runs([FirstCard|RestHand], RestHand, Melds, NewMelds, CardWorked, Runs, NewRuns) :- play_card_on_meld_runs(FirstCard, Melds, NewMelds, CardWorked, Runs, NewRuns), length(CardWorked, L), L = 1, write("MELD FOUND: "), human_readable(CardWorked, HRCardWorked), write(HRCardWorked), nl. play_on_meld_runs([FirstCard|RestHand], [FirstCard|NewRestHand],Melds, NewMelds, CardWasFound, Runs, NewRuns) :- play_on_meld_runs(RestHand, NewRestHand, Melds, NewMelds, CardWasFound, Runs, NewRuns). play_card_on_meld_runs(_, Melds, Melds, [], [], []). play_card_on_meld_runs(card(Face, Suit, Rank), Melds, [[card(Face, Suit, Rank)]|Melds], [card(Face, Suit, Rank)], [FirstRun|RestRun], [UpdateRun|RestRun]) :- is_playable_on_run(card(Face, Suit, Rank), FirstRun, UpdateRun). play_card_on_meld_runs(card(Face, Suit, Rank), Melds, NewMelds, CardFound, [FirstRun|Runs], [FirstRun|NewRuns]) :- play_card_on_meld_runs(card(Face, Suit, Rank), Melds, NewMelds, CardFound, Runs, NewRuns). %Checks to see if a card can be played on a given set is_playable_on_run(card(Face1, Suit1, Rank1), [card(Face2, Suit1, Rank2)|RestMeld], [card(Face1, Suit1, Rank1), card(Face2, Suit1, Rank2)|RestMeld]) :- TestRank is Rank1 + 1, % problem area: Rank2 is set to TestRank if Rank2 is not defined! Rank2 = TestRank. is_playable_on_run(card(Face1, Suit1, Rank1), Meld, NewMeld) :- last(Meld, card(_, Suit1, Rank2)), TestRank is Rank2 + 1, % problem area: Rank1 is set to TestRank if Rank2 is not defined! Rank1 = TestRank, append(Meld, [card(Face1, Suit1, Rank1)], NewMeld). % finds a run in a player's hand and appends that run to a list containing all runs found in the game thus far find_run_melds(Hand, Hand, [], Melds, Melds, Runs, Runs) :- write("NO RUNS FOUND."), nl. find_run_melds(Hand, NewHand, [FirstSuit|_], Melds, [CardsFound|Melds], AllRuns, [CardsFound|AllRuns]) :- find_run_suit(Hand, NewHand, 1, FirstSuit, CardsFound), length(CardsFound, L), L >= 3, human_readable(CardsFound, HRCardsFound), write("RUN FOUND: "), write(HRCardsFound), nl ; find_run_suit(Hand, NewHand, 2, FirstSuit, CardsFound), length(CardsFound, L), L >= 3, human_readable(CardsFound, HRCardsFound), write("RUN FOUND: "), write(HRCardsFound), nl ; find_run_suit(Hand, NewHand, 3, FirstSuit, CardsFound), length(CardsFound, L), L >= 3, human_readable(CardsFound, HRCardsFound), write("RUN FOUND: "), write(HRCardsFound), nl ; find_run_suit(Hand, NewHand, 4, FirstSuit, CardsFound), length(CardsFound, L), L >= 3, human_readable(CardsFound, HRCardsFound), write("RUN FOUND: "), write(HRCardsFound), nl ; find_run_suit(Hand, NewHand, 5, FirstSuit, CardsFound), length(CardsFound, L), L >= 3, human_readable(CardsFound, HRCardsFound), write("RUN FOUND: "), write(HRCardsFound), nl ; find_run_suit(Hand, NewHand, 6, FirstSuit, CardsFound), length(CardsFound, L), L >= 3, human_readable(CardsFound, HRCardsFound), write("RUN FOUND: "), write(HRCardsFound), nl ; find_run_suit(Hand, NewHand, 7, FirstSuit, CardsFound), length(CardsFound, L), L >= 3, human_readable(CardsFound, HRCardsFound), write("RUN FOUND: "), write(HRCardsFound), nl ; find_run_suit(Hand, NewHand, 8, FirstSuit, CardsFound), length(CardsFound, L), L >= 3, human_readable(CardsFound, HRCardsFound), write("RUN FOUND: "), write(HRCardsFound), nl ; find_run_suit(Hand, NewHand, 9, FirstSuit, CardsFound), length(CardsFound, L), L >= 3, human_readable(CardsFound, HRCardsFound), write("RUN FOUND: "), write(HRCardsFound), nl ; find_run_suit(Hand, NewHand, 10, FirstSuit, CardsFound), length(CardsFound, L), L >= 3, human_readable(CardsFound, HRCardsFound), write("RUN FOUND: "), write(HRCardsFound), nl ; find_run_suit(Hand, NewHand, 11, FirstSuit, CardsFound), length(CardsFound, L), L >= 3, human_readable(CardsFound, HRCardsFound), write("RUN FOUND: "), write(HRCardsFound), nl. find_run_melds(Hand, NewHand, [_|RestSuits], Melds, NewMelds, Runs, NewRuns) :- find_run_melds(Hand, NewHand, RestSuits, Melds, NewMelds, Runs, NewRuns). % write("card: "), write(card(Face1, Suit1, Rank1)), nl, % write("RestMeld: "), write(RestMeld), nl, % write("TestRank: "), write(TestRank), nl, % write("Rank2: "), write(Rank2), nl, %write("card: "), write(card(Face1, Suit1, Rank1)), nl, % write("Meld: "), write(Meld), nl, % write("TestRank: "), write(TestRank), nl, % write("Rank2: "), write(Rank2), nl,