2冊めの本について
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
読み終えたのか、書かれたことを全部実行してみたのかでは大分差がありますが如何でしょうか?
あと練習問題は全部できましたか?
>とりあえず、最終的にはゲームを作りたいと思っているので、
>C++の本か、ゲームの作り方の本、
>それとも
>C言語のことをもっと掘り下げた本か、
言語はプログラミングの全てではないので、実際にプログラム組んでみることが大切です。
なので、ゲーム作りをごく簡単なものからはじめてはどうでしょうか?
たとえば、じゃんけんゲームや三目並べです。これらはコンソールアプリとして作ることもできます。
もし、足を踏み出せないのなら「明解C言語入門編」に書かれていたことが自分の身についていない可能性もあります。
グラフィックが無いと嫌と言うのなら、ここの「ゲームプログラミングの館」から始めても良いでしょう。
本に関しては、必要に感じたら探せば良いと思います。細かいことを聞いてもらえば紹介もできます。
ただ、言語を幾ら覚えてもアプリやゲームは組めないのです。これを覚えておいてください。
私の経験からすれば、言語の文法は必要な知識の十分一以下です。つまり、さっさと次に移らないと何も出来ないよって事ですね。
あと練習問題は全部できましたか?
>とりあえず、最終的にはゲームを作りたいと思っているので、
>C++の本か、ゲームの作り方の本、
>それとも
>C言語のことをもっと掘り下げた本か、
言語はプログラミングの全てではないので、実際にプログラム組んでみることが大切です。
なので、ゲーム作りをごく簡単なものからはじめてはどうでしょうか?
たとえば、じゃんけんゲームや三目並べです。これらはコンソールアプリとして作ることもできます。
もし、足を踏み出せないのなら「明解C言語入門編」に書かれていたことが自分の身についていない可能性もあります。
グラフィックが無いと嫌と言うのなら、ここの「ゲームプログラミングの館」から始めても良いでしょう。
本に関しては、必要に感じたら探せば良いと思います。細かいことを聞いてもらえば紹介もできます。
ただ、言語を幾ら覚えてもアプリやゲームは組めないのです。これを覚えておいてください。
私の経験からすれば、言語の文法は必要な知識の十分一以下です。つまり、さっさと次に移らないと何も出来ないよって事ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
提示されたコードは実行せず頭のなかだけで理解しようとしていた部分が結構ありました。
練習問題はできないところも少しありましたがとりあえずはすべての問題に手を付けました。
なのでひと通りはできると思いますが・・・
2冊めを探したいというのは、
「簡単なゲーム」といっても何を作ったらいいのかわからないからです。(アイディアが出ないということです)
なので本があれば提示してくれるため学習がスムーズに行くと考えたためです。
本について「細かいこと」とは例えばどんなことを言えばいいのでしょうか?
練習問題はできないところも少しありましたがとりあえずはすべての問題に手を付けました。
なのでひと通りはできると思いますが・・・
2冊めを探したいというのは、
「簡単なゲーム」といっても何を作ったらいいのかわからないからです。(アイディアが出ないということです)
なので本があれば提示してくれるため学習がスムーズに行くと考えたためです。
本について「細かいこと」とは例えばどんなことを言えばいいのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
それは危険なワナかもしれないですね。Lawliet さんが書きました:提示されたコードは実行せず頭のなかだけで理解しようとしていた部分が結構ありました。
練習問題はできないところも少しありましたがとりあえずはすべての問題に手を付けました。
なのでひと通りはできると思いますが・・・
2冊めを探したいというのは、
「簡単なゲーム」といっても何を作ったらいいのかわからないからです。(アイディアが出ないということです)
なので本があれば提示してくれるため学習がスムーズに行くと考えたためです。
そのものズバリなサンプルがないと何も作れないという人が良くいらっしゅいますが、それは自分で考えることをして来なかったことで自分で抱かえこんでしまった問題です。
こうなると、そこからの脱出はかなり難しくなります。なので、自分で考えることが何より大事です。
あと、最初から難しいものを考え過ぎと言うのもあります。
最初にも書いた通り、コンソールのじゃんけんゲームぐらいは「明解C言語入門編」の問題が出来るなら作れるはずです。
なので、そのぐらいから始めるのが吉だと思います。
子供の頃遊んだ素朴な七並べなどのトランプとか結構難しいですよ。
ポインタが分からないとか、アルゴリズムを勉強したいとか、あとenumがちょっととか、構造体が上手く使えませんとか、の細かい話です。Lawliet さんが書きました: 本について「細かいこと」とは例えばどんなことを言えばいいのでしょうか?
【追記】
あとゲームのアイデアの出し方を本に求めるのは間違いですよ。実装方法のサンプルさえ少ないです。自分で考えるのが先決ですよ。
参考になるか分かりませんが猫Cです。
「C言語編INDEX」
http://www.kumei.ne.jp/c_lang/index_c.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
ヒットアンドブローとかも定番ですね。
配列使ったり文字列使ったりいろんな書き方ができるので面白いと思いますけど。
配列使ったり文字列使ったりいろんな書き方ができるので面白いと思いますけど。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
例えば、こういう練習問題もあります。
「C言語 練習プログラム集」
http://akabas.net/(S(mlrkxl451pmm1z45zl ... CTask.aspx
ルールだけを見て組んでみてください。
「C言語 練習プログラム集」
http://akabas.net/(S(mlrkxl451pmm1z45zl ... CTask.aspx
ルールだけを見て組んでみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
自分で考えるということをしっかり念頭に置いてやっていきたいと思います。
確かに「サンプルがなければ作れない」というのは良くないことですので・・・
ご提示してくださったゲームなど簡単なものから並行してやっていこうと思います。
本につてですが、
特にここを勉強したいとかはないので全般的なことをやりたいと思っています。
なので同じ著者の「明解C言語 中級編」や
評判がよさそうな「C実践プログラミング 第3版」なんかがいいかと思うのですがどう思いますか?
あと、cからc++に移行するにはどのタイミングがいいと思いますか?
確かに「サンプルがなければ作れない」というのは良くないことですので・・・
ご提示してくださったゲームなど簡単なものから並行してやっていこうと思います。
本につてですが、
特にここを勉強したいとかはないので全般的なことをやりたいと思っています。
なので同じ著者の「明解C言語 中級編」や
評判がよさそうな「C実践プログラミング 第3版」なんかがいいかと思うのですがどう思いますか?
あと、cからc++に移行するにはどのタイミングがいいと思いますか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
> 確かに「サンプルがなければ作れない」というのは良くないことですので・・・
いえ、はっきり言って必要なサンプルなど落ちている可能性は殆ど無いので現実問題としては作れないんです。
>なので同じ著者の「明解C言語 中級編」や評判がよさそうな「C実践プログラミング 第3版」なんかがいいかと思うのですがどう思いますか?
ゲームだと殆ど関係無さそうですね。決めるのはLawlietさんですけど。
> あと、cからc++に移行するにはどのタイミングがいいと思いますか?
いつでも構いませんが、C++は魔法ではないので劇的に凄いことがすぐ出来るわけではありません。
必要ないならC++に移ることさえ不要なんですよ、
いえ、はっきり言って必要なサンプルなど落ちている可能性は殆ど無いので現実問題としては作れないんです。
>なので同じ著者の「明解C言語 中級編」や評判がよさそうな「C実践プログラミング 第3版」なんかがいいかと思うのですがどう思いますか?
ゲームだと殆ど関係無さそうですね。決めるのはLawlietさんですけど。
> あと、cからc++に移行するにはどのタイミングがいいと思いますか?
いつでも構いませんが、C++は魔法ではないので劇的に凄いことがすぐ出来るわけではありません。
必要ないならC++に移ることさえ不要なんですよ、
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
> 確かに「サンプルがなければ作れない」というのは良くないことですので・・・
いえ、はっきり言って必要なサンプルなど落ちている可能性は殆ど無いので現実問題としては作れないんです。
>なので同じ著者の「明解C言語 中級編」や評判がよさそうな「C実践プログラミング 第3版」なんかがいいかと思うのですがどう思いますか?
ゲームだと殆ど関係無さそうですね。決めるのはLawlietさんですけど。
> あと、cからc++に移行するにはどのタイミングがいいと思いますか?
いつでも構いませんが、C++は魔法ではないので劇的に凄いことがすぐ出来るわけではありません。
必要ないならC++に移ることさえ不要なんですよ、
いえ、はっきり言って必要なサンプルなど落ちている可能性は殆ど無いので現実問題としては作れないんです。
>なので同じ著者の「明解C言語 中級編」や評判がよさそうな「C実践プログラミング 第3版」なんかがいいかと思うのですがどう思いますか?
ゲームだと殆ど関係無さそうですね。決めるのはLawlietさんですけど。
> あと、cからc++に移行するにはどのタイミングがいいと思いますか?
いつでも構いませんが、C++は魔法ではないので劇的に凄いことがすぐ出来るわけではありません。
必要ないならC++に移ることさえ不要なんですよ、
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
それを決めるのもLawlietさんだと思いますよ。Lawliet さんが書きました:と言うことは、もうゲームの方に行ってもいいということでしょうか?ゲームだと殆ど関係無さそうですね。決めるのはLawlietさんですけど。
個人的には,ゲームを作るからといってゲーム作りだけを勉強するのではなく,他の知識も同時に勉強していけばよいと思っていますが。
# 設計なども知らないと規模が大きくなると簡単に破綻しますし。
既に出ている「じゃんけん」「三目並べ」「ヒットアンドブロー」などを,一度今の知識だけで作ってみるとよいとは思います。
ネット上に大量のサンプルがあるとは思いますが,それらを見ずに作って下さい。
じゃんけんの勝敗の決定だけでも,最初は苦労すると思いますよ。
オフトピック
難易度はじゃんけんが一番やさしくて三目並べが一番難しいかなぁ。
- じゃんけんは状態を持たない (その時の入力のみで結果が出る)
- ヒットアンドブローは状態が固定 (「正解」が一度決まるとそれが変化しない)
- 三目並べ (tic-tac-toe) は入力のたびに状態が変化する
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
同じ著者の方ならデータ構造とアルゴリズムは勉強したほうが良いと思いますけどね。
「C実践プログラミング」とか組みながら読まないと実感できないと思います。
つまり、実践→読む→実践です。経験しないと身につかない事が多いで実践を初めましょう。
しばらくしたら、良い設計などの本にも手を出してみましょう。
「C実践プログラミング」とか組みながら読まないと実感できないと思います。
つまり、実践→読む→実践です。経験しないと身につかない事が多いで実践を初めましょう。
しばらくしたら、良い設計などの本にも手を出してみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
そうですね「〇〇あるある」ってその「〇〇」をやっていないと実感できないことですもんね。
同じ著者の本で行くとした場合「中級編」か「データ構造とアルゴリズム」はどちらのほうがためになると思いますか?
後々はアルゴリズムなども勉強したいと思っているんですが
今(入門書を読み終わった段階)がタイミング的にいいのでしょうか、
それとももっと別のことをやったほうがいいと思いますか?
僕個人としては正直どっちを選んだらよいか全く見当がつきません。
同じ著者の本で行くとした場合「中級編」か「データ構造とアルゴリズム」はどちらのほうがためになると思いますか?
後々はアルゴリズムなども勉強したいと思っているんですが
今(入門書を読み終わった段階)がタイミング的にいいのでしょうか、
それとももっと別のことをやったほうがいいと思いますか?
僕個人としては正直どっちを選んだらよいか全く見当がつきません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
私は、上にも書いた通り「データ構造とアルゴリズム」押しです。
ただ、アルゴリズムは、ネットでも情報はあるんで無理して買う必要もないとは思います。
「中級編」は内容を見て、どうしても必要だと思えば買えば良いと思います。
一応、数当てゲームやじゃんけんゲームも載っています。 自分でプログラム化出来ないと言うのなら読んでみるのも方法かもしれません。
「BohYoh.com【著書】新版明解C言語中級編《本文》」
http://www.bohyoh.com/Books/MeikaiC02/body.html
これをやったら他のことも出来るように成るかと言うのは私には何とも言えません。「中級編」は無くても何とか成るとはすごく思いますけどね。
ただ、アルゴリズムは、ネットでも情報はあるんで無理して買う必要もないとは思います。
「中級編」は内容を見て、どうしても必要だと思えば買えば良いと思います。
一応、数当てゲームやじゃんけんゲームも載っています。 自分でプログラム化出来ないと言うのなら読んでみるのも方法かもしれません。
「BohYoh.com【著書】新版明解C言語中級編《本文》」
http://www.bohyoh.com/Books/MeikaiC02/body.html
これをやったら他のことも出来るように成るかと言うのは私には何とも言えません。「中級編」は無くても何とか成るとはすごく思いますけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
「中級編」は内容を見て、どうしても必要だと思えば買えば良いと思います。
わかりました。「中級編」は無くても何とか成るとはすごく思いますけどね。
話が少し変わるのですが
ゲームを作るにあたってはC++のほうがCよりも便利だと聞きました。
どんなところが便利でしょうか?
それとC++に行くよりもやはり実践でしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
C言語のほうが便利というより簡単なだけです。
C++に行くのはそれなりに学習コストが高いので、挫折する可能性が高くなるわけです。
ゲームを作るのが目的なら、無理してC++勉強しなくて良いんじゃないの?って話ではあるわけです。
>それとC++に行くよりもやはり実践でしょうか?
道具であるプログラミング言語を覚えるのは、本来蛇足であり本筋と別のことです。
やりたいのはゲームを作る事で、言語を覚えることではないはずですよね?
なので、プロのゲームプログラマーを目指していて、時間的な余裕があと2,3年程度しかないなら急いで覚えた方が良いと思います。
それ以外の場合は、覚えたいときに覚えたら良いのでご自分で決めてください。
急いで覚える必要もないですが、ゲーム作るよりも言語学習が好きなら覚えても良いと思います。
ただ、ゲームを作るということには、一歩も近づかない行為であることは確かです。
しかし、C言語の手続き指向の癖がオブジェクト指向の学習の邪魔をするという説も有るので、ちゃっちゃと行ってしまうのも手ではあります。
なんにしても、決めるのはLawlietさんですね。
C++に行くのはそれなりに学習コストが高いので、挫折する可能性が高くなるわけです。
ゲームを作るのが目的なら、無理してC++勉強しなくて良いんじゃないの?って話ではあるわけです。
>それとC++に行くよりもやはり実践でしょうか?
道具であるプログラミング言語を覚えるのは、本来蛇足であり本筋と別のことです。
やりたいのはゲームを作る事で、言語を覚えることではないはずですよね?
なので、プロのゲームプログラマーを目指していて、時間的な余裕があと2,3年程度しかないなら急いで覚えた方が良いと思います。
それ以外の場合は、覚えたいときに覚えたら良いのでご自分で決めてください。
急いで覚える必要もないですが、ゲーム作るよりも言語学習が好きなら覚えても良いと思います。
ただ、ゲームを作るということには、一歩も近づかない行為であることは確かです。
しかし、C言語の手続き指向の癖がオブジェクト指向の学習の邪魔をするという説も有るので、ちゃっちゃと行ってしまうのも手ではあります。
なんにしても、決めるのはLawlietさんですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
触ったことがないのでわかりませんが、手続き型とオブジェクト指向は結構方向性が違うのでしょうか?C言語の手続き指向の癖がオブジェクト指向の学習の邪魔をするという説も有るので、ちゃっちゃと行ってしまうのも手ではあります。
そしてこれからはやはりオブジェクト指向が主流になってくるのでしょうか・
Re: 2冊めの本について
ゲームに限らないと思いますけど…Lawliet さんが書きました:ゲームを作るにあたってはC++のほうがCよりも便利だと聞きました。
どんなところが便利でしょうか?
コードを再利用のためにまとめることや、再利用がしやすくなります。
複数のパートに分けて作業しやすくなります。
ただしそういう意志でコードを書かないとメリットはありません。
C言語よりC++のほうが手間を掛けた分のリターンが大きく、より開発効率の向上を見込めます。
このサイトにある龍神録くらいのゲームを2,3本作るとメリットを感じられるのではないでしょうかね。
Re: 2冊めの本について
オブジェクト指向の処理系を使いたいのか、オブジェクト指向な設計をしたいのか、オブジェクト指向な実装をしたいのか、どれなのでしょう。Lawliet さんが書きました:そしてこれからはやはりオブジェクト指向が主流になってくるのでしょうか・
「オブジェクト指向」という言葉の響きに惹かれているだけなら気にする必要はないですし気にしたところでいまは何もできないと思います。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
>Lawlietさん そしてこれからはやはりオブジェクト指向が主流になってくるのでしょうか・
>ISLeさん オブジェクト指向の処理系を使いたいのか、オブジェクト指向な設計をしたいのか、オブジェクト指向な実装をしたいのか、どれなのでしょう。
既に主流ではあると思います。 → 「オブジェクト指向の処理系」としてですが。
ただし、学習コスト(難易度)が高いので初学者がC++をメインにしている学校は少ないです。 → 「オブジェクト指向の処理系」です。
Javaなどの方が仕様がC++ほど複雑怪奇じゃないので、オブジェクト指向の学習に集中できるためオブジェクト指向の入門としては向いていると言われています。
→ ここだけは「オブジェクト指向な実装」の学習についてです。
> ゲームを作るにあたってはC++のほうがCよりも便利だと聞きました。
ぼけていたのか私の回答が変ですね。
C++をちゃんと「オブジェクト指向な実装」を使いこなせばバグは減り生産性は高くなります。
ただし、それが出来るように成るのにISLeさんも書いている様にそこそこの経験が必要です。
つまり、メリットを実感として感じれるのは大分先ということです。
それに、かなりC++の良いところを意識し書かないと、「オブジェクト指向な実装」が出来ずに何時まで経ってもベターC(便利なC)止まりか生産性が悪化します。
>ISLeさん オブジェクト指向の処理系を使いたいのか、オブジェクト指向な設計をしたいのか、オブジェクト指向な実装をしたいのか、どれなのでしょう。
既に主流ではあると思います。 → 「オブジェクト指向の処理系」としてですが。
ただし、学習コスト(難易度)が高いので初学者がC++をメインにしている学校は少ないです。 → 「オブジェクト指向の処理系」です。
Javaなどの方が仕様がC++ほど複雑怪奇じゃないので、オブジェクト指向の学習に集中できるためオブジェクト指向の入門としては向いていると言われています。
→ ここだけは「オブジェクト指向な実装」の学習についてです。
> ゲームを作るにあたってはC++のほうがCよりも便利だと聞きました。
ぼけていたのか私の回答が変ですね。
C++をちゃんと「オブジェクト指向な実装」を使いこなせばバグは減り生産性は高くなります。
ただし、それが出来るように成るのにISLeさんも書いている様にそこそこの経験が必要です。
つまり、メリットを実感として感じれるのは大分先ということです。
それに、かなりC++の良いところを意識し書かないと、「オブジェクト指向な実装」が出来ずに何時まで経ってもベターC(便利なC)止まりか生産性が悪化します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
具体的にはどのようにして再利用するのでしょうか?ISLe さんが書きました: ゲームに限らないと思いますけど…
コードを再利用のためにまとめることや、再利用がしやすくなります。
複数のパートに分けて作業しやすくなります。
C言語でも関数とか再利用できると思いますが・・・・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
オブジェクトは1つの動作要素ですので、これがちゃんと作られている場合においては他のオブジェクトと独立して利用可能になります。
つまり、敵処理がほしいなぁ。そうだ!!前作ったゲームの敵処理のオブジェクトをベースに使おう!って事で解決できることが有るわけです。
C言語でも、ちゃんと作れば同じ様なことは可能です。この独立性が高いというのが結構難題なんですけどね。
まぁ、敵処理よりはBGM管理とか下回りの処理ぐらいしか使いまわさない可能性は高いですけどね。それでも助かるのです。
つまり、敵処理がほしいなぁ。そうだ!!前作ったゲームの敵処理のオブジェクトをベースに使おう!って事で解決できることが有るわけです。
C言語でも、ちゃんと作れば同じ様なことは可能です。この独立性が高いというのが結構難題なんですけどね。
まぁ、敵処理よりはBGM管理とか下回りの処理ぐらいしか使いまわさない可能性は高いですけどね。それでも助かるのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
C言語での関数の再利用は既存の実装を再利用することしかできません。Lawliet さんが書きました:具体的にはどのようにして再利用するのでしょうか?
C言語でも関数とか再利用できると思いますが・・・・
例えば派生クラスで仮想メンバ関数を実装することで実装を利用者側に委ねることができます。
フレームワークというゲームプログラムの中の仕組みそのものを再利用できます。
新しいゲームを作るときは、新しい要素をコーディングするだけで済むことになります。
このあたりはC++でスマートに記述できます。
同じことをC言語でやろうとすると泥臭くなってしまいます。
Re: 2冊めの本について
「決めるのは自分」と言われてしまえばそれでおしまいなのですが、
個人的な意見でいいですので
C++にはいつ頃移行していくと良いか、
と
C++よりもゲームプログラミングに行くか
この2つだけ答えてもらってもよろしいでしょうか?
いずれにせよ将来C++でやって行きたいと思っています。
個人的な意見でいいですので
C++にはいつ頃移行していくと良いか、
と
C++よりもゲームプログラミングに行くか
この2つだけ答えてもらってもよろしいでしょうか?
いずれにせよ将来C++でやって行きたいと思っています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
C++に行く前提ならC++に行ってみると良いと思います。
まだ、難しいとか、道のりが長くてやってられないと思ったらゲームプログラミングを始めてみれば良いと思います。
別に並行でやってもゲームプログラミングと被らない内容なので全然問題は無いのです。
とにかく、正解はないでこっちは勝手な提案ができるのみですから。
※ ちなみに私の経験は当てにならないです。時代的にC言語しか選択肢がなったので、C++かC言語かで悩む必要性もなかったです。
【補足】
ちなみに、ゲーム作りにおいてC++じゃないと出来ないことって言うのは特に無いと書き添えておきます。
C++で便利になることはありますが、それは使いこなしてこそです。
● 読み物として、これも読んでみてください。
「(OOP == C++) ではない」
http://www.curiocube.com/mikata/oop/p3_ch08_oopcpp.php
【追記】
そういえば、じゃんけんゲームは挑戦しましたか?
これがスラスラっと作れないとするとプログラミングの入り口で迷っている段階かもしれません。
もしそうなら、C++の前にこのぐらいはスラスラっと書けるようになっておいたほうが私は良いと思います。
まだ、難しいとか、道のりが長くてやってられないと思ったらゲームプログラミングを始めてみれば良いと思います。
別に並行でやってもゲームプログラミングと被らない内容なので全然問題は無いのです。
とにかく、正解はないでこっちは勝手な提案ができるのみですから。
※ ちなみに私の経験は当てにならないです。時代的にC言語しか選択肢がなったので、C++かC言語かで悩む必要性もなかったです。
【補足】
ちなみに、ゲーム作りにおいてC++じゃないと出来ないことって言うのは特に無いと書き添えておきます。
C++で便利になることはありますが、それは使いこなしてこそです。
● 読み物として、これも読んでみてください。
「(OOP == C++) ではない」
http://www.curiocube.com/mikata/oop/p3_ch08_oopcpp.php
【追記】
そういえば、じゃんけんゲームは挑戦しましたか?
これがスラスラっと作れないとするとプログラミングの入り口で迷っている段階かもしれません。
もしそうなら、C++の前にこのぐらいはスラスラっと書けるようになっておいたほうが私は良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
読み物まで紹介していただきありがとうございます。
じゃんけんゲームは製作中です。
3回勝利か負けかで決着を付けるようにしました。しかし、勝敗の数をカウントする変数が変化せずに困っています。
グローバル変数にすればいいのですが、
「グローバル変数にするとよいもの」と「そうでないもの」の見分け方というのはどういったものでしょうか?
CからC++に行くとしておすすめの書籍はありますか?
じゃんけんゲームは製作中です。
3回勝利か負けかで決着を付けるようにしました。しかし、勝敗の数をカウントする変数が変化せずに困っています。
グローバル変数にすればいいのですが、
「グローバル変数にするとよいもの」と「そうでないもの」の見分け方というのはどういったものでしょうか?
CからC++に行くとしておすすめの書籍はありますか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
> 「グローバル変数にするとよいもの」と「そうでないもの」の見分け方というのはどういったものでしょうか?
基本的には、しないほうが良いです。
基本参照だけならグローバルにしても良い物もあります。
大抵は戻り値の使い方や関数分割の設計が悪いので、グラーバル化したくなりますね。
どうしようもないものってもたまにありますが。それでも隠蔽する方法はいくつかあります。
> CからC++に行くとしておすすめの書籍はありますか?
一冊で済むとは思えませんが、「ロベールのc++入門講座」なんかどうでしょうか。
「ロベールのC++教室」 サイトもあります。
http://www7b.biglobe.ne.jp/~robe/cpphtml/
C言語の復習みたいなこともする事になると思いますが、勉強になると思います。
基本的には、しないほうが良いです。
基本参照だけならグローバルにしても良い物もあります。
大抵は戻り値の使い方や関数分割の設計が悪いので、グラーバル化したくなりますね。
どうしようもないものってもたまにありますが。それでも隠蔽する方法はいくつかあります。
> CからC++に行くとしておすすめの書籍はありますか?
一冊で済むとは思えませんが、「ロベールのc++入門講座」なんかどうでしょうか。
「ロベールのC++教室」 サイトもあります。
http://www7b.biglobe.ne.jp/~robe/cpphtml/
C言語の復習みたいなこともする事になると思いますが、勉強になると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
すみません、じゃんけんゲームが完成したんですが、少し質問があります。
ここで質問するようなことではありませんが聞いてください
この中のplay_janken関数内の最後の方に「*win += 1」と「*lose += 1」という部分がありますが
それぞれ「*win++」「*lose++」とかくと1がたされませんでした。 なぜでしょうか?
それとこのコードについて少しコメントしていただけますでしょうか?
ここで質問するようなことではありませんが聞いてください
/*
じゃんけんゲーム
*/
#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;
}
それぞれ「*win++」「*lose++」とかくと1がたされませんでした。 なぜでしょうか?
それとこのコードについて少しコメントしていただけますでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
>この中の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とか人間とかも表示してくださいね。
>それぞれ「*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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
まとまっていて良いのではないでしょうか.
CPUの手が毎回同じ順で出てくるようならsrand()をmain()の先頭あたりに入れておくとよいかと思います.
>・win/loseは結果を戻り値にすれば、ポインタ参照にする必要はありませんね。
commandも引き渡す必要はないですね.
main()側でプレイヤが出した手が何だったのかという情報を使わないので.
#かなーりどうでもいいことですが,個人的には
ジャンケン… → ポン!
YOU WIN!!
のように表示したいところ.(可能な範囲で演出にもこだわるw)
CPUの手が毎回同じ順で出てくるようならsrand()をmain()の先頭あたりに入れておくとよいかと思います.
>・win/loseは結果を戻り値にすれば、ポインタ参照にする必要はありませんね。
commandも引き渡す必要はないですね.
main()側でプレイヤが出した手が何だったのかという情報を使わないので.
#かなーりどうでもいいことですが,個人的には
ジャンケン… → ポン!
YOU WIN!!
のように表示したいところ.(可能な範囲で演出にもこだわるw)
Re: 2冊めの本について
コメントありがとうございました。
一つ質問があります。
>>戻り値の定義にenumを使いましょう。
どこにenumの戻り値を使うのでしょうか? すみません少しわからないです。
一つ質問があります。
>>戻り値の定義にenumを使いましょう。
どこにenumの戻り値を使うのでしょうか? すみません少しわからないです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
元のコードだとwinorloseの戻り値ですね。Lawliet さんが書きました:コメントありがとうございました。
一つ質問があります。
>>戻り値の定義にenumを使いましょう。
どこにenumの戻り値を使うのでしょうか? すみません少しわからないです。
その他改造を施したら、また別のenumが必要になりますけど。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
なるほど win lose drawn の列挙体を使えということですか。
少し戻るんですが、
>>・グー、チョキ、パーで配列に名前テーブルを作ると表示が簡単になります。
これをやるとどんなことがどんなふうに簡単になるのでしょうか?
少し戻るんですが、
>>・グー、チョキ、パーで配列に名前テーブルを作ると表示が簡単になります。
これをやるとどんなことがどんなふうに簡単になるのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
例えばですが、
を
で済ませられますね。
if( aite == rock )
printf( "グー\n" );
else if( aite == scissors )
printf( "チョキ\n" );
else
printf( "パー\n" );
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
コードは短ければ短いほど、条件式は少なければ少ないほどバグは減る傾向があります。Lawliet さんが書きました:なるほどそう実装するのですね。
僕はifでじゃんけんの手と1~3を比較することばかり考えていたので
何がいいのか全くわかりませんでした。
なので、なるべく書かずに済ませたい所です。
ただ、余りテクニカルにすると他人が読めないくなる上に修正の時に面倒になります。
なので、ある程度のバランスの中で条件式とかをできるだけ書かずに済ませるとなると、配列を上手く使うという手になるわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
最初の目的からだいぶそれてしまいましたが、
それでもなおご丁寧に回答して下さりありがとうございました。
これからはゲームを作っていきつつ、C++の勉強をして行きたいと思います。
ありがとうございました。
それでもなおご丁寧に回答して下さりありがとうございました。
これからはゲームを作っていきつつ、C++の勉強をして行きたいと思います。
ありがとうございました。
Re: 2冊めの本について
アドバイスを元に完成させたじゃんけんゲームです。
もし見てくれた人がいたらアドバイスを下さい。
もし見てくれた人がいたらアドバイスを下さい。
/*
じゃんけんゲームVer.2
*/
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable : 4996) //scanf関数の警告を解除
typedef enum {
end, rock , scissors, paper,rule
//終了、グー、チョキ、パー、ルール
} rsp;
typedef enum {
drawn, win, lose
//引き分け、勝ち、負け
} job;
void print_rule(void)
{
printf( "-ルール----------------------------\n"
"先に3勝すると勝ちです\n"
"先に3敗すると負けです\n"
"\n"
"終わりたかったら 「0」\n"
"グー を出したかったら「1」\n"
"チョキを出したかったら「2」\n"
"パー を出したかったら「3」\n"
"ルールを表示 「4」\n"
"と入力してください\n"
"-----------------------------------\n");
}
job job_janken(rsp mine, rsp aite)
{
job list[5][5] = {//空、グー、チョキ、パー、空
/*空*/ {drawn},
/*グー*/ {drawn, drawn, win, lose, drawn},
/*チョキ*/ {drawn, lose, drawn, win, drawn},
/*パー*/ {drawn, win, lose, drawn, drawn},
/*空*/ {drawn}
};
return list[mine][aite];
}
void play_janken(rsp *command, int *win_count, int *lose_count)
{
char *JunkenString[5] = { "","グー","チョキ","パー","" };
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");
//============================
//あなた CPU
//〇〇 VS 〇〇と出力
//============================
printf("あなた CPU\n");
printf("%s VS ",JunkenString[*command] );
printf("%s\n",JunkenString[aite]);
//============================
//============================
if ( job_janken(*command, aite) == win){
printf("あなたの勝ちです\n");
(*win_count)++;
}
else if( job_janken(*command, aite) == lose){
printf("あなたの負けです\n");
(*lose_count)++;
}
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( "\n"
"=============\n"
"= -YOU WIN- =\n"
"=============\n"
" __________\n"
"(やったぜ!!> \(^o^)/\n"
"  ̄ ̄ ̄ ̄ ̄\n");
}
else if(lose >= 3){
printf( "\n"
"==============\n"
"= -YOU LOSE- =\n"
"==============\n"
" ____________\n"
"(負けちゃった> (つд⊂)エーン\n"
"  ̄ ̄ ̄ ̄ ̄ ̄\n");
}
else{
printf( "\n"
"終了しました\n");
}
return 0;
}
Re: 2冊めの本について
ただC++を文法レベルで覚えるよりも、作ったじゃんけんゲームのコードをとことん突き詰めていくほうが勉強になる気がします。
じゃんけんの手は3つしか無いのに勝敗表の配列が5x5というのは何かおかしいとは思いませんか?
こういうところを放っておくとまともな設計の感覚を失いますよ。
そうなるととうぜんC++をうまく使いこなすこともできません。
じゃんけんの手は3つしか無いのに勝敗表の配列が5x5というのは何かおかしいとは思いませんか?
こういうところを放っておくとまともな設計の感覚を失いますよ。
そうなるととうぜんC++をうまく使いこなすこともできません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
大分スッキリしたと思いますが、幾つか気になりますね。
ISLeさんの意見が、私がJunkenStringを分かりやすく[5]で定義したのが原因かな?とも思いますが(汗)
usaoさんのcommandに関しての意見がスルーされているのと、私のint *win_count, int *lose_countも戻り値にしたら引数不要ですよ。とか。
switch( *command ){
case 0:
ここだけenumが利用されていないのが気になるとかですかね。
あと配列を参照するだけなら、job_jankenは不要なのでは?
ISLeさんの意見が、私がJunkenStringを分かりやすく[5]で定義したのが原因かな?とも思いますが(汗)
usaoさんのcommandに関しての意見がスルーされているのと、私のint *win_count, int *lose_countも戻り値にしたら引数不要ですよ。とか。
switch( *command ){
case 0:
ここだけenumが利用されていないのが気になるとかですかね。
あと配列を参照するだけなら、job_jankenは不要なのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
>>usaoさんのcommandに関しての意見がスルーされているのと
main関数の
for(count = 1;(win < 3) && (lose < 3) && (command != end); count++){
ここでcommandを使っているのですが・・・
受け皿のrsp型の変数を用意とかすればできますがめんどくさくなりませんか?
>>int *win_count, int *lose_countも戻り値にしたら引数不要ですよ。
こちらの方も十の位にwinかloseの判断、
一の位に勝ち負けの数を入れればいけると思うけど複雑になりませんか?
それならばやはりポインタを使ったほうが簡単だと思いますが・・・
main関数の
for(count = 1;(win < 3) && (lose < 3) && (command != end); count++){
ここでcommandを使っているのですが・・・
受け皿のrsp型の変数を用意とかすればできますがめんどくさくなりませんか?
>>int *win_count, int *lose_countも戻り値にしたら引数不要ですよ。
こちらの方も十の位にwinかloseの判断、
一の位に勝ち負けの数を入れればいけると思うけど複雑になりませんか?
それならばやはりポインタを使ったほうが簡単だと思いますが・・・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
構造体戻り値って手もありますが、今回の場合はplay_jankenの引数を無くしてenum戻り値の引き分け、勝ち、負け、終了のバリエーションで処理できる気がするんですが如何でしょうか?
play_janken()は勝ち負け数を知る必要がないです。mainは逆に終了以外のcommand値は必要ありません。勝ち負け数と終了commandは同時に発生しません。
必要のない情報は出来るだけ狭い範囲に閉じ込めるやるのが分かりやすいプログラムにする事です。
ポインタ参照は便利ですが、ポインタですのでバグを考えれば使わないに越したこと無いのと、戻り値で処理したほうが分かりやすくなるはずです。
分かりやすいプログラムは結局バグが減ります。
と言う理由になります。
play_janken()は勝ち負け数を知る必要がないです。mainは逆に終了以外のcommand値は必要ありません。勝ち負け数と終了commandは同時に発生しません。
必要のない情報は出来るだけ狭い範囲に閉じ込めるやるのが分かりやすいプログラムにする事です。
ポインタ参照は便利ですが、ポインタですのでバグを考えれば使わないに越したこと無いのと、戻り値で処理したほうが分かりやすくなるはずです。
分かりやすいプログラムは結局バグが減ります。
と言う理由になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
コードを修正しました。
3つほど質問があります。
1つ目はplay_janken関数でmineが4(説明の表示)になった時に
返り値を返していないのにエラーにならないのはなぜですか?
また、このようなコードはやめたほうがいいですか?
2つ目で このコード、どうでしょうか?
3つ目です 話題がかなりそれているので新しいトピックとして立て直したほうがいいですか?
/*
じゃんけんゲーム
*/
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable : 4996) //scanf関数の警告を解除
typedef enum {
rock = 1, scissors, paper, rule, end_r
//グー、チョキ、パー、ルール、終了
} rsp;
typedef enum {
drawn, win, lose, end_j
//引き分け、勝ち、負け
} job;
void print_rule(void)
{
printf( "-ルール----------------------------\n"
"先に3勝すると勝ちです\n"
"先に3敗すると負けです\n"
"\n"
"グー を出したかったら「1」\n"
"チョキを出したかったら「2」\n"
"パー を出したかったら「3」\n"
"ルールを表示 「4」\n"
"終わりたかったら 「5」\n"
"と入力してください\n"
"-----------------------------------\n");
}
job play_janken(void)
{
char *JunkenString[3] = {"グー","チョキ","パー",};
//勝敗テーブル
job list[3][3] = {
/*グー、チョキ、パー*/
/*グー*/ {drawn, win, lose},
/*チョキ*/ {lose, drawn, win},
/*パー*/ {win, lose, drawn}
};
rsp mine; //自分の手の変数
rsp aite; //相手の手の変数
printf("最初はグー ジャンケン:");
do{
scanf("%d", &mine);
if( !(mine >= 1 && mine <= 5) )
printf("\aもう一回入力してください\n");
}while( !(mine >= 1 && mine <= 5) );
if( mine == 4){
print_rule();
}
else if(mine == 5){
//rspのend_rとjobのend_jの受け渡し
return end_j;
}
else{
//相手の手の決定
aite = (rsp)(rand() % 3 + 1);
printf("ポン\n");
//============================
//あなた CPU
//〇〇 VS 〇〇と出力
//============================
printf("あなた CPU\n");
printf("%s VS ",JunkenString[mine - 1] );
//配列の最初の添字は0だけどrockなどは1,2,3なので「-1」
printf("%s\n",JunkenString[aite - 1]);
//============================
//============================
if( (list[mine - 1][aite - 1]) == win){
printf("あなたの勝ちです\n");
}
else if( (list[mine - 1][aite - 1]) == lose){
printf("あなたの負けです\n");
}
return (list[mine - 1][aite - 1]);
}
}
int main(void)
{
int win = 0, lose = 0;
int count = 0;
int loopFLAG = 1;
printf( "===================================\n"
"じゃんけんゲーム\n"
"\n");
print_rule();
printf( "===================================\n");
for(count = 1;(win < 3) && (lose < 3) && (loopFLAG); count++){
printf( "\n"
"_______________________________\n"
"第%d回戦目です\n"
"\n",count);
switch( play_janken() ){
case 1:/*勝ち*/
win++;
printf( "-----------\n"
"%d勝%d敗\n"
"-----------\n", win, lose);
break;
case 2:/*負け*/
lose++;
printf( "-----------\n"
"%d勝%d敗\n"
"-----------\n", win, lose);
break;
case 3:/*終了*/
loopFLAG = 0;//フラグをオフにする
}
printf( "_______________________________\n");
}
if(win >= 3){
printf( "\n"
"=============\n"
"= -YOU WIN- =\n"
"=============\n"
" __________\n"
"(やったぜ!!> \(^o^)/\n"
"  ̄ ̄ ̄ ̄ ̄\n");
}
else if(lose >= 3){
printf( "\n"
"==============\n"
"= -YOU LOSE- =\n"
"==============\n"
" ____________\n"
"(負けちゃった> (つд⊂)エーン\n"
"  ̄ ̄ ̄ ̄ ̄ ̄\n");
}
else{
printf( "\n"
"終了しました\n");
}
return 0;
}
1つ目はplay_janken関数でmineが4(説明の表示)になった時に
返り値を返していないのにエラーにならないのはなぜですか?
また、このようなコードはやめたほうがいいですか?
2つ目で このコード、どうでしょうか?
3つ目です 話題がかなりそれているので新しいトピックとして立て直したほうがいいですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
> 1つ目はplay_janken関数でmineが4(説明の表示)になった時に
> 返り値を返していないのにエラーにならないのはなぜですか?
> また、このようなコードはやめたほうがいいですか?
配列参照でバグっているでしょう。
そもそも
if( mine == 4){
print_rule();
}
の時は、戻る必要はないと思います。入力ループに戻ってはどうでしょうか?
あるいは何もしないと言う戻り値を返すかです。
> 2つ目で このコード、どうでしょうか?
スッキリして来ました。まだ良くなるので、ポイントを説明します。
・end_rとend_jの命名がアレなので、もっと長い名前にしましょうか。最初のはcmd_rockとか、戻り値のはrtn_drawnとか分かりやすくなりますよね。
・play_jankenってよく考えたらcpuの処理もしちゃってますね。関数名に偽りありとなってしまうので、jankenで良いんじゃないでしょうか?
・job list[3][3] = {の値の位置を揃えたほうが見やすくなります。
・do{whileで2回同じ条件が出るのは手間とバグの元なので抜ける条件でbreakを使いましょうか。つまり、while(1 );のループになるってことです。
・mineの比較もenumの値を使って良いですよ。
・あなたの勝ちです/あなたの負けです表示もmainで良いかもしれません。そのほうが書くことが減りませんか?
・loopFLAGはbreak;で要らなくなると思います。
・switch( play_janken() ){でenum値を使い忘れています。
> 3つ目です 話題がかなりそれているので新しいトピックとして立て直したほうがいいですか?
そうですね。他の人のためにトピックを変えましょうか。トピックの新規作成をお願いします。
その場合は、新しいトピックでこのじゃんけんを開始したところにリンクを張って説明をお願いします。
↓これですね。
http://dixq.net/forum/viewtopic.php?f=3&t=13356#p107272
> 返り値を返していないのにエラーにならないのはなぜですか?
> また、このようなコードはやめたほうがいいですか?
配列参照でバグっているでしょう。
そもそも
if( mine == 4){
print_rule();
}
の時は、戻る必要はないと思います。入力ループに戻ってはどうでしょうか?
あるいは何もしないと言う戻り値を返すかです。
> 2つ目で このコード、どうでしょうか?
スッキリして来ました。まだ良くなるので、ポイントを説明します。
・end_rとend_jの命名がアレなので、もっと長い名前にしましょうか。最初のはcmd_rockとか、戻り値のはrtn_drawnとか分かりやすくなりますよね。
・play_jankenってよく考えたらcpuの処理もしちゃってますね。関数名に偽りありとなってしまうので、jankenで良いんじゃないでしょうか?
・job list[3][3] = {の値の位置を揃えたほうが見やすくなります。
・do{whileで2回同じ条件が出るのは手間とバグの元なので抜ける条件でbreakを使いましょうか。つまり、while(1 );のループになるってことです。
・mineの比較もenumの値を使って良いですよ。
・あなたの勝ちです/あなたの負けです表示もmainで良いかもしれません。そのほうが書くことが減りませんか?
・loopFLAGはbreak;で要らなくなると思います。
・switch( play_janken() ){でenum値を使い忘れています。
> 3つ目です 話題がかなりそれているので新しいトピックとして立て直したほうがいいですか?
そうですね。他の人のためにトピックを変えましょうか。トピックの新規作成をお願いします。
その場合は、新しいトピックでこのじゃんけんを開始したところにリンクを張って説明をお願いします。
↓これですね。
http://dixq.net/forum/viewtopic.php?f=3&t=13356#p107272
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2冊めの本について
すみません。もう一つ質問いいですか。
皆様は僕が考えもしなかった方法で工夫されたコードを提案されています。
そういったコードを思いつくコツはありますか?
それともやはり「慣れ」でしょうか?
皆様は僕が考えもしなかった方法で工夫されたコードを提案されています。
そういったコードを思いつくコツはありますか?
それともやはり「慣れ」でしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 2冊めの本について
経験ですね。自分で考えたのもあれば、オープンソースなど他人のコードから学んだこともあります。
ここの掲示板の回答を見ても経験者のコードは一味も二味も工夫されています。
そこを吸収できるほどコードは良くなっていくと思います。
肝心なことを真似できずに、表面だけ真似たコードになるのを見受けますが、工夫を見落として悪いコードになってしまっています。
ちょっとして事にも意味が有るので、なぜこう書いたか聞いてもらえれば成長するチャンスなのにと思います。
あとは自分のコードのリファクタリング(内部コードの整理)を心がけることです。
動いたらOKではなく、将来見ても分かるか、無駄なコードはないか、同じ様なコードが出てこないか常にチェックしましょう。
ここの掲示板の回答を見ても経験者のコードは一味も二味も工夫されています。
そこを吸収できるほどコードは良くなっていくと思います。
肝心なことを真似できずに、表面だけ真似たコードになるのを見受けますが、工夫を見落として悪いコードになってしまっています。
ちょっとして事にも意味が有るので、なぜこう書いたか聞いてもらえれば成長するチャンスなのにと思います。
あとは自分のコードのリファクタリング(内部コードの整理)を心がけることです。
動いたらOKではなく、将来見ても分かるか、無駄なコードはないか、同じ様なコードが出てこないか常にチェックしましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。