お疲れ様です。 はい。col_indexについて、今回は使いません。 boardを作成したときにrow_index、col_indexを利用したため、row_indexは横軸、col_indexは縦軸のイメージがあると思います。(それ自体は何も間違っていません。) しかし、これらのindexは、二重リストの中身を1つひとつ取り出すことに利用する値です。 勝利判定においては、縦、横、斜めのいずれかのグループの合計が3かどうか判定すれば良いため、二重リストの中身を1つひとつ丁寧に取り出す必要はありません。 もちろん、勝利判定の実装方法(アルゴリズム)は本動画で紹介した以外にも多くあります。 row_index、col_indexを利用して実装しても、間違いではありませんし、何も問題ありません。(そういう方法もあるんだなぁって感じ。もっと良い方法があったら教えてください。) しかし、row_index、col_indexを利用すると、for文の計算処理が基本的に9回行われます。 for row_index, row in enumerate(board): for col_index, col in enumerate(row): 〜9回計算〜 今回実装したrow_indexだけ利用する方法では、for文の計算回数は3回で済みます。 for row_index, row in enumerate(board): 〜3回計算〜 今回においては正直誤差ですが、少しでも計算回数を少なくしようとしています。 長くなりましたが、col_indexを利用してまで1つひとつ丁寧に要素を取り出す必要がないこと、計算回数を少なくするためにcol_indexは使用していません。 よろしくお願いいたします。
感心した。説明が上手で、「プログラムは覚えて書くんじゃない」とか、「forが真価を発揮する時」とか、プログラムが苦手な人がわかっていない肝心なところを簡潔に入れてきている。
超古参勢じゃん!
pygameを初めて使う初級者です。
子供用にちょっとしたゲームを作ってみようと思って勉強で視聴しています(まだ途中)。
プロセスが分かりやすくて勉強になりました!特にループの中で書いてから関数にするところなど参考になりました。
応用して頑張ろうと思います!ありがとうございます!
大学のjavaやcがよく分からなくて最近pythonを初めたのですが、この動画で無事完成でき、理解も深まりました。ありがとうございます。
今回初めてゲームを作ってみて、とても勉強になりました!まだまだ付けれる機能がありますし、シューティングゲームなどの別のゲームも作ってみたいと思いました、ありがとうございます!
色々と初めて触れたのですが、とても分かり易くて助かりました。
ありがとうございます!
自分の環境ではpygame.quit()やsys.quit()では閉じられずうまくいかず、ただのquit()でうまくいきました。
Python=3.10.9、pygame=2.4.0 jupyterlabから実行
作ってみて達成感すごくありました。毎秒投稿してほしい・・
check_winner()はで引き分けを含む勝敗判定に徹して、画面描画やグローバル変数の更新など副作用を起こさないようにして改造してみました。
前回フーガさんの神経衰弱を作ってみて、今回はこの○☓ゲームの作成に挑みました。
まだまだ、理解が足りていない部分や単なる模写になっている部分はありますが少しずつ成長できるように頑張ります!
Bgm好きです
ありがとうございます
15:20 ネストですね
動画参考になります!ちなみに、初心者質問ですが、パイゲームって出力して他人に遊んでもらえるんでしょうか?
お疲れ様です。
結論から言うとできます。
細かいことは、ここに書くには長すぎるため、方向性だけ示します。
遊ぶ人のPCにpythonの開発環境があれば、作ったファイルを渡すだけです。
開発環境がない人に対しては、「pyinstaller」などでexe化したファイルを渡せばOKです。
@@フーガ-b5v
ご返信ありがとうございます!
動画を参考に自分も挑戦してみようと思います。
ご丁寧にありがとうございました。
とても分かりやすい動画ありがとうございます。
実際に真似て作ってみました。
引き分け判定もターンカウント変数を用意し、関数内でglobal明記することで実現できました。
boardやBLACKが関数内でそのまま使えていることに疑問を抱きました。
タプルやリストは関数内でも使えるという認識で合ってますか?
お疲れ様です。
今回の場合、タプルやリストに限らずintやstringなど、何でも関数内で使うことができます。
関数外で宣言した変数はグローバル変数として扱われるため、関数内でも使用することができます。
反対に関数内で宣言した変数を関数外でも使用したり、関数外で宣言した変数を関数内で上書きしたい場合は、関数内でglobal宣言する必要があります。
ちょっとややこしくなりましたが、Pythonの変数のスコープやグローバル変数について検索するとよりわかりやすい説明が出てくると思います。
よろしくお願い致します。
@@フーガ-b5v 返信ありがとうございます。
何でも使うことができるのですね。すごい。
スコープやグローバル変数について調べてみます。
今日パイゲームを始めたのでよくわからないこと言ってるかもしれませんが、
勝利の条件を決めるところで
縦軸のところで
col_index
は使わないのですか?
あと、もう一つ!
引き分けになった時はどうすればいいのですか?
お疲れ様です。
はい。col_indexについて、今回は使いません。
boardを作成したときにrow_index、col_indexを利用したため、row_indexは横軸、col_indexは縦軸のイメージがあると思います。(それ自体は何も間違っていません。)
しかし、これらのindexは、二重リストの中身を1つひとつ取り出すことに利用する値です。
勝利判定においては、縦、横、斜めのいずれかのグループの合計が3かどうか判定すれば良いため、二重リストの中身を1つひとつ丁寧に取り出す必要はありません。
もちろん、勝利判定の実装方法(アルゴリズム)は本動画で紹介した以外にも多くあります。
row_index、col_indexを利用して実装しても、間違いではありませんし、何も問題ありません。(そういう方法もあるんだなぁって感じ。もっと良い方法があったら教えてください。)
しかし、row_index、col_indexを利用すると、for文の計算処理が基本的に9回行われます。
for row_index, row in enumerate(board):
for col_index, col in enumerate(row):
〜9回計算〜
今回実装したrow_indexだけ利用する方法では、for文の計算回数は3回で済みます。
for row_index, row in enumerate(board):
〜3回計算〜
今回においては正直誤差ですが、少しでも計算回数を少なくしようとしています。
長くなりましたが、col_indexを利用してまで1つひとつ丁寧に要素を取り出す必要がないこと、計算回数を少なくするためにcol_indexは使用していません。
よろしくお願いいたします。
また、引き分けの場合の処理について、動画では実装していません。
勝利判定と同じように、引き分けであることを示し、リトライする機能を是非作ってみてください。
方向性だけ示すと、「boardの中身に0がないのに勝利判定が行わなければ引き分けとする」、「boardを9回クリックしても勝利判定が行わなければ引き分けとする」のように実装すれば、なんだかいけそうな気がします。
Pythonおよびpygameのアウトプット、頑張ってください。
よろしくお願いいたします。
@@フーガ-b5v ご丁寧にありがとうございます。
今日完成しました!
ありがとうございました!
ウィンドウを閉じようとしてxボタンを押すと、レインボーカーソルになり閉じられませんでした。quitを書き換えてみたのですがどれもうまくいきませんでした。この場合どうしたらうまくできるでしょうか?
お疲れ様です。
考えられる原因は数えられないくらいです。
ぱっと思いつくのは下記の通りです。
・pygame.init()してないことによる不具合
・pygame.quit()やpygame.QUITのスペルミス
・OSやpygame、使用している統合開発環境のバージョンの互換性が悪い
レインボーカーソルが出るということは、OSはマックで、xボタン押下時にエラーも出ない状態だと思います。
昔、Macとpygameの互換性が悪いことがあったはずなので、その可能性があるかもしれません。(流石にもう改善されているので、これが原因ではないと思います。)
概要欄に、自分が動画で実際に作成したソースコードがあるため、ダウンロードし、それを実行しても同じことになるかをまずは確認していただければと思います。
また、とりあえず画面を消したいとのことであれば、下記のようにsys.exit()でプログラムを終了することができるはずです。
import sys
import pygame
〜〜〜
pygame.quit()
sys.exit()
よろしくお願いいたします。
この場合、決着がつかなかったらどうなりますか?
お疲れ様です。
引き分けの場合、何にもなりません。
一度画面を消し、再度プログラムを実行させる必要があります。
ぜひ、「引き分けの場合はリセットする」という機能を作ってみてください。
動画の最後に勝敗がついたときのリセット機能を実装しているため、参考にしていただければと思います。
そしてもし実装できたなら、それを同じようにどこかで公開していただきたいです。
自分もそれを見て勉強させていただきます。
よろしくお願い致します。
一応、方向性を示します。
もしも、フィールドが全部埋まれば(変数boardの中に0が無くなれば)、引き分け判定。
とすればなんだか上手くいきそうです。勝敗判定と引き分け判定が同時に発生しないように注意したいですね。
ただ、自分が想定していないコードの書き方を見ると興奮するため、この文章は忘れていただきたいです。
よろしくお願い致します。
🇯🇵🇯🇵いいですね
🇯🇵🇯🇵🇯🇵いいね