2冊めの本について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Lawliet

2冊めの本について

#1

投稿記事 by Lawliet » 6年前

C言語の「明解C言語入門編」を読み終わりました。
2冊めの本には何が最適でしょうか?

とりあえず、最終的にはゲームを作りたいと思っているので、
C++の本か、ゲームの作り方の本、
それとも
C言語のことをもっと掘り下げた本か、

どれがいいでしょうか?その中でどの本がいいでしょうか?

他にもおすすめの書籍があれば挙げてくれると嬉しいです

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#2

投稿記事 by softya(ソフト屋) » 6年前

読み終えたのか、書かれたことを全部実行してみたのかでは大分差がありますが如何でしょうか?
あと練習問題は全部できましたか?

>とりあえず、最終的にはゲームを作りたいと思っているので、
>C++の本か、ゲームの作り方の本、
>それとも
>C言語のことをもっと掘り下げた本か、

言語はプログラミングの全てではないので、実際にプログラム組んでみることが大切です。
なので、ゲーム作りをごく簡単なものからはじめてはどうでしょうか?
たとえば、じゃんけんゲームや三目並べです。これらはコンソールアプリとして作ることもできます。
もし、足を踏み出せないのなら「明解C言語入門編」に書かれていたことが自分の身についていない可能性もあります。

グラフィックが無いと嫌と言うのなら、ここの「ゲームプログラミングの館」から始めても良いでしょう。
本に関しては、必要に感じたら探せば良いと思います。細かいことを聞いてもらえば紹介もできます。
ただ、言語を幾ら覚えてもアプリやゲームは組めないのです。これを覚えておいてください。
私の経験からすれば、言語の文法は必要な知識の十分一以下です。つまり、さっさと次に移らないと何も出来ないよって事ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lawliet

Re: 2冊めの本について

#3

投稿記事 by Lawliet » 6年前

提示されたコードは実行せず頭のなかだけで理解しようとしていた部分が結構ありました。

練習問題はできないところも少しありましたがとりあえずはすべての問題に手を付けました。

なのでひと通りはできると思いますが・・・

2冊めを探したいというのは、
「簡単なゲーム」といっても何を作ったらいいのかわからないからです。(アイディアが出ないということです)
なので本があれば提示してくれるため学習がスムーズに行くと考えたためです。

本について「細かいこと」とは例えばどんなことを言えばいいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#4

投稿記事 by softya(ソフト屋) » 6年前

Lawliet さんが書きました:提示されたコードは実行せず頭のなかだけで理解しようとしていた部分が結構ありました。

練習問題はできないところも少しありましたがとりあえずはすべての問題に手を付けました。

なのでひと通りはできると思いますが・・・

2冊めを探したいというのは、
「簡単なゲーム」といっても何を作ったらいいのかわからないからです。(アイディアが出ないということです)
なので本があれば提示してくれるため学習がスムーズに行くと考えたためです。
それは危険なワナかもしれないですね。
そのものズバリなサンプルがないと何も作れないという人が良くいらっしゅいますが、それは自分で考えることをして来なかったことで自分で抱かえこんでしまった問題です。
こうなると、そこからの脱出はかなり難しくなります。なので、自分で考えることが何より大事です。

あと、最初から難しいものを考え過ぎと言うのもあります。
最初にも書いた通り、コンソールのじゃんけんゲームぐらいは「明解C言語入門編」の問題が出来るなら作れるはずです。
なので、そのぐらいから始めるのが吉だと思います。
子供の頃遊んだ素朴な七並べなどのトランプとか結構難しいですよ。
Lawliet さんが書きました: 本について「細かいこと」とは例えばどんなことを言えばいいのでしょうか?
ポインタが分からないとか、アルゴリズムを勉強したいとか、あとenumがちょっととか、構造体が上手く使えませんとか、の細かい話です。

【追記】 
あとゲームのアイデアの出し方を本に求めるのは間違いですよ。実装方法のサンプルさえ少ないです。自分で考えるのが先決ですよ。
参考になるか分かりませんが猫Cです。
「C言語編INDEX」
http://www.kumei.ne.jp/c_lang/index_c.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 2冊めの本について

#5

投稿記事 by ISLe » 6年前

