- ベストアンサー
授業で、C言語でゲームを作らなくてはいけなくて、
オセロを作ろうと思っているのですが、 途中までしかできなくて、どこまで合ってるかもわからなくなり、 どうしたらいいのかわからなくなりました(苦笑) 途中まで載せようかと思ったのですが、 文字数が足りなくて… http://catprettyw.bbs.fc2.com/ ここに貼ろうと思うので、改善するべきところ、 ●、○をどうやってあらわせばいいのかを教えてください! よろしくお願いします!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> lcpadというフリーソフトを使ってます。でもコンパイラだから違うんですよね・・・ lcpadはコンパイラにLSI-Cを使用しますので、LSI-Cでコンパイルしていることに なりますね。 掲示板の方に、コンパイルが通るように修正したものを貼りつけておきました。 私はgccというコンパイラで確認したので、LSI-Cで何かエラーが出るかもしれませんが。 とりあえず、交互に打って盤面に●と○が置けるところまでの修正です。 縦判定はまだバグがあり、斜め判定は未調査です。 新しいソース貼っておられたのに気がつかず、古いのをベースに修正しちゃいました。 すんません。 プログラムを書くときの助言をひとつ。 小さくプログラムを書いてコンパイルして、動作を確認し、また少し書き足して コンパイルして動作を確認、といった感じで作業していくとエラーが限定的になるので おすすめです。 例えば、 ・白と黒の打つ場所を交互に入力出来る部分を作る。-> 動作確認 ・打ったあと盤面を表示できるようにする。-> 動作確認 ・反転判定を追加する。-> 動作確認 といった形で、順を追って実装するといった感じです。 あと、知ってるかもしれませんが、未実装部分を指摘しておきます。 ・初期状態で白石と黒石が置かれていない ・どこにでも(石がある場所にも)石を置けてしまう ・横方向の反転判定がない ・終了判定がない 質問者様が修正されたコードもちょっと見てみました。 まず、関数名にスペースを含めることはできません。 一般的にはwhite_questのようにアンダースコアを入れるか、 whiteQuestのように2語目を大文字にすることが多いです。 あと、英語にすることで余計混乱されたとのことですが、 学習が目的ですので無理にまで英語にする必要はないと 思います。 将来お仕事で書かれる場合、徐々に英語表記に変えていくといった 感じでいいと思います。 一般的にプログラムで使われる英単語って、ある程度決まってるんですよ。 座標を表す場合には、designateではなくlocateやpoint、もしくはx,yなど。 この辺はライブラリのAPIとかを使ってるうちに自然に身につくと思います。 英語化については言葉が足りませんでした。 ごめんなさい。
その他の回答 (2)
- jjk65536
- ベストアンサー率59% (66/111)
改善すべきところを指摘します。 ・グローバル変数を極力使わないようにする 特にこのプログラムではグローバル変数とローカル変数で同名のものが存在し、 誤解を生みやすい(=バグが混入しやすい)状況になっています。 white()関数内のx変数とか、グローバルである必要がないものは極力ローカル変数に しましょう。 ・変数名を理解できる名前にする 変数名がすべてアルファベット1文字では、読む側は暗号文を読んでいるようなものです。 この「読む側」とは、数日後のあなたも含まれます。きっと分からなくなると思いますよ。 ループカウンタのi,j,kなど1文字でも分かる例外がありますが、それ以外には意味のある 変数名を付けてあげてください。 ・コメントを書く たくさん書くと読みにくくなってしまうので難しいテーマですが、ひとつもコメントがない というのはどうかと思います。 たとえば、tatew()関数が何をする関数かコメントで書いてあると、読む側は非常に 読みやすくなります。 (これについては、tatew()関数が何をする関数か名前から連想できないのが原因ですが。) ・重複する処理は関数化する for (j = 1; j <= 6; j++) {で始まるループは、現在の盤面を出力していると思いますが、 まったく同じ処理が3箇所登場しています。適切な名前を付けて関数化することで、 可読性がグッと上がります。 授業で、って書いてあるんで、この変な作法は先生が教えたんでしょうかね。 個人的にはローマ字の関数もおススメしません。これには賛否あるかもしれませんが。 最初tatew()を見て「タテゥー関数ってなんだ??」って思いましたよ。
補足
授業で、変数名は必ずA、B、Cとかアルファベット1文字しか使ってませんでした。詳しく、直すところを書いてくださってありがとうございます!! 関数の書き方・・・すみません; 適当にやっていたもので、私にしか理解できなくなってました。 言われたところを手直ししてみます!
- jjk65536
- ベストアンサー率59% (66/111)
とりあえず、main関数内のdo - while文の中で、;が抜けてますよね。 これじゃコンパイルも通らないんじゃない? あと、printf("%d ", ○);もコンパイルエラーですね。 printf("%s ", "○");またはprintf("○ ");だと思います。 きっと、コンパイルエラーがいっぱい出て困って相談に来られたんだと 思いますが、エラー一つ一つを見ていけば、ご自身で解決できるものも あるんじゃないですか? 定義されていないJを参照している箇所など、簡単でしょ。 まずは落ち着いて一つ一つエラーを解決し、コンパイルが通った上で 動作を見て、不明な点を整理されたほうが良いかと思います。 ちなみにコンパイラは何を使われています?
補足
コンパイラ・・・どこで見ればいいのでしょうか? すみません、初めて色々やったもので、基本的なこともあまりよくわかってないんです; lcpadというフリーソフトを使ってます。でもコンパイラだから違うんですよね・・・
お礼
おおお!!こんな詳しくありがとうございます!! 少しずつコンパイル…はじめて聞きました。 これからそうします!! 色々勉強になりました!! 本当にありがとうございました!!