C言語でトランプゲー ..
[2ch|▼Menu]
596:デフォルトの名無しさん
07/11/01 23:50:36
>>594
誰にも負けない

597:デフォルトの名無しさん
07/11/02 00:48:15
大富豪は詰め将棋に近い感覚があると思う。
相手のカードが見えないので、もちろん運頼みの側面もあるのだが。

例えば手持ちカードが「899J22」とあって、今場のカードが6とかだったら、

8で切る
-> 9のペアを出す
-> 2のペアはまず他から出ないので自分で切る
-> Jを捨てて和了り

となるわけだ。
この状態の手持ちカードを、まあ「必至」と呼ぼうか。
もちろん相手の手札との絡みもあるので、確率的なものになると思う。
上の例で言えば、2のペアを持っている敵がいて、自分より先に出されてしまう場合もある。
自分以外のプレイヤーが4人いれば1/4の確率で2のペアを持っている奴がいるので、「75%の必至」みたいに自分の手札を評価できることになる。
まあジョーカーとか、ゲーム開始前のカード移譲とか色々あるのでややこしいとは思うが。

で、この考え方で行くと、プレイヤーのすべきことは、より高確率な必至を作れるカードの残し方を考えながら捨てていく、ということになる。
ということで、AIを作る場合には、残すカードを評価する評価関数を組み立ててやれば良いんじゃないかな。と酔っ払いの俺が思った。

598:デフォルトの名無しさん
07/11/05 12:41:24
ブーン

599:デフォルトの名無しさん
07/11/06 23:45:42
Java房の俺がちょっとずつC言語を勉強しながら書いてみる。

#define CARD_SUIT_SPADE 1
#define CARD_SUIT_HEART 2
#define CARD_SUIT_CLUB 3
#define CARD_SUIT_DIAMOND 4

typedef struct {
unsigned int suit;
unsigned int num;
} Card;

Card *newCard(unsigned int suit, unsigned int num) {
Card *card;
if(suit<1 || 4<suit) return NULL;
if(num<1 || 13<num) return NULL;
card = (Card *)malloc( sizeof(Card) );
card->suit = suit;
card->num = num;
return card;
}

疲れた。続きは明日。

600:デフォルトの名無しさん
07/11/07 00:53:27
日付が変わった。
this は C++ コンパイラで怖いか? self 借りとこ。

char CARD_NUM_SYMS[] = " A234567890JQK";
char CARD_SUIT_SYMS[] = " shcd";

char getCardNumSym(Card *self) {
unsigned int num;
if(self==NULL) return '\0';
num = self->num;
if(num<1 || 13<num) return '\0';
return CARD_NUM_SYMS[num];
}
getCardSuitSym(Card *self) {
unsigned int suit;
if(self==NULL) return '\0';
suit = self->suit;
if(suit<1 || 4<suit) return '\0';
return CARD_SUIT_SYM[suit];
}

601:デフォルトの名無しさん
07/11/07 01:02:42
戻り値の型書き忘れ。charだ。

602:デフォルトの名無しさん
07/11/08 21:35:22
SuitとNumをtypedefしとこ。先にやっときゃ良かった…

typedef unsigned int Suit;
typedef unsigned int Num;

void putCard(Card *self) {
printf( "%c%c", getCardSuitSym(self), getCardNumSym(self) );
}

char *getCardSym(Card *self, char buffer[], size_t bufsize) {
unsigned int i;
if(self == NULL) return NULL;
if(bufsize < 2) return NULL;
buffer[0] = getCardSuitSym(self);
buffer[1] = getCardNumSym(self);
for(i=2; i<bufsize; i++) buffer[i] = '\0';
return buffer;
}

603:127
07/11/09 19:49:53
結局誰もいない

(5)
初回ゲームのディールの開始プレイヤーを最初に登録されたプレイヤーに
初回ゲームの最初の場の親をダイヤの3を持つプレイヤーに
初回以降のゲームのディールの開始プレイヤーを前回のゲームの最下位プレイヤーの次のプレイヤーに
初回以降のゲームの最初の場の親を前回のゲームの最下位プレイヤーに
初回以降のゲーム開始時にカード交換を行った場合

結果を以下に示す。