ヒットアンドブローとかも定番ですね。
配列使ったり文字列使ったりいろんな書き方ができるので面白いと思いますけど。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#6

投稿記事 by softya(ソフト屋) » 6年前

例えば、こういう練習問題もあります。
「C言語 練習プログラム集」
http://akabas.net/(S(mlrkxl451pmm1z45zl ... CTask.aspx
ルールだけを見て組んでみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lawliet

Re: 2冊めの本について

#7

投稿記事 by Lawliet » 6年前

自分で考えるということをしっかり念頭に置いてやっていきたいと思います。
確かに「サンプルがなければ作れない」というのは良くないことですので・・・

ご提示してくださったゲームなど簡単なものから並行してやっていこうと思います。

本につてですが、
特にここを勉強したいとかはないので全般的なことをやりたいと思っています。
なので同じ著者の「明解C言語 中級編」や
評判がよさそうな「C実践プログラミング 第3版」なんかがいいかと思うのですがどう思いますか?

あと、cからc++に移行するにはどのタイミングがいいと思いますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#8

投稿記事 by softya(ソフト屋) » 6年前

> 確かに「サンプルがなければ作れない」というのは良くないことですので・・・

いえ、はっきり言って必要なサンプルなど落ちている可能性は殆ど無いので現実問題としては作れないんです。

>なので同じ著者の「明解C言語 中級編」や評判がよさそうな「C実践プログラミング 第3版」なんかがいいかと思うのですがどう思いますか?

ゲームだと殆ど関係無さそうですね。決めるのはLawlietさんですけど。

> あと、cからc++に移行するにはどのタイミングがいいと思いますか?

いつでも構いませんが、C++は魔法ではないので劇的に凄いことがすぐ出来るわけではありません。
必要ないならC++に移ることさえ不要なんですよ、
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#9

投稿記事 by softya(ソフト屋) » 6年前

> 確かに「サンプルがなければ作れない」というのは良くないことですので・・・

いえ、はっきり言って必要なサンプルなど落ちている可能性は殆ど無いので現実問題としては作れないんです。

>なので同じ著者の「明解C言語 中級編」や評判がよさそうな「C実践プログラミング 第3版」なんかがいいかと思うのですがどう思いますか?

ゲームだと殆ど関係無さそうですね。決めるのはLawlietさんですけど。

> あと、cからc++に移行するにはどのタイミングがいいと思いますか?

いつでも構いませんが、C++は魔法ではないので劇的に凄いことがすぐ出来るわけではありません。
必要ないならC++に移ることさえ不要なんですよ、
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lawliet

Re: 2冊めの本について

#10

投稿記事 by Lawliet » 6年前

ゲームだと殆ど関係無さそうですね。決めるのはLawlietさんですけど。
と言うことは、もうゲームの方に行ってもいいということでしょうか?

YuO
記事: 940
登録日時: 8年前
住所: 東京都世田谷区

Re: 2冊めの本について

#11

投稿記事 by YuO » 6年前

Lawliet さんが書きました:
ゲームだと殆ど関係無さそうですね。決めるのはLawlietさんですけど。
と言うことは、もうゲームの方に行ってもいいということでしょうか?
それを決めるのもLawlietさんだと思いますよ。
個人的には,ゲームを作るからといってゲーム作りだけを勉強するのではなく,他の知識も同時に勉強していけばよいと思っていますが。
# 設計なども知らないと規模が大きくなると簡単に破綻しますし。

既に出ている「じゃんけん」「三目並べ」「ヒットアンドブロー」などを,一度今の知識だけで作ってみるとよいとは思います。
ネット上に大量のサンプルがあるとは思いますが,それらを見ずに作って下さい。
じゃんけんの勝敗の決定だけでも,最初は苦労すると思いますよ。
オフトピック
難易度はじゃんけんが一番やさしくて三目並べが一番難しいかなぁ。
  • じゃんけんは状態を持たない (その時の入力のみで結果が出る)
  • ヒットアンドブローは状態が固定 (「正解」が一度決まるとそれが変化しない)
  • 三目並べ (tic-tac-toe) は入力のたびに状態が変化する
という理由での順位付けですが。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#12

投稿記事 by softya(ソフト屋) » 6年前

