痔になりやすい生活習慣とは?

今課題研究でトランプゲームの「大富豪」を作ろうと最終決定したのですが

大富豪を作る上でつけようと思っている機能
・ネット対戦対応(誰か一人がホストとなってそこに接続する方式)
・ローカルルールをいろいろゲーム前に設定できる
・チャット可能(これは時間が余ったらで)
・自分のキャラが言葉を発する、例えばあがったら「やったー」など(これも時間が余ったらで)

VBで作ろうと思っていたのですが
どうもちょっと難易度が下がってしまうような気がしてなりません
トランプゲームでオンライン対戦対応というゲームを作るには
どのような言語が向いてるのでしょうか
やはり見た目重視でいってしまうとVBになってしまうと思うのですが

できればその言語を使う上での長所や短所など教えてくれると嬉しいです

駄文ですいませんでした
よろしくお願いします

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>トランプゲームのプログラミングは初めてです


>すいません^^;

じゃあ、欲を出さずVBで作られた方が良いと思います。
カードゲームと言っても演出に凝ればそれだけ難しくなっていきますよ。
ゲーム製作の難易度を簡単に考えすぎです。

ちなみに、カードをシャッフルするプログラムは書けますか?
前に、この段階で分からない人がいたのでお聞きしておきます。
今の段階では、グラフィックは出せなくても良いですが。

VB関係の有名参考サイト「Visual Basic 中学校」を紹介しておきます。
http://homepage1.nifty.com/rucio/main/main.htm
    • good
    • 0
この回答へのお礼

お礼遅れてすいません^^;
結果、VBはやったごとあるので新しい言語を学ぶために
それに近いC#にすることにしました
ありがとうございます

お礼日時:2010/03/07 18:10

>やはり見た目重視でいってしまうとVBになってしまうと思うのですが



見た目重視ならVBの描画ではなく、DirectXやOpenGLだと思いますが。
C#+XNAと言う手もありますね。

>トランプゲームでオンライン対戦対応というゲームを作るにはどのような言語が向いてるのでしょうか

C#+XNAを推薦します。
理由はゲーム専用の開発環境であること。

>VBで作ろうと思っていたのですがどうもちょっと難易度が下がってしまうような気がしてなりません。

その前にネットワーク対戦やら、大富豪のAIとか経験アリで大丈夫なんでしょうか?
トランプの描画とかは、もう手馴れているから大丈夫なんですよね?

この回答への補足

トランプの画像は用意してあるんですが
それじゃだめですか?

トランプゲームのプログラミングは初めてです
すいません^^;
学校で習ってる程度のレベルなので(高校)

補足日時:2010/02/16 10:03
    • good
    • 0

いやいや、これはまともに作ろうとしたら、結構難易度高いですよ


(通信方法をどうするか、とか、ルールの判定とか)
VBでも別に構わないと思います。

VBを使う欠点は、(ほぼ)Windows専用になってしまうことです。
    • good
    • 0
この回答へのお礼

そうですか
VBでも難しいのは難しいんですね

Windowsで動くなら問題ないですw
友達にMacとかはいないんでw

お礼日時:2010/02/16 10:07

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語でのトランプシャッフルについて

初めてですよろしくお願いします。

現在とあるサイトを参考にさせていただいて、
4人のプレイヤーのトランプを配るプログラムを作成しています。

これがプレイヤーの手札を決める部分です。
for (pn = 0; pn < 4; pn++) {
for (cn = 0; cn < 13; cn++) {
do{
mk = rand() % 4;
num = rand() % 13;
}while(ck[mk][num] == 1);
pl[pn].mark[cn] = mk; //スート
pl[pn].no[cn] = num+1; //見やすいように1足す
ck[mk][num] = 1;
printf("%d %d\n",pl[pn].mark[cn],pl[pn].no[cn]); //確認用
}
}

確認用のprintfでは、しっかりとバラバラの手札は表示されますが、

上の処理の後に、下で手札を表示すると・・・
for (pn = 0; pn < 4; pn++) {
for(cn=0;cn<13;cn++){
printf("%d mark %d number\n",pl[pn].mark[cn],pl[pn].no[cn]);
}
printf("\n"); //一行空白用
}