********************** Players Record (PlayCount=10000) ***********************
___________________________ Player TestA Record ___________________________

(省略されました・・全てを読むことはできません)

___________________________ Player TestE Record ___________________________
    [0](-----) [1](-----) [2](-----) [3](-----) [4](-----) Total
[0] : 236(0.121) 401(0.205) 640(0.327) 461(0.236) 217(0.111) 1955
[1] : 173(0.087) 427(0.214) 665(0.333) 481(0.241) 253(0.127) 1999
[2] : 407(0.201) 450(0.222) 404(0.199) 408(0.201) 357(0.176) 2026
[3] : 578(0.294) 405(0.206) 194(0.099) 328(0.167) 463(0.235) 1968
[4] : 560(0.273) 317(0.154) 123(0.060) 290(0.141) 762(0.371) 2052

(以下略)

604:127
07/11/09 21:19:35
(5)の結果から何が分かるだろう。

下位ランクは中間ランクまでは容易に上がれ,そこから先は運次第。
上位ランクは上位であり続けるか下位に落ちるかのギャンブル。

そこで思い出して欲しい。
このゲームが生まれた1970年代の日本を。
当時は高度経済成長期から安定成長期への移行時期で,
終身雇用制度に基づく一億総中流といった考えが強かった時代だ。
成果主義も格差社会もまだ一般には登場していない。

これまでの実験結果によって明らかになった,
たった2種類のルールによってもたらされるゲーム性は,
そうした時代背景を反映しているとは言えないだろうか。

605:デフォルトの名無しさん
07/11/10 07:09:51
うだうだ独り言はキモイ
多くの新しい知を混ぜるためにage

606:127
07/11/10 07:24:54
誰もいなければ誰と戦おう
誰もいなければ誰を傷つけよう
誰もいなければ誰を滅ぼそう

607:599
07/11/10 07:31:43
>>604
プログラマならコードで語るもんだぜ。
と言うわけで 599 からコードを貼りつづける Java房な俺。

typedef struct {
size_t length;
Card *cards[256];
} Deck;

Deck *freeDeck(Deck *deck) {
unsigned int i;
for(i=0; i<256; i++) freeCard(deck->cards[i]);
free(deck);
return NULL;
}

Deck *newDeck() {
unsigned int i;
Deck *deck;
deck = (Deck *)malloc( sizeof(Deck) );
if(deck == NULL) return NULL;
deck->length = 0;
for(i=0; i<256; i++) deck->cards[i] = NULL;
return deck;
}

この後は Player と Game も構造体にする予定。
そーいや、1ゲームを Game にするとして、大貧民全体としての
何ゲームかセットにしたものは何て呼べば良いんだろ。

608:デフォルトの名無しさん
07/11/10 09:21:42
while( true ) {
  printf("            ∩_\n");
  printf("           〈〈〈 ヽ\n");
  printf("          〈⊃  }\n");
  printf("   ∩___∩  |   |\n");
  printf("   | ノ      ヽ !   !\n");
  printf("  /  ●   ● |  /\n");
  printf("  |    ( _●_)  ミ/ <こいつ最高にアホ\n");
  printf(" 彡、   |∪|  /\n");
  printf("/ __  ヽノ /\n");
  printf("(___)   /\n\n"),
}

609:デフォルトの名無しさん
07/11/10 12:12:49
>608
オーケー、その案採用するぜ。まだ先だけど。

Card *pushCardToDeck(Deck *self, Card *card) {
if(self->length > 255) return NULL;
self->cards[self->length] = card;
self->length++;
return card;
}
Card *popCardFromDeck(Deck *self) {
Card *card;
if(self->length < 1) return NULL;
self->length--;
self->cards[self->length] = NULL;
return card;
}
Deck *makeDeck() {
Suit s;
Num n;
Deck *deck;
deck = newDeck();
if(deck == NULL) return NULL;
for(s=1; s<=4; s++) {
for(n=1; n<=13; n++) {
Card *c = newCard(s,n);
if(c == NULL) return freeDeck(deck);
if(pushCardToDeck(deck, c) == NULL) return freeDeck(deck);
}
}
return deck;
}

610:デフォルトの名無しさん
08/03/14 10:33:40