同じ著者の方ならデータ構造とアルゴリズムは勉強したほうが良いと思いますけどね。
「C実践プログラミング」とか組みながら読まないと実感できないと思います。
つまり、実践→読む→実践です。経験しないと身につかない事が多いで実践を初めましょう。
しばらくしたら、良い設計などの本にも手を出してみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lawliet

Re: 2冊めの本について

#13

投稿記事 by Lawliet » 6年前

そうですね「〇〇あるある」ってその「〇〇」をやっていないと実感できないことですもんね。

同じ著者の本で行くとした場合「中級編」か「データ構造とアルゴリズム」はどちらのほうがためになると思いますか?

後々はアルゴリズムなども勉強したいと思っているんですが
今(入門書を読み終わった段階)がタイミング的にいいのでしょうか、
それとももっと別のことをやったほうがいいと思いますか?

僕個人としては正直どっちを選んだらよいか全く見当がつきません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#14

投稿記事 by softya(ソフト屋) » 6年前

私は、上にも書いた通り「データ構造とアルゴリズム」押しです。
ただ、アルゴリズムは、ネットでも情報はあるんで無理して買う必要もないとは思います。

「中級編」は内容を見て、どうしても必要だと思えば買えば良いと思います。
一応、数当てゲームやじゃんけんゲームも載っています。 自分でプログラム化出来ないと言うのなら読んでみるのも方法かもしれません。
「BohYoh.com【著書】新版明解C言語中級編《本文》」
http://www.bohyoh.com/Books/MeikaiC02/body.html
これをやったら他のことも出来るように成るかと言うのは私には何とも言えません。「中級編」は無くても何とか成るとはすごく思いますけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lawliet

Re: 2冊めの本について

#15

投稿記事 by Lawliet » 6年前

「中級編」は内容を見て、どうしても必要だと思えば買えば良いと思います。
「中級編」は無くても何とか成るとはすごく思いますけどね。
わかりました。

話が少し変わるのですが
ゲームを作るにあたってはC++のほうがCよりも便利だと聞きました。
どんなところが便利でしょうか?

それとC++に行くよりもやはり実践でしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#16

投稿記事 by softya(ソフト屋) » 6年前

C言語のほうが便利というより簡単なだけです。
C++に行くのはそれなりに学習コストが高いので、挫折する可能性が高くなるわけです。
ゲームを作るのが目的なら、無理してC++勉強しなくて良いんじゃないの?って話ではあるわけです。

>それとC++に行くよりもやはり実践でしょうか?

道具であるプログラミング言語を覚えるのは、本来蛇足であり本筋と別のことです。
やりたいのはゲームを作る事で、言語を覚えることではないはずですよね?
なので、プロのゲームプログラマーを目指していて、時間的な余裕があと2,3年程度しかないなら急いで覚えた方が良いと思います。
それ以外の場合は、覚えたいときに覚えたら良いのでご自分で決めてください。
急いで覚える必要もないですが、ゲーム作るよりも言語学習が好きなら覚えても良いと思います。
ただ、ゲームを作るということには、一歩も近づかない行為であることは確かです。
しかし、C言語の手続き指向の癖がオブジェクト指向の学習の邪魔をするという説も有るので、ちゃっちゃと行ってしまうのも手ではあります。
なんにしても、決めるのはLawlietさんですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lawliet

Re: 2冊めの本について

#17

投稿記事 by Lawliet » 6年前

C言語の手続き指向の癖がオブジェクト指向の学習の邪魔をするという説も有るので、ちゃっちゃと行ってしまうのも手ではあります。
触ったことがないのでわかりませんが、手続き型とオブジェクト指向は結構方向性が違うのでしょうか?

そしてこれからはやはりオブジェクト指向が主流になってくるのでしょうか・

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 2冊めの本について

#18

投稿記事 by ISLe » 6年前

Lawliet さんが書きました:ゲームを作るにあたってはC++のほうがCよりも便利だと聞きました。
どんなところが便利でしょうか?
ゲームに限らないと思いますけど…
コードを再利用のためにまとめることや、再利用がしやすくなります。
複数のパートに分けて作業しやすくなります。

ただしそういう意志でコードを書かないとメリットはありません。
C言語よりC++のほうが手間を掛けた分のリターンが大きく、より開発効率の向上を見込めます。

このサイトにある龍神録くらいのゲームを2,3本作るとメリットを感じられるのではないでしょうかね。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 2冊めの本について

