Lancelot (Richard Gere) is a swordsman who fights in small villages for money. While traveling to another village, he prevents a kidnapping attempt of Lady Guinevere (Julia Ormond), who was traveling to Camelot to marry King Arthur (Sean Connery). She is grateful for his actions, but refuses his advances. Lancelot later arrives in Camelot and navigates an obstacle course called the Gauntlet. This draws the attention of the King, who is looking for a knight to replace Malagant (Ben Cross), a former member of the Round Table who has turned against Arthur and Camelot. That night, Guinevere is kidnapped by Malagant's followers, but Lancelot is able to get her away from her captors and returns her to Camelot. After returning, Lancelot again tries to win her heart, but is unsuccessful. With Guinevere safely back in Camelot, Arthur moves up the wedding and marries her immediately. The next day, Arthur knights Lancelot and makes him a Knight of the Round Table
Later, a messenger from Lyonesse (Guinevere's home village) arrives, with the news that it has been attacked by Malagant. Arthur and his troops go to Lyonesse, and successfully defeat Malagant's forces to reclaim the village. After returning to Camelot, Lancelot reveals to the queen that he feels guilty about his feelings for her and plans to leave Camelot. She kisses Lancelot, which turns into a passionate embrace, just as Arthur walks in on them. He immediately arrests them and charges them with treason.
The open trial in the town square is interrupted by Malagant, who threatens to destroy Camelot and kill Arthur if he does not swear loyalty to him. The king orders his troops and townsfolk to attack Malagant and his forces, just as he's shot in the chest by several arrows. Lancelot and Malagant battle each another, and Lancelot kills him with Excalibur, Arthur's sword. The soldiers and citizens of Camelot win the battle, but Arthur is mortally wounded. On his deathbed, he asks Lancelot to "take care of her for me", referring to both Camelot and Queen Guinevere.