611:デフォルトの名無しさん
08/03/14 10:54:17
空気読めない中二病のせいで誰も居なくなったスレだ

612: ◆PyIJyOzha6
08/04/27 00:50:45
test

613:デフォルトの名無しさん
08/05/12 06:48:03
あれ?終わり?どうせなら、ババ抜き、ポーカー、ブラックジャック、スピード、
7ならべ、大富豪(大貧民)、フリーセル、ソリティアくらい作ろうぜ?

614:デフォルトの名無しさん
08/05/12 15:10:52
>>613
ガンバレ!

615:デフォルトの名無しさん
08/05/12 17:23:56
JSでコマンドプロンプト用ソリティアとピラミッドならやったことある。
でもオブジェクト作りまくってるから
C言語には移植しづらいだろうなあ。

616:デフォルトの名無しさん
08/05/12 17:39:10
>>613
大富豪はやってみたい。まずは最後に2人になった時点の読み切りを考えると面白そう。

617:デフォルトの名無しさん
08/05/12 18:58:19
大富豪を作るのか
大富豪の思考ルーチンを作るのか

618:127
08/05/12 23:55:26
あれからもう半年
599氏は元気かな

619:127
08/05/14 06:28:57
おはようございます

620:127
08/05/17 21:27:44
結局誰もいなくなってしまった
自分で追い出しておいて何を今更というか
まさにそのとおりなんだけど

さてそろそろ再開するかな

621:デフォルトの名無しさん
08/05/21 13:46:07
その後、>127の姿を見た者はいない…

622:127
08/05/21 23:52:44
「実はまだその辺にいたりするのであった」

623:127
08/05/22 00:13:59
訂正

「実はまだその辺にいるのであった」

だな

624:デフォルトの名無しさん
08/05/22 00:16:49
>>622
二階じゃないんだから。

625:599
08/05/29 00:24:24
>618
すまない。飽きた。

626:デフォルトの名無しさん
08/06/29 06:19:48
よし、何か作ろうぜい!ババ抜き、7並べ、ブラジャックなら
コンピュータにショボイけどA.I機能を持たせて対戦ゲームを
作れそうな気がしてきた!
今、構造体にカードのスーツと数字を入れて、シャッフルするところまででけた!

627:デフォルトの名無しさん
08/06/29 08:15:36
よっしゃ、今度はプレイヤーの人数を決定して、カードを人数分
振り分けるところまで出来た!さぁ、ナニ作ろうか?

628:デフォルトの名無しさん
08/06/29 08:21:04
7ならべでよろしく。
ちょっとAIのアイディアがあるんで、思考エンジン部だけ簡単に追加できるようにしておいてくれ。