#19

投稿記事 by ISLe » 6年前

Lawliet さんが書きました:そしてこれからはやはりオブジェクト指向が主流になってくるのでしょうか・
オブジェクト指向の処理系を使いたいのか、オブジェクト指向な設計をしたいのか、オブジェクト指向な実装をしたいのか、どれなのでしょう。
「オブジェクト指向」という言葉の響きに惹かれているだけなら気にする必要はないですし気にしたところでいまは何もできないと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#20

投稿記事 by softya(ソフト屋) » 6年前

>Lawlietさん そしてこれからはやはりオブジェクト指向が主流になってくるのでしょうか・
>ISLeさん オブジェクト指向の処理系を使いたいのか、オブジェクト指向な設計をしたいのか、オブジェクト指向な実装をしたいのか、どれなのでしょう。

既に主流ではあると思います。 → 「オブジェクト指向の処理系」としてですが。
ただし、学習コスト(難易度)が高いので初学者がC++をメインにしている学校は少ないです。 → 「オブジェクト指向の処理系」です。
Javaなどの方が仕様がC++ほど複雑怪奇じゃないので、オブジェクト指向の学習に集中できるためオブジェクト指向の入門としては向いていると言われています。
 → ここだけは「オブジェクト指向な実装」の学習についてです。

> ゲームを作るにあたってはC++のほうがCよりも便利だと聞きました。

ぼけていたのか私の回答が変ですね。
C++をちゃんと「オブジェクト指向な実装」を使いこなせばバグは減り生産性は高くなります。
ただし、それが出来るように成るのにISLeさんも書いている様にそこそこの経験が必要です。
つまり、メリットを実感として感じれるのは大分先ということです。
それに、かなりC++の良いところを意識し書かないと、「オブジェクト指向な実装」が出来ずに何時まで経ってもベターC(便利なC)止まりか生産性が悪化します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lawliet

Re: 2冊めの本について

#21

投稿記事 by Lawliet » 6年前

ISLe さんが書きました: ゲームに限らないと思いますけど…
コードを再利用のためにまとめることや、再利用がしやすくなります。
複数のパートに分けて作業しやすくなります。
具体的にはどのようにして再利用するのでしょうか?
C言語でも関数とか再利用できると思いますが・・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#22

投稿記事 by softya(ソフト屋) » 6年前

オブジェクトは1つの動作要素ですので、これがちゃんと作られている場合においては他のオブジェクトと独立して利用可能になります。
つまり、敵処理がほしいなぁ。そうだ!!前作ったゲームの敵処理のオブジェクトをベースに使おう!って事で解決できることが有るわけです。
C言語でも、ちゃんと作れば同じ様なことは可能です。この独立性が高いというのが結構難題なんですけどね。

まぁ、敵処理よりはBGM管理とか下回りの処理ぐらいしか使いまわさない可能性は高いですけどね。それでも助かるのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 2冊めの本について

#23

投稿記事 by ISLe » 6年前

Lawliet さんが書きました:具体的にはどのようにして再利用するのでしょうか?
C言語でも関数とか再利用できると思いますが・・・・
C言語での関数の再利用は既存の実装を再利用することしかできません。

例えば派生クラスで仮想メンバ関数を実装することで実装を利用者側に委ねることができます。
フレームワークというゲームプログラムの中の仕組みそのものを再利用できます。
新しいゲームを作るときは、新しい要素をコーディングするだけで済むことになります。

このあたりはC++でスマートに記述できます。
同じことをC言語でやろうとすると泥臭くなってしまいます。

Lawliet

Re: 2冊めの本について

#24

投稿記事 by Lawliet » 6年前

「決めるのは自分」と言われてしまえばそれでおしまいなのですが、
個人的な意見でいいですので
C++にはいつ頃移行していくと良いか、

C++よりもゲームプログラミングに行くか

この2つだけ答えてもらってもよろしいでしょうか?
いずれにせよ将来C++でやって行きたいと思っています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#25

投稿記事 by softya(ソフト屋) » 6年前

