Here's the third, and perhaps final version:
nextMove[x : {__Integer}] :=
Sort /@ Table[
Append[Tuples[ReplacePart[List /@ x, k -> Range[x[[k]] - 1]]], Delete[x, k]],
{k, 1, Length@x}
]~Flatten~1 // DeleteDuplicates
nextMove[{1, 4, 5}]
(* {{0, 4, 5}, {1, 0, 5}, {1, 1, 5}, {1, 2, 5}, {1, 3, 5},
{1, 4, 0}, {1, 4, 1}, {1, 4, 2}, {1, 4, 3}, {1, 4, 4}} *)
nextMove[{3, 3}]
(* {{1, 3}, {2, 3}, {3}} *)
Here's a second pass:
nextMove[x : {__Integer}] := Table[
Tuples[ReplacePart[List /@ x, k -> Range[0, x[[k]] - 1]]],
{k, 1, Length@x}
]~Flatten~1
nextMove[{1, 4, 5}]
(* {{0, 4, 5}, {1, 0, 5}, {1, 1, 5}, {1, 2, 5}, {1, 3, 5},
{1, 4, 0}, {1, 4, 1}, {1, 4, 2}, {1, 4, 3}, {1, 4, 4}} *)
To remove the zeros, one possibility is
nextMove[x : {__Integer}] := Table[
Tuples[ReplacePart[List /@ x, k -> Range[0, x[[k]] - 1]]],
{k, 1, Length@x}
]~Flatten~1 /. {a___, 0, b___} :> {a, b}
Another possibility (that doesn't require post-processing) is
nextMove[x : {__Integer}] := Table[
Append[Tuples[ReplacePart[List /@ x, k -> Range[x[[k]] - 1]]], Delete[x, k]],
{k, 1, Length@x}
]~Flatten~1
Here's a first pass. It is somewhat procedural:
nextMove[x : {__Integer}] := Module[
{moves = Range[0, # - 1] & /@ x, xs = List /@ x, subs},
Table[
subs = xs;
subs[[k]] = moves[[k]];
Tuples[subs],
{k, 1, Length@x}
]~Flatten~1
]