629:デフォルトの名無しさん
08/06/29 08:36:20
うっし、って、各プレイヤーに配布した後、並び替えるところに着手しようとしているところで
徹夜明けなんで寝まつ(^^; すまそ。

630:デフォルトの名無しさん
08/06/30 00:18:52
うおっ、せっかく作ったが、やはり仕様を変更しようってことで
書き直しまつ

631:デフォルトの名無しさん
08/06/30 17:26:13
がむばれ〜

632:127
08/07/12 23:55:35
626氏も結局いなくなってしまったようだ
モチベーションを維持するのって案外難しいね

633:デフォルトの名無しさん
08/07/13 04:43:15
こんなスレもあるくらいだから、なかなか難しいことなんだろうね

ゲームを作るやる気を維持するためには 3バルカン
スレリンク(gamedev板)

634:デフォルトの名無しさん
08/07/23 11:01:50
グランツーリスモのスタッフは年収1千万
URLリンク(www.polyphony.co.jp)
超優秀じゃなきゃ無理だけどw

3Dなら数学の研究者とかね

635:デフォルトの名無しさん
08/07/23 14:08:15
お、盛り上がってるなぁ
Cじゃなきゃ駄目か?

636:デフォルトの名無しさん
08/11/26 09:39:04


637:デフォルトの名無しさん
08/11/27 12:22:48
大富豪おもしろそう
やってみるか

638:637
08/11/30 23:30:31
だ、誰もいないのか!?

とりあえず、データ型は3から10、ジャック、クイーン、キングを整数の3から12として
Aと2は整数の13と14でいいか
強さの比較が楽で

ペアとかトリプルとか革命とか階段とか8切りとかどうやって処理させようか

完成するまでだれも来なかったりしてw

639:デフォルトの名無しさん
08/11/30 23:38:37
いや、「やってみるか」じゃ突っ込みようがないから。

640:637
08/11/30 23:49:24
いろいろロジック考えてるうちに実はCの勉強にはとってもいい題材ではないかと思えてきた
データ型、文字列の操作、構造体、関数、条件分岐、構造化やモジュール化、デバッグなどが全部学べる

641:637
08/11/30 23:53:59
あ、革命はすべてのカードの値に-1を掛ければいいのか
あれ?革命したあとでもジョーカーが最強だっけ?

642:デフォルトの名無しさん
08/11/30 23:56:31
できるかつまるかしてからおいで。

643:デフォルトの名無しさん
08/12/01 00:26:11
ksk

644:デフォルトの名無しさん
08/12/01 00:37:10
Wikipedia項目リンク

645:デフォルトの名無しさん
08/12/01 04:49:35
ゲ製でやれやクズども

646:デフォルトの名無しさん
08/12/02 02:01:44
>638
そんな話は 昔 >231 とかにあったよ

647:デフォルトの名無しさん
08/12/02 08:13:44
とりあえずcard構造体を宣言してみる。

648:デフォルトの名無しさん
08/12/02 09:30:05
>>647
そんな話が>>127にあったな・・・

649:デフォルトの名無しさん
08/12/02 14:04:24
まず、class suitを。

650:デフォルトの名無しさん
08/12/02 22:20:43
「C言語」なんだからclassはダメだろ。
構造体と、構造体を操作する為の関数くらいの構成で。

651:デフォルトの名無しさん
08/12/02 22:26:15
#define class struct

652:デフォルトの名無しさん
08/12/02 23:10:59
typedefの方がいい

653:デフォルトの名無しさん
08/12/03 18:43:54
無理だろ・・・

654:デフォルトの名無しさん
08/12/07 22:22:55
BASICで書かないか?

655:デフォルトの名無しさん
08/12/07 23:23:56
スレタイ

656:デフォルトの名無しさん
08/12/08 06:16:37
BASICて…もっとキツくないか?

657:デフォルトの名無しさん
08/12/19 15:10:13
VBでポーカー作ってるけど、ストレートの判別方法だけが難しい
誰か暇な人教えてください

658:デフォルトの名無しさん
08/12/19 15:42:53
自己解決しました。

Private Function isStreat(ByVal card() As Card) As Boolean
Dim sortedCard(4) As Integer
sortedCard(0) = card(0).Number
sortedCard(1) = card(1).Number
sortedCard(2) = card(2).Number
sortedCard(3) = card(3).Number
sortedCard(4) = card(4).Number
Array.Sort(sortedCard)

If sortedCard.Contains(13) And sortedCard.Contains(1) Then
If sortedCard(0) = 1 Then
sortedCard(0) = 14
End If
If sortedCard(1) = 2 Then
sortedCard(1) = 15
End If
If sortedCard(2) = 3 Then
sortedCard(2) = 16
End If
If sortedCard(3) = 4 Then
sortedCard(3) = 17
End If
Array.Sort(sortedCard)
End If

If sortedCard(0) + 1 = sortedCard(1) And sortedCard(1) + 1 = sortedCard(2) And sortedCard(2) + 1 = sortedCard(3) And sortedCard(3) + 1 = sortedCard(4) Then
Return True
End If
Return False
End Function

659:デフォルトの名無しさん
08/12/20 19:33:43
>658
K,A,2,3,4 はストーレートぢゃない
(ローカルルールなのかな?)

660:デフォルトの名無しさん
08/12/21 19:03:49
> ストレートにおけるAの取り扱い
>
> ストレート(およびストレートフラッシュ)では、AはKとも2ともつなげる事が出来る。
> すなわちA-2-3-4-5もA-K-Q-J-10もストレートとみなされる。
> しかしQ-K-A-2-3のようにK-A-2を含むものはストレートとはみなされない。

意外ト難シイノネ

661:デフォルトの名無しさん
08/12/21 19:08:07
あ、でも日本ポーカープレーヤーズ協会だと

> ストレート( straight )
> 5枚連続カード
> 例:5s 4d 3h 2s Ac
> なお、AとKは、連続しているとはみなされません。
> (例外として、AKQJT は、ストレートとみなされます。)
> 例えば、4h 3s 2d As Ks は、ストレートではありません。

か。どちらにしてもK-A-2は繋がらないみたいだな。

662:デフォルトの名無しさん
08/12/21 19:10:24
>>661
回りくどい言い方だが、要するに普通のルールってことだよね。

663:デフォルトの名無しさん
08/12/21 19:16:24
どっちにしてもC言語で作るという枷からは逃れられない
このスレでは他の言語で作る奴はその時点でルール違反なのだ

664:デフォルトの名無しさん
08/12/21 19:20:11
C言語でスクリプト言語のインタプリタを作って
その言語で組む事くらいは問題ないですよね?

665:デフォルトの名無しさん
08/12/21 19:31:18
トランプゲームのデータとロジックの実装がC言語でなされていない場合
C言語でトランプゲームを作ったとは言えないだろう
せいぜい実装済みオプションのオンオフ程度が限界ではないか

666:デフォルトの名無しさん
08/12/21 19:34:53
しかし今更Cというのもな・・・。
C++で組みたいぜ。

667:デフォルトの名無しさん
08/12/21 19:57:00
誰でも楽をしたい
そして楽を正当化する経済的な理由もある

ここはそういう世俗的な合理性に歯向かうスレです
プログラミングは苦行であり
他の言語を使って楽をしようとする不信心者は戒められなければなりません

668:デフォルトの名無しさん
08/12/21 20:31:53
別にカードデータくらい素の構造体で難なく作れるだろ
今時のやつって規模も何も考えずにデザパタとか適用しようとするの?

669:デフォルトの名無しさん
08/12/21 20:33:58
Cだとまともな名前空間もオーバーロードもないから
その構造体を操作する関数の名前に
構造体名を付けたりすることがよくあるが、
関数名が長くなって仕方が無い。

670:デフォルトの名無しさん
08/12/22 13:27:52
>668
オブジェクト指向だからと言って、必ずデザパタを使うワケではないぞ。

671:デフォルトの名無しさん
08/12/22 21:09:34
カプセル化もデザインパターンの1つだと思うんだ。

672:デフォルトの名無しさん
09/02/18 12:07:42
保守

673:476
09/02/18 13:23:57
#include <stdio.h>
void tramp(void)
{
int x=0;
printf("select Number:");
scanf("%d",&x);
if(x>=1&&x<=9){
printf("\x1b[0m");
printf("\n");
printf("\x1b[37m --------\n");
printf("|%d |\n",x);
printf("| |\n");
printf("| :) |\n");
printf("| |\n");
printf("| %d |\n",x);
printf(" --------\n");
printf("\x1b[0m");
}else
{
printf("1~9 Input\n");
}
}
int main(void)
{
int x;
for(;x!=EOF; x++)
{
tramp();
}
return 0;
}

674:476
09/02/18 13:24:22
私が作ったトランププログラムです



675:デフォルトの名無しさん
09/02/19 00:51:03
トランプの綴りはtrampでなくtrump
ただしtrumpの英語での意味は切り札のことで
日本語で一般に言うところのトランプはplaying cardsもしくは単にcardsという

676:デフォルトの名無しさん
09/03/20 22:24:43
>>657
VB使ったことないのでCで表現すると
while(i < 4){
next = hand[i]+1
if(hand[i+1] == next){
i++;
} else {
break;
}
}
if(i >= 4) printf("ストレート");

仕様
hand[添え字]・・・手札
next・・・i+1枚目の手札の数値

ストレートであると判断された場合、単純に「ストレート」の文字列を出力するプログラムだけど、絵柄の判定は俺の持ち合わせる知識じゃ無理だ
フラッシュの判定ができるならできるはずだが

677:デフォルトの名無しさん
09/03/20 22:25:31
>>676
訂正
絵柄の判定→絵柄の表現

678:デフォルトの名無しさん
09/03/23 13:17:06
ダメだこのスレ。


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4751日前に更新/153 KB
担当:undef