C++に行く前提ならC++に行ってみると良いと思います。
まだ、難しいとか、道のりが長くてやってられないと思ったらゲームプログラミングを始めてみれば良いと思います。
別に並行でやってもゲームプログラミングと被らない内容なので全然問題は無いのです。
とにかく、正解はないでこっちは勝手な提案ができるのみですから。
※ ちなみに私の経験は当てにならないです。時代的にC言語しか選択肢がなったので、C++かC言語かで悩む必要性もなかったです。

【補足】
ちなみに、ゲーム作りにおいてC++じゃないと出来ないことって言うのは特に無いと書き添えておきます。
C++で便利になることはありますが、それは使いこなしてこそです。

● 読み物として、これも読んでみてください。
「(OOP == C++) ではない」
http://www.curiocube.com/mikata/oop/p3_ch08_oopcpp.php

【追記】
そういえば、じゃんけんゲームは挑戦しましたか?
これがスラスラっと作れないとするとプログラミングの入り口で迷っている段階かもしれません。
もしそうなら、C++の前にこのぐらいはスラスラっと書けるようになっておいたほうが私は良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lawliet

Re: 2冊めの本について

#26

投稿記事 by Lawliet » 6年前

読み物まで紹介していただきありがとうございます。

じゃんけんゲームは製作中です。
3回勝利か負けかで決着を付けるようにしました。しかし、勝敗の数をカウントする変数が変化せずに困っています。
グローバル変数にすればいいのですが、
「グローバル変数にするとよいもの」と「そうでないもの」の見分け方というのはどういったものでしょうか?

CからC++に行くとしておすすめの書籍はありますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#27

投稿記事 by softya(ソフト屋) » 6年前

> 「グローバル変数にするとよいもの」と「そうでないもの」の見分け方というのはどういったものでしょうか?

基本的には、しないほうが良いです。
基本参照だけならグローバルにしても良い物もあります。
大抵は戻り値の使い方や関数分割の設計が悪いので、グラーバル化したくなりますね。
どうしようもないものってもたまにありますが。それでも隠蔽する方法はいくつかあります。

> CからC++に行くとしておすすめの書籍はありますか?

一冊で済むとは思えませんが、「ロベールのc++入門講座」なんかどうでしょうか。
「ロベールのC++教室」 サイトもあります。
http://www7b.biglobe.ne.jp/~robe/cpphtml/
C言語の復習みたいなこともする事になると思いますが、勉強になると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lawliet

Re: 2冊めの本について

#28

投稿記事 by Lawliet » 6年前

すみません、じゃんけんゲームが完成したんですが、少し質問があります。
ここで質問するようなことではありませんが聞いてください

コード:

/*
	じゃんけんゲーム
*/
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable : 4996)	//scanf関数の警告を解除

typedef enum {
	end, rock , scissors, paper,rule
	//終了、グー、チョキ、パー、ルール
} rsp;

void print_rule(void)
{
	printf( "-ルール----------------------------\n"
			"先に3勝すると勝ちです\n"
			"先に3敗すると負けです\n"
			"\n"
			"終わりたかったら   「0」\n"
			"グー を出したかったら「1」\n"
			"チョキを出したかったら「2」\n"
			"パー を出したかったら「3」\n"
			"ルールを表示     「4」\n"
			"と入力してください\n"
			"-----------------------------------\n");
}

//WIN = 1, LOSE = 2, 引き分け = 0
int winorlose(rsp mine, rsp aite)
{
	int re;

	if(mine == rock){

		if(aite == rock){//グー
			re = 0;
		}
		else if(aite == scissors){//チョキ
			re = 1;
		}
		else{//パー
			re = 2;
		}
	}
	else if(mine == scissors){//チョキ

		if(aite == rock){//グー
			re = 2;
		}
		else if(aite == scissors){//チョキ
			re = 0;
		}
		else{//パー
			re = 1;
		}
	}
	else{//パー

		if(aite == rock){//グー
			re = 1;
		}
		else if(aite == scissors){//チョキ
			re = 2;
		}
		else{//パー
			re = 0;
		}
	}

	return re;
}

