質問編集履歴

1

見づらかったので修正しました

2025/01/18 12:36

投稿

ohuson
ohuson

スコア1

test CHANGED
File without changes
test CHANGED
@@ -1,292 +1,4 @@
1
1
  次の5つのファイルから構成されているルーレットの簡易的なゲームを作りたいのですが、gnuplot_i.cの24行目(▲▲で囲われた部分)の「NULLポインター'handle'を逆参照しています」というエラーが一向に解決できません。
2
2
  また、デバッカーを実行すると、指定されたファイルが見つかりませんと表示され、ビルドエラーになってしまいます。プログラムがよく分からないので丁寧にご教授お願い致します。
3
3
 
4
- 全てのファイル内容が必要か分からないので一応ます
4
+ ファイルは追加コメントにっておきます
5
-
6
- **Game.cpp**
7
- #include<stdio.h>
8
- #include<stdlib.h>
9
- #include<time.h>
10
- #include"gnuplot_i.h"
11
- #include"teigi.h"
12
-
13
- int main() {
14
- srand(time(NULL));//ここでは乱数を初期化する
15
-
16
- Roul roul;
17
- initroul(&roul, 1, 36);//ここではルーレットを初期化する
18
-
19
- while (Gameround < 5 && Pcoin > 0 && Ccoin > 0) {
20
- showrule();//これでルール説明を表示する
21
- if (Gameend()) break;//ゲーム終了を判別する
22
-
23
- Bet bet;
24
- getbet(&bet);//賭ける方法を入力する
25
- int Num = spin(&roul);//ルーレットを回して結果を生成する
26
- const char* Color = getcolor(&roul, Num);//色を取得する
27
-
28
- plotroulmovie(Num);//ルーレットを回すムービーを表示する
29
- int payout = refund(bet, Num, Color);//払い戻しコインを計算する
30
-
31
- updatecoin(payout);//所持コインを更新する
32
- Gameround++;//ゲームラウンドを増加する
33
- }
34
-
35
- //ゲームの結果を表示する
36
- if (Pcoin > Ccoin) {
37
- printf("あなたの勝ちです。\n");
38
- }
39
- else {
40
- printf("あなたの負けです。\n");
41
- }
42
-
43
- return 0;
44
- }
45
-
46
-
47
-
48
-
49
-
50
- **teigi.h**
51
- #pragma once
52
- #ifndef teigi_h
53
- #define teigi_h
54
-
55
- //ルーレットのクラス
56
- typedef struct {
57
- int min;//ルーレットの最小値
58
- int max;//ルーレットの最大値
59
- int Num;//ルーレットの数字
60
- const char* Color;//ルーレットの色(赤or黒)
61
- } Roul;
62
-
63
- //ルーレットを初期化するための関数
64
- void initroul(Roul* roul, int min, int max);
65
-
66
- //ルーレットを回して結果を生成するための関数
67
- int spin(Roul* roul);
68
-
69
- //数字に応じて(赤or黒)を判別するための関数
70
- const char* getcolor(Roul* roul, int num);
71
-
72
- // 賭けのクラス
73
- typedef struct {
74
- int betpatt;//賭けのパターン
75
- int betcoin;//賭けるコイン数
76
- int playerchoice;//プレイヤーの選択肢
77
- } Bet;
78
-
79
- //プレイヤーから賭ける方法を入力するための関数
80
- void getbet(Bet* bet);
81
-
82
- //プレイヤーのクラス
83
- extern int Pcoin;//プレイヤーの所持コイン
84
- extern int Ccoin;//コンピューターの所持コイン
85
-
86
- //所持コインを更新するための関数
87
- void updatecoin(int payout);
88
-
89
- //ゲームのクラス
90
- extern int Gameround;//現在のゲームラウンド
91
-
92
- //ルールを表示するための関数
93
- void showrule();
94
-
95
- //賭けた方法とルーレットの結果に応じて払い戻しコインを計算するための関数
96
- int refund(Bet bet, int Num, const char* Color);
97
-
98
- //ゲームの終了を判断するための関数
99
- int Gameend();
100
-
101
- #endif
102
-
103
-
104
-
105
-
106
-
107
- **jissou.c**
108
- #include<stdio.h>
109
- #include<stdlib.h>
110
- #include<time.h>
111
- #include"gnuplot_i.h"
112
- #include"teigi.h"
113
-
114
- //ここでゲームの初期設定をする
115
- int Pcoin = 50;//プレイヤーの最初の所持コインを設定する
116
- int Ccoin = 50;//コンピューターの最初の所持コインを設定する
117
- int Gameround = 0;//現在のゲームラウンドを初期化する
118
-
119
- //ルーレットの初期化をするための関数
120
- void initroul(Roul* roul, int min, int max) {
121
- roul->min = min;
122
- roul->max = max;
123
- roul->Num = 0;
124
- roul->Color = "None";
125
- }
126
-
127
- //ルーレットを回転させて結果を生成するための関数
128
- int spin(Roul* roul) {
129
- roul->Num = rand() % (roul->max - roul->min + 1) + roul->min;
130
- roul->Color = getcolor(roul, roul->Num);
131
- return roul->Num;
132
- }
133
-
134
- //数字に対して赤or黒を返すための関数
135
- const char* getcolor(Roul* roul, int num) {
136
- return num % 2 == 0 ? "黒" : "赤";
137
- }
138
-
139
- //プレイヤーが賭ける方法を入力するための関数
140
- void getbet(Bet* bet) {
141
- printf("賭ける方法を選択してください(1:赤or黒, 2:偶数or奇数, 3:1~18or19~36, 4:1~12,13~24or25~36)");
142
- scanf_s("%d", &bet->betpatt);
143
- printf("賭けるコイン数を入力してください: ");
144
- scanf_s("%d", &bet->betcoin);
145
- printf("選択肢を入力してください: ");
146
- scanf_s("%d", &bet->playerchoice);
147
- }
148
-
149
- //プレイヤーとコンピューターの所持コインを更新するための関数
150
- void updatecoin(int payout) {
151
- Pcoin += payout;
152
- Ccoin -= payout;
153
- }
154
-
155
- //ゲームのルールを表示するための関数
156
- void showrule() {
157
- printf("ルーレットのルール説明:\n");
158
- printf("その1. 赤or黒、偶数or奇数、1~18or19~36(範囲賭け)、1~12,13~24or25~36(範囲賭け)の4つの方法で全9パターンで賭けることができます。\n");
159
- printf("その2. 払い戻し倍率は赤or黒(2倍)、偶数or奇数(2倍)、1~18or19~36(2倍)、1~12,13~24or25~36(倍)となっています。\n");
160
- printf("その3. 最初の所持コインは50コインです。\n");
161
- printf("その4. ここでは5ゲーム行います。\n");
162
- printf("その5. プレイヤーもしくはコンピューターの所持コインが0になるとゲーム終了です。\n");
163
- }
164
-
165
- //賭けた方法とルーレットの結果に応じて払い戻しコインを計算するための関数
166
- int refund(Bet bet, int Num, const char* Color) {
167
- //赤or黒(2倍)
168
- if (bet.betpatt == 1 && Color == ((bet.playerchoice == 1) ? "赤" : "黒")) {
169
- return bet.betcoin * 2;
170
- }
171
- //偶数or奇数(2倍)
172
- else if (bet.betpatt == 2 && ((Num % 2 == 0 && bet.playerchoice == 1) || (Num % 2 != 0 && bet.playerchoice == 2))) {
173
- return bet.betcoin * 2;
174
- }
175
- //1~18or19~36(2倍)
176
- else if (bet.betpatt == 3 && ((Num >= 1 && Num <= 18 && bet.playerchoice == 1) || (Num >= 19 && Num <= 36 && bet.playerchoice == 2))) {
177
- return bet.betcoin * 2;
178
- }
179
- //1~12,13~24or25~36(3倍)
180
- else if (bet.betpatt == 4 && ((Num >= 1 && Num <= 12 && bet.playerchoice == 1) ||
181
- (Num >= 13 && Num <= 24 && bet.playerchoice == 2) ||
182
- (Num >= 25 && Num <= 36 && bet.playerchoice == 3))) {
183
- return bet.betcoin * 3;
184
- }
185
- //いずれも当てはまらない場合、賭けは外れ(0などで起こる)
186
- else {
187
- return -bet.betcoin;
188
- }
189
- }
190
-
191
- //ゲームの終了を判断するための関数
192
- int Gameend() {
193
- if (Pcoin <= 0 || Gameround >= 5) {
194
- printf("ゲーム終了!\n");
195
- return 1;
196
- }
197
- return 0;
198
- }
199
-
200
-
201
-
202
-
203
-
204
- **gnuplot_i.h**
205
- #ifndef gnuplot_i_h
206
- #define gnuplot_i_h
207
-
208
- #include <stdio.h>
209
- #include <stdlib.h>
210
-
211
- //gnuplot_ctrl構造体の定義をする
212
- typedef struct gnuplot_ctrl gnuplot_ctrl;
213
-
214
- //Gnuplotを初期化するための関数
215
- gnuplot_ctrl* gnuplot_init();
216
-
217
- //Gnuplotを閉じるための関数
218
- void gnuplot_close(gnuplot_ctrl* handle);
219
-
220
- //nuplotコマンドを送信するための関数
221
- void gnuplot_cmd(gnuplot_ctrl* handle, const char* command, ...);
222
-
223
- //ルーレットを回すムービーを表示するための関数
224
- void plotroulmovie(int result);
225
-
226
- #endif
227
-
228
-
229
-
230
-
231
-
232
- gnuplot_i.c
233
- #define _CRT_SECURE_NO_WARNINGS
234
- #include<stdio.h>
235
- #include<stdlib.h>
236
- #include<time.h>
237
- #include <stdarg.h>
238
- #include"gnuplot_i.h"
239
- #include"teigi.h"
240
-
241
-
242
- #ifdef _WIN32
243
- #include <windows.h>
244
- #define popen _popen
245
- #define pclose _pclose
246
- #endif
247
-
248
- //gnuplot_ctrl構造体を実装する
249
- struct gnuplot_ctrl {
250
- FILE* gnuplotPipe;
251
- };
252
-
253
- //Gnuplotを初期化するための関数
254
- gnuplot_ctrl* gnuplot_init() {
255
- gnuplot_ctrl *handle = malloc(sizeof(gnuplot_ctrl));
256
- ▲ handle->gnuplotPipe = _popen("gnuplot -persistent", "w"); ▲
257
- return handle;
258
- }
259
-
260
- //Gnuplotを閉じるための関数
261
- void gnuplot_close(gnuplot_ctrl* handle) {
262
- if (handle) {
263
- pclose(handle->gnuplotPipe);
264
- free(handle);
265
- }
266
- }
267
-
268
- //Gnuplotコマンドを送信するための関数
269
- void gnuplot_cmd(gnuplot_ctrl* handle, const char* command, ...) {
270
- va_list ap;
271
- va_start(ap, command);
272
- vfprintf(handle->gnuplotPipe, command, ap);
273
- fprintf(handle->gnuplotPipe, "\n");
274
- fflush(handle->gnuplotPipe);
275
- va_end(ap);
276
- }
277
-
278
- //ルーレットを回すムービーを表示するための関数
279
- void plotroulmovie(int result) {
280
- gnuplot_ctrl* h = gnuplot_init();
281
- if (!h) return;
282
-
283
- gnuplot_cmd(h, "set xrange [0:36]");
284
- gnuplot_cmd(h, "set yrange [0:1]");
285
- gnuplot_cmd(h, "set title 'Roul Spin'");
286
- char command[128];
287
- sprintf_s(command, sizeof(command), "plot '-' using 1:2 with points pt 7 title 'Result: %d'", result);
288
- gnuplot_cmd(h, command);
289
- gnuplot_cmd(h, "%d %d", result, 1);
290
- gnuplot_cmd(h, "e");
291
- gnuplot_close(h);
292
- }