質問編集履歴
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
|
-
}
|