void play_janken(rsp *command, int *win, int *lose)
{
	rsp aite; //相手の手の変数

	printf("最初はグー ジャンケン:");
	do{
		scanf("%d", command);

		if( !(*command >= 0 && *command <= 4) )
			printf("\aもう一回入力してください\n");
	}while( !(*command >= 0 && *command <= 4) );

	switch( *command ){
		case 0:
			*command = end;
			break;

		case 1:
		case 2:
		case 3:
			//相手の手の決定
			aite = (rsp)(rand() % 3 + 1);
			
			printf("ポン\n");

			//============================
			//〇〇 VS 〇〇と出力
			//============================
			if(*command == rock)
				printf("グー VS ");
			else if(*command == scissors)
				printf("チョキ VS ");
			else
				printf("パー VS ");

			if(aite == rock)
				printf("グー\n");
			else if(aite == scissors)
				printf("チョキ\n");
			else
				printf("パー\n");
			//============================
			//============================

			if ( winorlose(*command, aite) == 1){
				printf("あなたの勝ちです\n");
				*win += 1;
			}else if( winorlose(*command, aite) == 2){
				printf("あなたの負けです\n");
				*lose += 1;
			}else{
				printf("あいこです\n");
			}
			break;

		case 4:
			print_rule();
			break;
	}
}

int main(void)
{
	int win = 0, lose = 0;
	int count = 0;
	rsp command = rule;

	printf( "===================================\n"
			"じゃんけんゲーム\n"
			"\n");
	print_rule();
	printf(	"===================================\n");

	for(count = 1;(win < 3) && (lose < 3) && (command != end); count++){
		printf( "\n"
				"_______________________________\n"
				"第%d回戦目です\n"
				"\n",count);

		play_janken(&command, &win, &lose);
		
		printf( "-----------\n"
				"%d勝%d敗\n"
				"-----------\n"
				"_______________________________\n"
				, win, lose);
	}

	if(win >= 3)
		printf("YOU WIN\n");
	else if(lose >= 3)
		printf("YOU LOSE\n");
	else
		printf("終了しました\n");

	return 0;
}
この中のplay_janken関数内の最後の方に「*win += 1」と「*lose += 1」という部分がありますが
それぞれ「*win++」「*lose++」とかくと1がたされませんでした。 なぜでしょうか?

それとこのコードについて少しコメントしていただけますでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 2冊めの本について

#29

投稿記事 by softya(ソフト屋) » 6年前

>この中のplay_janken関数内の最後の方に「*win += 1」と「*lose += 1」という部分がありますが
>それぞれ「*win++」「*lose++」とかくと1がたされませんでした。 なぜでしょうか?

それは優先順位の問題ですね。
「BohYoh.com【C言語講座】演算子一覧表」
http://www.bohyoh.com/CandCPP/C/operator.html
++が*よりも優先されるので、*(win++)と同じです。つまり何も起きません。
(*win)++と書けば目的の動作をするでしょう。
こういう場合、優先順位を忘れるとか曖昧な記憶になることも多いので、わかりやすく()を付けておくことをおすすめします。

> それとこのコードについて少しコメントしていただけますでしょうか?

始めてにしては中々よく出来ていると思いますよ。
コメントも今後のための改良点や注意点程度となります。

・if()などの{}を使わない書き方を多用してますがバグの原因になりやすいので、よほど分かりやすい場合を除いて使わないくせを付けたほうが良いと思います。
・win/loseは結果を戻り値にすれば、ポインタ参照にする必要はありませんね。
・戻り値の定義にenumを使いましょう。
・グー、チョキ、パーで配列に名前テーブルを作ると表示が簡単になります。
・上と同様に2次元配列で勝敗テーブルを作ると余分なcaseを無くすことができて条件判断を無くすことができます。

あと、ゲームルールの方ですが、どっちの手か分かりづらいのでCPUとか人間とかも表示してくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1550
登録日時: 6年前

Re: 2冊めの本について

#30

投稿記事 by usao » 6年前

まとまっていて良いのではないでしょうか.
CPUの手が毎回同じ順で出てくるようならsrand()をmain()の先頭あたりに入れておくとよいかと思います.

>・win/loseは結果を戻り値にすれば、ポインタ参照にする必要はありませんね。
commandも引き渡す必要はないですね.
main()側でプレイヤが出した手が何だったのかという情報を使わないので.

#かなーりどうでもいいことですが,個人的には
 ジャンケン… → ポン!
 YOU WIN!!
のように表示したいところ.(可能な範囲で演出にもこだわるw)

閉鎖

“C言語何でも質問掲示板” へ戻る