TCPを使ってブラックジャックでの対戦ゲームを作っているのですが
サーバー側とクライアント側を作っているのですが、
こちらはクライアントの質問になります。
エラー文が
int new[128];
↑この部分がエラー原因だと思うのですが
この配列の中を1000にすると
Bus error: 10
とエラーが出て
128にすると
Segmentation fault: 11
とでます。
書き込んでいけないところに書き込んでいると言うことはわかっていますが、
どこがいけないのかがわかりません。
よければ教えてくださると嬉しいです。
printf("ヒット: 0 スタンド: 1 ----->");
ここの選択をするとエラーが発生します。
C
1#include <stdio.h> 2#include <string.h> 3#include <unistd.h> 4#include <sys/types.h> 5#include <sys/socket.h> 6#include <netinet/in.h> 7#include <arpa/inet.h> 8#include <errno.h> 9#include <stdlib.h> 10#include <netdb.h> 11#include <fcntl.h> 12#include <pthread.h> 13 14 15 16int main(int argc,char *argv[]){ 17 18 struct sockaddr_in server; 19 int sock,i,j; 20 char buf[128]; 21 // char buf3[128]; 22 char bufdh[128]; 23 int bufd; 24 int n,ret,fd,n2; 25 int connect0,write0; 26 int new[128]; 27 /* */ 28 29 printf("あなたはプレイヤーです\n"); 30 printf("*******************\n"); 31 printf("ブラックの説明を行います。\n"); 32 printf("ブラックジャックとはトランプの山札からカードを引いて足して、ディーラーより21に近づけた方が勝ちとなります。\n"); 33 printf("しかし21をオーバーするとバーストとなり負けになります。\n"); 34 printf("ブラックジャックは11,12,13の数字は10扱いされるので今回のゲームはA~10とします。\n"); 35 printf("Aが出た場合には1 OR 10 かを選ぶことができます。\n"); 36 printf("初期の手札自動で2つ配布されます。\n"); 37 printf("\n"); 38 printf("スタンド : 最初に配られた二枚のカードのみで勝負する事。\n"); 39 printf("ヒット : 優位なハンドを得られるまでカード引き続ける事\n"); 40 printf("バースト : 手札の合計が21を超えてしまうこと\n\n\n"); 41 42 printf("開始するには 0 を押してください\n"); 43 scanf("%d",&i); 44 printf("それでは開始します。\n"); 45 printf("*******************\n"); 46 printf("あなたはプレイヤーです\n"); 47 printf("*******************\n"); 48 49 50 int s,r,t,hit,all; 51 char *hit2; 52 s=rand()%10+1; 53 r=rand()%10+1; 54 printf("***あなたの手札は %d %d です***\n\n",s,r ); 55 if(s==1){ 56 printf("あなたの手札にAがあるので1か10を選択してください\n" ); 57 printf("1 OR 10 ----->"); 58 scanf("%d",&t); 59 s=t; 60 printf("***あなたの手札は %d %d です***\n",s,r ); 61 } 62 if(r==1){ 63 printf("あなたの手札にAがあるので1か10を選択してください\n" ); 64 printf("1 OR 10 ----->"); 65 scanf("%d",&t); 66 r=t; 67 printf("***あなたの手札は %d %d です***\n",s,r ); 68 69 } 70 all=s+r; 71 72 73 74 75 76 77 78 79 80 char *hostname =argv[1]; /* ホスト名の設定 */ 81 82 struct addrinfo hints, *res; 83 struct in_addr addr; 84 int err; 85 86 memset(&hints, 0, sizeof(hints)); 87 88 hints.ai_socktype = SOCK_STREAM; 89 hints.ai_family = AF_INET; 90 91 if ((err = getaddrinfo(hostname, NULL, &hints, &res)) != 0) { 92 printf("error %d\n", err); 93 return 1; 94 95 } 96 97 addr.s_addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.s_addr; 98 inet_ntop(AF_INET, &addr, buf, sizeof(buf)); 99 printf("ip address : %s\n", buf); 100 freeaddrinfo(res); 101 102 103 sock = socket(AF_INET,SOCK_STREAM,0); 104 105 if (sock < 0) { 106 perror("socket"); 107 printf("%d\n", errno); 108 return 1; 109 } 110 111 server.sin_family = AF_INET; 112 server.sin_port = htons(12345); 113 /* 127.0.0.1 localhost */ 114 inet_pton(AF_INET, buf, &server.sin_addr.s_addr); 115 /* */ 116 connect0= connect(sock, (struct sockaddr *)&server, sizeof(server)); 117 118 119 if (connect0 < 0) { 120 121 perror("connect"); 122 printf("%d\n", errno); 123 return 1; 124 } 125 126 memset(buf, 0, sizeof(buf)); 127 128 129 130 printf("ディーラーがカードを引いています。少々お待ちください\n"); 131 n=read(sock,bufdh,sizeof(bufdh)); 132 if (n < 0) { 133 perror("read"); 134 printf("%d¥n", errno); 135 return 1; 136 } 137 printf("ディーラーの数字が確定しました。次はあなたのターンです。\n\n\n"); 138 bufd=atoi(bufdh); 139 140 while(1){ 141 if(all>21){ 142 printf("あなたの手札は%dでバーストしてしまいました。\n",all); 143 all=100; 144 break; 145 } 146 printf("現在のあなたのカードの合計は%dです\n",all); 147 printf("ヒットしますか?スタンドしますか?\n"); 148 printf("ヒット: 0 スタンド: 1 ----->"); 149 150 scanf("%s",hit2); 151 hit=atoi(hit2); 152 153 154 if(hit==1){ 155 printf("%dでスタンドします。\n",all); 156 break; 157 } 158 else if(hit==0) { 159 160 new[j]=rand()%10+1; 161 printf("あなたは%dを引きました\n",new[j]); 162 163 if(new[j]==1){ 164 printf("今引いたカードがAなのでで1か10を選択してください\n" ); 165 printf("1 OR 10 ----->"); 166 scanf("%d",&t); 167 new[j]=t; 168 169 } 170 all=all+new[j]; 171 j++; 172 173 174 } 175 else{ 176 printf("0か1を入力してください\n"); 177 } 178 179 180 } 181 182 183 if(all>bufd||bufd==100){ 184 printf("YOU WIN!!!!!\n\n\n"); 185 if(bufd==100){ 186 printf("ディーラーはバーストしました\n"); 187 } 188 else{ 189 printf("ディーラーのカードの合計値は%dでした\n",bufd); 190 } 191 192 193 } 194 else if(all==bufd||bufd!=100){ 195 printf("DRAW.....\n"); 196 } 197 else if(all<bufd && bufd!=100){ 198 printf("YOU LOSE......\n\n\n"); 199 200 printf("ディーラーのカードの合計値は%dでした\n",bufd); 201 } 202 203 else if (all==100 && bufd==100){ 204 printf("お互いにバーストしました\n"); 205 } 206 207 208 209 210 211 212 213 214 /* 文字送信 */ 215 /* write0= write(sock, argv[3], sizeof(argv[3])); 216 217 if (write0 < 0) { 218 perror("write"); 219 printf("%d¥n", errno); 220 return 1; 221 } 222 223 n2=read(sock,buf2,sizeof(buf2)); 224 printf("%s \n",buf2);*/ 225 printf("ゲームを終了します。お疲れ様でした。\n"); 226 227 /* TCP セッションの終了 */ close(sock); 228 229 return 0; 230 231} 232
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/11/06 07:37
退会済みユーザー
2020/11/06 10:39
2020/11/06 10:46
2020/11/06 10:46
退会済みユーザー
2020/11/06 11:20
2020/11/06 11:56
退会済みユーザー
2020/11/06 12:06
退会済みユーザー
2020/11/06 12:08
2020/11/06 12:21 編集
退会済みユーザー
2020/11/06 12:22