SHOMIさんの回答で良いと思います。最初の回答は読み違ってました。
Z…全兵力
A,B,C…3つそれぞれの兵力
D…一時変数
A,B,Cに割り振る際に全兵力Zを引いていくような感じにするとわかりやすくなると思います。
ちょっと書き換えてみました。ついでに変数名も変えてみました。
C
1#include<stdio.h>
2#include<stdlib.h>
3
4int main(void){
5 int RemainPerson;
6 int APerson,BPerson,CPerson;
7
8 /* 残り人数(初期値は合計人数) */
9 RemainPerson=30000;
10
11 /* 兵力Aの入力 */
12 printf("%d人の兵力を割り振ってください。\n",RemainPerson);
13 printf("グーの兵力:"); scanf("%d", &APerson);
14 while (RemainPerson - APerson < 0) {
15 /* 残り兵力を越えてしまっている場合、正しい値が入力されるまでやり直す。*/
16 system("cls");
17 printf("兵は%d人しかいません。\n",RemainPerson);
18 printf("%d人の兵力を割り振ってください。\n",RemainPerson);
19 printf("グーの兵力:"); scanf("%d", &APerson);
20 }
21 /* 兵力Aを除いたものが残り人数となる。*/
22 RemainPerson -= APerson;
23
24 /* 兵力Bの入力 */
25 printf("残りの兵力は%dです。\n", RemainPerson);
26 printf("チョキの兵力:"); scanf("%d", &BPerson);
27 while (RemainPerson - BPerson < 0) {
28 /* 残り兵力を越えてしまっている場合、正しい値が入力されるまでやり直す。*/
29 system("cls");
30 printf("残りの兵は%d人しかいません。\n", RemainPerson);
31 printf("チョキの兵力:"); scanf("%d", &BPerson);
32 }
33 /* さらに兵力Bを除いたものが残り人数となる。*/
34 RemainPerson -= BPerson;
35
36 /* 兵力Cの決定(残り人数がそのまま兵力Cとなる。) */
37 CPerson = RemainPerson;
38 printf("パーの兵力:%d\n",CPerson);
39
40 return 0;
41}
↓↓ 以下最初に書いた間違い ↓↓
残り兵力を保持している変数は「Z」ではないでしょうか?
「D」は一時的に使用される変数のようです。兵力がマイナスであるのかを判断するには「Z」を対象としなければいけないのではないでしょうか?
あと、変数がAとかBとか英数字1文字だと読むのがつらいので、もっとわかりやすい変数名にすることをおすすめします。
(実際自分もリファクタリングせずにソースコードを見ているのでなんか読み間違っているような気がしています。)