My recommendation is to make the pattern matching less complicated by relying on the Orderless property of functions:
Define a function that will match each of your hand types. To make it easier to understand and debug, I don't return true or false -- I return some text and the cards that match.
SetAttributes[f, Orderless]
f[x_, x_, y_, w_, z_] := {"one Pair", x, y, w, z} /; x != y != z != w
f[x_, x_, y_, y_, z_] := {"two Pair", x, y, z} /; x != y != z
f[x_, x_, x_, y_, z_] := {"three of a kind", x, y, z} /; x != y != z
f[x_, x_, x_, y_, y_] := {"Full House", x, y, z} /; x != y
f[_, _, _, _, _] := {"You have junk -- try bluffing"}
Note this function does not take your hand list so you must apply it to a list. Here I test to make sure the list is exactly 5 long and apply f to the list. The Orderless property allows the pattern matcher to reshuffle the list.
handType[x_List /; Length[x] == 5] := f @@ x
To use it:
In[12]:= handType[{1, 2, 3, 4, 3}]
Out[12]= {"one Pair", 3, 2, 1, 4}
You can easily modify this to give you true or false or take the output and test it.