かなりの確立で前者とは違う表示がされます。
特に
pl[0].no[0] //プレイヤー1の一番目の手札の数字
pl[1].no[0] //プレイヤー2の一番目の手札の数字
pl[2].no[0] //プレイヤー3の一番目の手札の数字
pl[3].no[0] //プレイヤー4の一番目の手札の数字

の部分が変わってしまいます。(markは問題なし)

なぜこのようなことが起きるのでしょうか?
ご教授お願いします。

初めてですよろしくお願いします。

現在とあるサイトを参考にさせていただいて、
4人のプレイヤーのトランプを配るプログラムを作成しています。

これがプレイヤーの手札を決める部分です。
for (pn = 0; pn < 4; pn++) {
for (cn = 0; cn < 13; cn++) {
do{
mk = rand() % 4;
num = rand() % 13;
}while(ck[mk][num] == 1);
pl[pn].mark[cn] = mk; //スート
pl[pn].no[cn] = num+1; //見やすいように1足す
ck[mk][num] = 1;
printf("%d %d\n",pl[pn].mark[cn],...続きを読む

Aベストアンサー

> struct {
> int num;
> int mark[12];
> int no[12];
> } pl[4];

あ、やっぱりそうだ。

C言語で意図しない書き換えがあったときに、まっさきに疑うべきなのが
「配列の確保」と「添字」の関係です。

int mark[12];

としたら、どこまでが「正しく使える範囲」か、よく考えてみましょう。

Q自作のカードゲームを作りたい。

 私は昔からゲームを自分で作るのが好きで、最近でも、カードゲームのアイデアをいくつか考えています。
 ところが、個人レベルでは、画用紙に試作品のゲームを作るぐらいしかできず、特に、最近登場したトレーディングカードゲームの場合、カードの数が膨大になるので、試作品レベルでも個人レベルで作るのは不可能に近い状況です。
 市販品に負けないレベルのカードゲームを作る自信は(ゲームシステムについて)あるので、何とか、ゲームの制作を実現させたいと思うのですが、何かいい方法はないでしょうか。

Aベストアンサー

とりあえず試作品に関しては作るのはさほど難しくないと思いますよ。
カード背面の絵はそこら辺の素材集から取ってくれば良いでしょうし、表面にしても適当に殴り書きした絵をスキャナで取り込んで、適当に貼っ付けとけば良いんですよ。
作成ソフトはWORDで十分です。
で、それをプリンタで印刷して厚紙に貼り付け、余裕があればパウチ加工でもすれば良いでしょう。

で、あとは仲間内でやりこんでゲームバランスを高めていきます。また、積極的に第三者にプレイしてもらい、その人の意見を聞いて、出来る限りそれを取り込みます。(仲間内では盛り上がっても他の人がやれば全然ツマラン、なんてのもよくある話。「面白さ」を判断するのには常に第三者の感想を最優先します)

と、ここまでやっとけば、試作品としては十分でしょう。
ゲームのキモってのははあくまでもゲームとしての面白さであって、表面の絵じゃないんですよね。
そして、その面白さってもんは実際に遊んでみては修正するってのを何度も何度も繰り返さないと、絶対に作り出せないんです。

いくらゲームシステムがユニークなものであっても、そこに面白さが伴っていなければ、単なる駄作です。
逆にいえば、実際に遊んで楽しく誰もがハマれるようなゲームバランスを作り出せた時点で、そのゲームは八割方完成しているといえます。

残りの二割ですが、自分で絵が描けないんであれば、
○頑張って、絵の勉強をする。タブレットとグラフィックソフトがあれば、素人でもそれなりに見れる絵は描けますよ。
○フリーな素材集の絵を使う。
○ネット上で自分の絵を発表している人も結構いるんで、適当な絵を見繕って、作者に使用許可をもらう。あるいは頼んで描いて貰う。
○カードゲーム作ってる会社に持ち込みをする。
○思い切ってゲーム会社に就職し、自作ゲームの企画を通す(^^;

ってな案があると思います。ご自分にどうしてもこのゲームを完成させるんだ!っていう意志があれば、他にも道は見つかると思いますよ。


そうそう、PC上でソフトを作る件ですが、オーサリングソフトを使えば比較的簡単かもしれませんね。
フリーなものでは「Filly」とか「HSP」とか。
市販ソフトではMacromediaの「Director」とか。
ただし、あくまでも「比較的簡単」であって「簡単」ではないことに注意。0から始めてそれなりのものが作れるようになるには、修行あるのみです。


・・・とまぁ、ちょっと厳しい意見も入ってしまいましたが、実際、ゲーム一本を作り上げるというのは非常に厳しいことなのです。とはいっても、作品完成までのチェックリストを作ってあきらめずに地道に取り組めば、いつかは必ず完成するものでもあるので、要は作成者の根性がものを言う世界でもあります。

ってことで、頑張ってください!!

Filly
http://www.vector.co.jp/soft/win95/art/se060127.html

HSP(Hot Soup Processer)
http://www.onionsoft.net/

とりあえず試作品に関しては作るのはさほど難しくないと思いますよ。
カード背面の絵はそこら辺の素材集から取ってくれば良いでしょうし、表面にしても適当に殴り書きした絵をスキャナで取り込んで、適当に貼っ付けとけば良いんですよ。
作成ソフトはWORDで十分です。
で、それをプリンタで印刷して厚紙に貼り付け、余裕があればパウチ加工でもすれば良いでしょう。

で、あとは仲間内でやりこんでゲームバランスを高めていきます。また、積極的に第三者にプレイしてもらい、その人の意見を聞いて、出来る限...続きを読む

QVisual Basic でトランプを引くゲーム

心理学実験のために、
「シャッフルされたトランプの山から1回100円で
1枚ずつ引いていき、ハートのカードが5枚揃った時点でプレイヤーの勝ち!」

というゲームをVisualBasic2010Expressで作りたいですが、プログラムが分かりません。

VBは初心者です。
Dimの意味がなんとなく分かるくらい・・・

どなたかご指導お願いいたします。

Aベストアンサー

こんばんは


>心理学実験のために
すごいですね。なんだろ~?



>Dimの意味がなんとなく分かるくらい・・・
最初はみ~んな同じです。
私は、まだDimの意味の意味はわかりません。
最初はコピペでもいいと思います。
そのうち慣れればわかるようになります。



ゲームの内容、ルールはよくわかりませんが、適当にサンプルを作成しましたので参考にしてください。
(正直言って、私はゲームは1回も作成したことがありません。
よっておかしなところがあると思います。)

>ハートのカードが5枚揃った時点でプレイヤーの勝ち!
めったに勝てません!



トランプのファイル名は
ハートの1ならなら「h1.png」
ハートの5ならなら「h5.png」

スペードの1なら「s1.png」
スペードの6なら「s6.png」
のように設定してください。

testフォルダーの中にトランプの画像ファイルを入れてください。


Public Class Form1
Const DIR_NAME As String = "C:\test" 'フォルダーパス
Dim rndm As New Random 'Randomのインスタンス
Dim ar As New List(Of String) 'トランプをリストにする
' Dim ar() As String
Dim tranpcount As Integer 'トランプの枚数
Dim victry As Integer 'ハートのカードが揃ったときのカウンター
Dim bank As Integer = 500 '持ち点
Dim playercount As Integer 'プレイヤーの得点
Dim comptcount As Integer 'コンピューターの得点
Private Sub f1() Handles MyBase.Shown
Button1.Enabled = True


Dim ofolder As New IO.DirectoryInfo(DIR_NAME)
Dim ofile As IO.FileInfo
'ループでファイル名をリストにAddする()
For Each ofile In ofolder.GetFiles("*", IO.SearchOption.AllDirectories)
ar.Add(ofile.Name)
Next

End Sub
'Clickイベント
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
tranpcount = ar.Count 'トランプの枚数の枚数を数える

'PictureBoxに描画するサイズの設定
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
PictureBox2.SizeMode = PictureBoxSizeMode.Zoom

Dim rndm1 As Integer
Dim rndm2 As Integer

'コンピューターの選んだカードとプレイヤーが選んだカードが同じ場合はループを繰り返す
Do
'0からtranpcount-1までのランダムな数字を取得
rndm1 = rndm.Next(tranpcount)
rndm2 = rndm.Next(tranpcount)
'上記で取得した値からPictureBoxに描画
PictureBox1.Image = Image.FromFile(DIR_NAME & "\" & ar(rndm1))
PictureBox2.Image = Image.FromFile(DIR_NAME & "\" & ar(rndm2))

'コンピューターの選んだカードとプレイヤーが選んだカードがが違う時はループを抜ける
If ar(rndm1) <> ar(rndm2) AndAlso ar.Contains(ar(rndm1)) AndAlso ar.Contains(ar(rndm2)) Then
Exit Do
End If
Loop

Dim head1 As String
Dim head2 As String
'ファイル名の先頭の文字を取得
head1 = ar(rndm1).Substring(0, 1)
head2 = ar(rndm2).Substring(0, 1)

If head1 = "h" AndAlso head2 = "h" Then
victry += 1 '先頭の文字が同一であればカウントする     
playercount += 100
bank += 100
Else 'それ以外にカウントする
playercount -= 100
comptcount += 100
bank -= 100
End If

'1度使ったトランプは削除
If rndm2 > rndm1 Then
ar.RemoveAt(rndm1)
ar.RemoveAt(rndm2 - 1)
Else
ar.RemoveAt(rndm1)
ar.RemoveAt(rndm2)
End If

'各ラベルに表示
Label3.Text = comptcount
Label4.Text = playercount
Label6.Text = bank

If victry = 5 Then
MsgBox("プレイヤーの勝ち!")
End If

If tranpcount < 3 Then
MsgBox("トランプがありません、終了です。")
Button1.Enabled = False
End If
End Sub
'初期化
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
f1()
victry = 0
bank = 500
playercount = 0
comptcount = 0
Label3.Text = 0
Label4.Text = 0
Label6.Text = 500
End Sub
End Class


わからないときは、また質問してね。

こんばんは


>心理学実験のために
すごいですね。なんだろ~?



>Dimの意味がなんとなく分かるくらい・・・
最初はみ~んな同じです。
私は、まだDimの意味の意味はわかりません。
最初はコピペでもいいと思います。
そのうち慣れればわかるようになります。



ゲームの内容、ルールはよくわかりませんが、適当にサンプルを作成しましたので参考にしてください。
(正直言って、私はゲームは1回も作成したことがありません。
よっておかしなところがあると思います。)

>ハートのカードが5枚揃った時点で...続きを読む

QC言語のソース

初心者です。100ステップ位で理解するのにちょうどいいソースプログラムはホームページ上に無いでしょうか?

Aベストアンサー

こんにちは。

Cのソースといっても、
幅が広いです。

既にご承知かもしれませんが、
参考URLを参照し、
必要な箇所のサンプルを参照して下さい。

参考URL:http://www.kumei.ne.jp/c_lang/

Q戻り値の意味がわかりません…

戻り値とはどういう値なのか簡単な例文で教えて頂けますか?

Aベストアンサー

バカくさいかもしれませんが簡単な例えをだしてみます。
2人の子供がいて、名前をそれぞれ太郎・花子にしましょう。この2人の子にある役割を決めます。
・花子は飴をもらうと、それをチョコにする役割。(できるかは別として)
・太郎は花子を呼んで飴をあげる役割。

さてこの例では太郎の飴が引数(ひきすう)になり
花子のチョコが戻り値になります。

このイメージを元に次の文を読んでみてください。

「プログラム中の関数やサブルーチンが処理を終了し
呼び出し元に処理の結果として返す値。」

これが戻り値の正しい定義です。
そのほかにはNo1さんのような役割指すときも、それを「戻り値」と呼んだりします。

Qjavaでゲームを作りたいです。初めてです。ぜんぜん知識もありません

javaでゲームを作りたいです。無謀ですが・・・
どうやって作ればいいのでしょうか?
その前にどんなゲームが作れるのでしょうか?

Aベストアンサー

回答ありがとうございました。
・・・脱帽です。はっきり言ってプログラミングやったことないのです。

そう思っていましたよ。でも、ゲームに目をつけたのはなかなかいいアプローチです。ただし、僕は二、三年Javaをかじりまくって、やっと文法を覚えてそれからいろんなアプリケーションを作っています。ゲームづくりはもう少し先の話ではあるかもしれないけれども、とにかくいい勉強になり結構面白いです。かなりいい訓練になるはずです。だから、先見の目のすごさに脱帽しています。逆にすばらしいと思いましたよ。(^^\

>このような言語(?)なんか英語みたいなのをどこに書けばいいのかわかりま>せんし、コンパイルしようとしても原因がわからず作業が中止になったり>とてもできそうにありません。

最初は誰だってそうなんですよ。例えば僕は二年間もクラスって何かわからなくて、上級者の人に聞いたら一瞬で「えー、そんなことだったの?」とはとが豆鉄砲を食らったようになってしまったのを覚えているのです。それぐらい僕は無知でした。誰だって、一年ぐらいはコンパイルがなかなか通らなくてその原因は何かなんていうのはざらですが、要するにそういうときでも絶対に自分をほめてあげればいいのですよ。よくコンパイルなんてやったな~なんていうふうにね。(笑)

よく特別な人がプログラムを書いているような言われ方をする人や、そうしたことが特殊だという社会的な風潮があるのですけれども、いたって普通です。機械は二進法(電気が+と-しかないから、例えば数値で言えば1と0)しかわからないみたいですし、右といえば右にしか行きません。エラーなんてむしろ人間的でいいなと思いますよ。

ただ解決方法がわからない以前に、実現方法がわかりたいのが人情です。だから、ものすごく簡単な入門書で最初に勉強するとものすごく良いんです。僕は最初千円の本当に簡単な入門書からやりました。もちろん、上級者のアドバイスでそうしたのです。


>やっぱりまだ自分には向いていないのでしょうか?

将来的には向いているかもしれませんよ。僕はたぶんあなたよりもひどかった(笑)かもしれない。確かにいきなりは作れないんです。それは僕も一緒です。でも、少しでも勉強したり、プログラミングをしたりしたら、どんなことでも良いから、進歩したことになるから、自分を信じて、自分をほめてあげてください。あなたは少なくとも今面白いことをやろうとした。面白いことに向かって精進しようとこうして質問コーナーにまできちんと出向いた。立派だと思いますよ。(笑)勉強していると適正が出てくると思います。本当に僕は最初から書けた人なんて誰もいなかったんだと思うのですが。僕も偉いしなくてもいい苦労までしたもんですよ。(笑)

ま、とにかく思いつめるのは何にもなりません。せっかくのあなたの努力が無駄になるばかりか、あなた自身をつまらなくしてしまうかもしれません。コンパイルなんてものは百回のうち一回通ればそれでパソコン上ではソフトは動くことになっているのですから。あなたは何も心配することはありません。

今もしも目一杯頑張ってしまっているのだったら、むしろ少しゆっくり目に、わからなかったらこういうところに来て質問をしたりしていると良いかもしれませんよ。

まずは簡単なことからはじめましょう。でも、標準出力ができると、いろいろなことができるようになるので、続けられるのです。ほんの少し、ありの一歩の進歩でいいから、とにかく自分をほめてほめてほめまくることが大事なのです。やる気はものすごく感じていますよ!!!

みんな自分をほめながら、適当に好きなことをやってきただけです。でも、学校で教えてもらうのも一つの手ですよ。

あなたはすごくやる気が感じられた。だから、僕も教えていてとても気持ちが良かった。あなたが僕の書いた文書を読んでくれると信じて昨日も机の上でスヤスヤ眠りこけるまでワープロを打った。(笑)

とにかく最初は安くて分かり易い入門書がお勧めです。すごい簡単なことからできるようになって、基礎的な簡単な知識を身につけるといいでしょう。

もう僕は心配していないのです。きっと大丈夫ですよ。それにまたわからなくなったら聞きに来たらいいと思いますよ。みんなきっと親身に教えてくれるはずです。みなが一応に通ってきた道ですから、僕もそうですがみな苦労しているから、初心のころのことをあなたと同じ体験をみな体験してきているはずです。

初めからできる人なんていないから、気にしないでゆっくりじっくりと楽しんで、頑張ってくださいね。心から応援していますよ。ゆっくり、確実に、基礎をつくり、はしらを立てて、屋根を載せる。Javaで言うならば、最初に
標準出力でHelloWorld
変数
メソッド
クラス
制御文で
if分岐
for文ループ
switch文(選択)
while文
do
whiel文
try catch節(例外)
スレッド
フレームワーク
API
object指向(クラスやオブジェクトをものとして考える)
カプセル化・継承・多態性
Javaプログラムの基本
コレクションクラス
後はWEBアプリケーション開発にサーブレットに移行していく場合もありますが、まずは、簡単な上記を一通りやっておきましょう。すべて完璧でなくても良いですよ。すべて完璧にできる人はいませんからね。

だんだんリファレンスをひいたりすることができるようになるといろいろ面白くなってくると思うのです。人それぞれですが、メソッドがわからなくなるなんてしょっちゅうですから、僕はリファレンスから離れることはできません。でも、みんなそうだと思います。

とにかくあせらずこつこつと努力していくと良いと思いますよ。なれるのはゆっくりと、ほんの少しずつで良いのです。

あと、くれぐれも少しでも何かやったら、自分をほめてあげてくださいね。

回答ありがとうございました。
・・・脱帽です。はっきり言ってプログラミングやったことないのです。

そう思っていましたよ。でも、ゲームに目をつけたのはなかなかいいアプローチです。ただし、僕は二、三年Javaをかじりまくって、やっと文法を覚えてそれからいろんなアプリケーションを作っています。ゲームづくりはもう少し先の話ではあるかもしれないけれども、とにかくいい勉強になり結構面白いです。かなりいい訓練になるはずです。だから、先見の目のすごさに脱帽しています。逆にすばらしいと思いま...続きを読む

Q銀行口座開設にあたってのかかる時間、口座番号について。

銀行口座開設にあたって、窓口で手続きしたらどのくらいの時間で口座が作れるでしょうか?

また、その場で口座番号はわかるのでしょうか?

Aベストアンサー

身分証明書、ハンコをお忘れなく。通帳は当日持って帰ることが
出来ますがキャッシュカードは自宅に郵送になります。10日前後
かかりますね。

Qばばぬきプログラムについて

 下記のようなプログラムで4人のコンピュータにババヌキをさせるプログラムを組んでる最中なんです。
 decklistまでは表示できてもshufflelistではコンパイルは通っても実行するとデバックが起きてしまって困っています。while文をなくすとちゃんと返り値を持って表示はできるんですがwhile分で繰り返したとたんデバックが起きるんですがその理由がわかりません。どうして無理でしょうか?ご教授願います。

decklistは整列されリストに保存した山札の関数。
shufflelistはランダムで保存していく関数。
personの関数はdecklistのほうで試したところコンパイルは通るんですがこちらもデバックが起きてしまいます。


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define N 53

//デッキのカードの構造体
struct card{
int t;
struct card *next;
}*deck;

//カードを配った後のそれぞれのプレイヤーの情報(仮
struct player{
int card;
struct player *nextcard;
struct player *nextturn;
};

//関数定義
struct card *talloc(void);
struct player *lalloc(void);
struct card *decklist(void);
struct card *shufflelist(void);
struct player *person(struct player *P);
void displist(void);

int main(void){
struct player *A,*B,*C,*D;
struct player *p;
p=person(A);
while(p!=NULL){
printf("%d ",p->card);
p=p->nextcard;
}
return 0;

}

//card構造体のセルの確保
struct card *talloc(void){
return (struct card *)malloc(sizeof(struct card));
}

//player構造体のセルの確保
struct player *lalloc(void){
return (struct player *)malloc(sizeof(struct player));
}

//カードを切る前の整列された山札の関数
struct card *decklist(void){
int i,add=1,count=0;
struct card *p;
deck=NULL;
for(i=0;i<53;i++){
if(count==4){
add+=1;
count=0;
}
p=talloc();
p->t=add;
p->next=p;
count++;
p->next=deck;
deck=p;
}
return deck;
}

//山札をシャッフルした後の山札の関数
struct card *shufflelist(void){
int i,a,count=0,r;
struct card *d,*p,*q,*shuffle;
p=decklist();
shuffle=NULL;

while(p!=NULL){
srand(time(NULL));
r=(int)rand()%(N-count);
for(i=0;i<r;i++){
p=p->next;
}
q=talloc();
q->t=p->t;
d=p->next;
p->next=d->next;
q->next=shuffle;
shuffle=q;
count++;
p->next=p;
}



return shuffle;
}

//プレイヤーへカードを配るための関数
struct player *person(struct player *PERSON){
struct player *a;
struct card *library;
int i;
PERSON=NULL;
library=decklist();
a=lalloc();
while(a!=NULL){
a->card=library->t;
for(i=0;i<4;i++){
library=library->next;
}
a->nextcard=a;
a=PERSON;
}

a->nextcard=NULL;
while(a!=NULL){
printf("%d ",a->card);

}

return PERSON;

}

 下記のようなプログラムで4人のコンピュータにババヌキをさせるプログラムを組んでる最中なんです。
 decklistまでは表示できてもshufflelistではコンパイルは通っても実行するとデバックが起きてしまって困っています。while文をなくすとちゃんと返り値を持って表示はできるんですがwhile分で繰り返したとたんデバックが起きるんですがその理由がわかりません。どうして無理でしょうか?ご教授願います。

decklistは整列されリストに保存した山札の関数。
shufflelistはランダムで保存していく関数。
pe...続きを読む

Aベストアンサー

とりあえず、カードを抜く処理について、抜いたカードの前後に対する
処理の一例として理解いただければ、いいかと思います。

が、実はシャッフルであれば、もっとお手軽にできます。
そう、カードの交換です。
------------------------------------------------------------
//山札をシャッフルした後の山札の関数
struct card *shufflelist3(void){
int i,j,cnt,r1,r2,t;
struct card *p,*p1,*p2;

srand(time(NULL));
cnt=rand()%53+30;

p=decklist();
for(j=0;j<cnt;j++){
p1=p2=p;
r1=(int)rand()%53;
r2=(int)rand()%53;
if(r1==r2) continue;
for(i=0;i<r1;i++) p1=p1->next;
for(i=0;i<r2;i++) p2=p2->next;

// r1番目とr2番目の入れ替え
t=p1->t;
p1->t=p2->t;
p2->t=t;
}
return p;
}
------------------------------------------------------------

で、気付いたかもしれませんが、ババ抜きにおいて山札は枚数が決まっていて、
カードが配布されたら0になるべきものであるので、配列でOKだったりします。
ポインタ構造は不定枚数の時に効果を発揮しますが、なにぶん、10枚目!といった際に
10枚目を探すことになりますので、例えば p[9]と一発で指定できる配列には
かないません。
私はプログラムは一回作ったら必ず見直すようにしています。
配列版にすると全体的な影響が大きすぎるので、プログラムは提示しませんが
上記よりものすごくシンプルになったりします。
#時間がない、といっている中、同じところばかり見ていてすみません。
#ただ、バグが発生しやすいCはプログラムの見直し、及び、確実な仕様の理解は必須です。


> 自分の頭がコンピュータ側としての理解の仕方に合わせれてないことを痛感しました。
> もうちょっと練り考えて見たいと思います。

そんなにコンピュータ側にあわせる必要もないです。
前に提示した私のサンプルはポインタのリスト構造が後ろに伸びていく、ただ
それをイメージしただけで、コンピュータ側にあわせたわけではないです。
カードを抜く処理が言葉だけでは伝わらなかったので、サンプルを作ろうと思ったのですが
ちょっと思うようにいかず、若干ですが、リスト構造作成の方に手を入れさせて頂きました。
私としてはカードを抜く処理が伝われば、それでいいです。

で、他処理ですが、

・プレーヤーにカードを配る処理
 →A,B,C,Dはグローバル変数にしてしまってもいいのではないでしょうか?
  その上で、これからもらうカードとしてa,b,c,d、及び、その手前をaa,bb,cc,ddとして
  山札から1枚引く関数を実行、カードが無くなったらループから脱出、って感じに
  すればいいでしょう。
  山札から1枚引く関数は前に提示した関数を参考にすればいいかと思います。

・ゲーム実行
 4人の内3人はコンピュータでしょうか?
 ババ抜きは本来は相手の表情等を伺っての戦略が必要ですが、流石にそういった処理は
 難しいので、何も戦略がないとすれば、単に乱数を使用しカードを抜いていく、といった
 処理をすればいいだけとなります。
 これも山札から1枚抜く処理が主立ったものになるかと思います。
 言葉で書くより面倒な処理は多いかとは思いますが、慣れればすぐにできるようになります。
 がんばってみてください。

とりあえず、カードを抜く処理について、抜いたカードの前後に対する
処理の一例として理解いただければ、いいかと思います。

が、実はシャッフルであれば、もっとお手軽にできます。
そう、カードの交換です。
------------------------------------------------------------
//山札をシャッフルした後の山札の関数
struct card *shufflelist3(void){
int i,j,cnt,r1,r2,t;
struct card *p,*p1,*p2;

srand(time(NULL));
cnt=rand()%53+30;

p=decklist();
for(j=0;j<cnt;j++){
p1=p2=p;
r1=(i...続きを読む


人気Q&Aランキング