- Видео 580
- Просмотров 236 185
百春
Япония
Добавлен 28 фев 2019
2021年3月より、プログラミングの動画を公開しています。
パソコンの基本操作から始め、VisualStudioのインストールと使い方、プログラミングの初歩、ゲーム作りへと、ステップを進めています。C言語はコンピュータの中の動きを勉強するのに適した言語なので、コンピュータに関する基礎知識を盛り込むようにしています。コンピュータの中の動きが理解できて、プログラミングとはどういうものかが分ってきた次は、プログラムをどの様に作るかのステップに入ってきます。プログラムの作り方としては、オブジェクト指向が良いと思うので、C++言語でオブジェクト指向プログラミングに進んでいきます。
また、百春さんが抱えた作業を自動化するにあたりPython言語でプログラミングすることになり、これに合わせて、Python編もスタートさせています。
動画が多くなり、どいった構成になっているのかが分かり難くなってしまったためmomoharuサイトを立ち上げています。
動画を投稿しながらサイトを作成しているため、適宜、更新していますサイトに対する、ご意見・ご要望などありましたら、「momoharuサイト紹介動画」(ruclips.net/video/C2h4_yCk5ac/видео.html)にコメントをお寄せください。
2024年8月 百春
パソコンの基本操作から始め、VisualStudioのインストールと使い方、プログラミングの初歩、ゲーム作りへと、ステップを進めています。C言語はコンピュータの中の動きを勉強するのに適した言語なので、コンピュータに関する基礎知識を盛り込むようにしています。コンピュータの中の動きが理解できて、プログラミングとはどういうものかが分ってきた次は、プログラムをどの様に作るかのステップに入ってきます。プログラムの作り方としては、オブジェクト指向が良いと思うので、C++言語でオブジェクト指向プログラミングに進んでいきます。
また、百春さんが抱えた作業を自動化するにあたりPython言語でプログラミングすることになり、これに合わせて、Python編もスタートさせています。
動画が多くなり、どいった構成になっているのかが分かり難くなってしまったためmomoharuサイトを立ち上げています。
動画を投稿しながらサイトを作成しているため、適宜、更新していますサイトに対する、ご意見・ご要望などありましたら、「momoharuサイト紹介動画」(ruclips.net/video/C2h4_yCk5ac/видео.html)にコメントをお寄せください。
2024年8月 百春
〈Python編14〉データフレームのマージ
長唄の楽譜をスキャンしてPDFにまとめる作業をしています。
前回、パソコンのファイルをクラウドにアップロードして、そのリンクを取得するプログラムを、まとめて実施できるようにしました。
今回は、前回作成したリンク情報の入ったExcelファイルと、事前に作成した曲名の入ったExcelファイルをマージして、新たに楽譜IDと曲名、よみ、ページ数の入ったExcelファイルを作成します。このExcelファイルの楽譜IDには、Dropboxにアップロードした時のURLをハイパーリンクでセットすることで、楽譜IDをクリックすることで、アップロードしたPDFファイルを見えるようにします。
今回で、一連の自動化の作業は終わりにします。
前回、パソコンのファイルをクラウドにアップロードして、そのリンクを取得するプログラムを、まとめて実施できるようにしました。
今回は、前回作成したリンク情報の入ったExcelファイルと、事前に作成した曲名の入ったExcelファイルをマージして、新たに楽譜IDと曲名、よみ、ページ数の入ったExcelファイルを作成します。このExcelファイルの楽譜IDには、Dropboxにアップロードした時のURLをハイパーリンクでセットすることで、楽譜IDをクリックすることで、アップロードしたPDFファイルを見えるようにします。
今回で、一連の自動化の作業は終わりにします。
Просмотров: 68
Видео
〈Python編13〉プログラムを整えまとめてアップロード
Просмотров 504 месяца назад
長唄の楽譜をスキャンしてPDFにまとめる作業をしています。 前回、パソコンのファイルをクラウドにアップロードして、そのリンクを取得するプログラムを作成したので、これをまとめて実施できるようにします。 更に、今までChatGPTに作ってもらったプログラムを見直して、少しプログラムを整形します。この時、NotebookのセルをMarkdownと呼ばれるタイプにセットして、プログラムを読みやすくなるようにしてみます。 Dropboxのアクセストークンやリンク情報はマル秘にしたいので、動画が少々汚くなってしまいました。ご了承ください。
〈Python編12〉クラウドへのアップロードとリンク取得
Просмотров 364 месяца назад
長唄の楽譜をスキャンしてPDFにまとめる作業をしています。 今回は、パソコンのファイルをクラウドにアップロードして、そのリンクを取得するプログラムを作成します。 ここでは、まずファイルを1個だけ処理します。 クラウドはDropboxを使います。プログラムからクラウドを操作するためには、アクセストークンというものをDropboxの開発者用サイトから取得しますが、このアクセストークンはマル秘にしたいので、動画が少々汚くなってしまいました。ご了承ください。
〈Python編11〉まとめて結合圧縮&リストと集計出力
Просмотров 314 месяца назад
長唄の楽譜をスキャンしてPDFにまとめる作業をしています。 今回は、前々回の第9回と、前回の第10回で作成したプログラムをまとめることで、1冊単位にまとめたPDFファイルを圧縮して保存していきます。 保存していく繰り返しの中で、ページ数とファイルサイズをリストに記録し、最後に、リストの情報をデータフレーム化してExcelファイルに出力します。 この時、データフレーム化しているので、合計を求めるのも簡単に書くことができます。データの集計結果は、リスト出力したシートとは別のシートに作成して、Excel出力します。
〈Python編10〉PDFファイルの圧縮
Просмотров 624 месяца назад
長唄の楽譜をスキャンしてPDFにまとめる作業をしています。 今回は、1冊単位にまとめたPDFファイルを圧縮します。 楽譜は、変体仮名が含まれた手書きの文字が多く含まれたもので、文字データというより画像データなので、画像として圧縮を行うようにします。今回は、一つのファイルだけを圧縮し、次回、まとめて圧縮するプログラムように、ステップを進めます。 PDFを画像に変換するなかで、Popplerというものを内部的に使用していることが判明したので、PopplerをGitHubからダウンロードしてセッティングするようにしています。
百春チャンネル紹介
Просмотров 3705 месяцев назад
百春チャンネルは2021年3月に公開を開始しました。 プログラミングが初めての人を対象に、マウスの使い方から説明を始めており、プログラミング講師だった時の経験を詰め込んだ内容になっています。 最近は、自分自身に舞い込んだ作業を効率化するためのPythonプログラミングの動画も開始しています。 なお、公開した動画全体を見渡すことのできるサイトも用意していますので、活用いただければ幸いです。 〈momoharuサイト〉 sites.google.com/view/momoharu/ ※ゲームプログラミングの効果音や画像データは、以下のサイトから提供いただいたものが含まれます。 〈ぴぽや倉庫〉 pipoya.net/sozai/ 〈魔王魂〉 maou.audio/
〈Python編09〉データフレームとExcel出力
Просмотров 505 месяцев назад
長唄の楽譜をスキャンしてPDFにまとめる作業をしています。 今回は、1冊単位にまとめたPDFファイルのページ数とファイルサイズを表にしてExcelファイルに出力します。この時、Pandasというライブラリが提供しているデータフレームを使います。Pandasは、膨大なデータのデータ分析で活用されるライブラリです。データフレームの操作方法を覚えると、色々な事務処理で活用できると思います。今回はデータフレームを作るだけですが、今後、便利な機能を少しずつ紹介していく予定です。
〈Python編08〉まとめてPDF結合
Просмотров 455 месяцев назад
長唄の楽譜をスキャンしてPDFにまとめる作業をしています。 今回は、今までChatGPTに作ってもらった関数を利用して、スキャンした楽譜を、1冊ずつまとめて一つのPDFファイルに結合していきます。プログラムを少し修正して、本のページも表示するようにしてみます。
〈Python編07〉ファイル名のリスト取得
Просмотров 495 месяцев назад
長唄の楽譜をスキャンしてPDFにまとめる作業をしています。 今回は、どのようなフォルダ構成にしているのかを説明し、この構成の中でのファイルやフォルダの一覧をリストとして取得するプログラムをChatGPTに作成してもらいます。
〈Python編06〉関数とちょっとした文法
Просмотров 535 месяцев назад
ChatGPTが教えてくれたプログラムの中に「関数定義」というものがあり、ChatGPTが作成したプログラムを利用していく上で、外せない知識となりますので、これを説明します。 この他、データの種類、代入、リストというものを説明し、ChatGPTが作成したプログラムを少し修正してみます。
〈Python編05〉コメントとオフサイドルール
Просмотров 665 месяцев назад
Python言語の細かな文法を解説するのではなく、ChatGPTが教えてくれたプログラムを利用するにあたって、知っておいた方がよいと思うことに焦点を当てて説明する方針です。 今回は、ChatGPTが教えてくれたプログラムを、JupyterNotebookに貼り付けていく時、どういった単位で貼り付けていくかを説明します。
〈Python編04〉JupyterNotebook日本語化とimport
Просмотров 1565 месяцев назад
今回は、Pythonのプログラミングで使うJupyterNotebookを日本語化します。 また、Python言語のimportについて説明します。 importには2種類の書き方があります。必要なものだけを取り込む方法と、ライブラリ全体を取り込む方法です。必要に応じて、2つの書き方を使い分けるとよいでしょう。 百春チャンネルのPython編では、ChatGPTにプログラムを教えてもらいながら、部分的に修正していきますが、基本的には、ChatGPTが提示した書き方を採用する方針です。
〈Python編03〉スキャン作業とPDF化
Просмотров 1315 месяцев назад
今回は、スキャン作業をどのように行っているかを最初に紹介します。 百春さんが使っているプリンタのスキャナーは、特に何も設定しないと(おまかせスキャン機能と呼んでいるようです)、左に90度回転した1ページごとのPDFファイルが作成されます。この1ページずつのPDFファイルを、右に90度回転させながらPFDファイル結合するプログラムをPythonで作成します。 百春さんは、Python言語をしばらく使っていませんでしたが、ChatGPTさんの力を借りて、さくっとプログラムを作成することが出来ました。 今回は、雰囲気だけを味わってもらうため、Python言語の文法的な話しは一切していません。次回から、少しずつ文法的な話しを交えながら、Pythonプログラミングをしていく予定です。
〈Python編02〉Anacondaのインストール
Просмотров 1915 месяцев назад
Pythonでプログラミングをするにあたり、Anacondaでセットアップすることにしました。 Anacondaは、Pyhon本体に加え、様々な人気のライブラリも同梱されています。 百春さんは、昔、Pythonでデータ分析していたことがあり、その時、Anacondaに入っているPandasを使っていて、とても便利だった記憶があります。 また、Jupyter Notebookという、Pythonのプログラムを書いては、実行して確かめるということができるソフトも入っているので、これを使ってプログラミングしていこうと思います。
〈Python編01〉Pythonをはじめるきっかけ
Просмотров 2705 месяцев назад
百春チャンネルでは、C/C 言語でゲームプログラミングすることで、コンピュータやプログラミングについて勉強するための動画を作ってきましたが、急遽、百春さんの事情で、Pythonでプログラムを作成することになりました。C 言語を速習する動画を作成している途中ではありますが、Pythonプログラミングのシリーズを始めることにしました。 この動画では、何でPythonを使ったプログラミングを始めることになったかを紹介しています。
〈C++初歩編08_07〉テトリス風ゲーム(7) 着地でNEXT自動落下
Просмотров 1197 месяцев назад
〈C 初歩編08_07〉テトリス風ゲーム(7) 着地でNEXT自動落下
〈C++初歩編08_05〉テトリス風ゲーム(5) フィールドのグリッド表示
Просмотров 787 месяцев назад
〈C 初歩編08_05〉テトリス風ゲーム(5) フィールドのグリッド表示
こんにちは、こちらの動画をみながら環境をつくりました、ウィンドウズ11です、 次はどの動画を見たらよいでしょうか?初めてc言語を学びます。よろしくお願いいたします。
コメントありがとう。 (*^_^*) 以下のサイトは、百春サイトの動画の目次になっています。 sites.google.com/view/momoharu/ 「環境構築と始めの一歩編」で、VisualStudioの環境構築からプロジェクトの作り方を説明しています。 「C言語基礎編」になると、いよいよC言語を使ってのプログラミングになります。 演習問題なども入っていますので、実際にプログラムを作りながら勉強を進めてくださいね。 分からないことがあったら、またコメントください。
@@momoharu ありがあとうございます!!
お話の音量を他のチャンネル一般と同じくらい大きくしていただけると、視聴者が出入りする際に音量調整をせずに済むので助かります
申し訳ありません😓 パソコンの設定と、動画編集のアプリの問題で、音量が小さくなってしまいました。 幾つかの動画の音量が小さくなっています。 気がついて、その後は音量に気をつけるようにしました。 重ねてお詫びいたします。 (゚゚)(。。)ペコッ
今までオブジェクト指向で作ってきていて、コンポーネント指向に変えようとしていたのですが、理論がほんと根本から変わってしまいわかりづらかったのですが、これのおかげで脳が切り替えられそうです…。ほんとに助かります…
コメントありがとうございます。 (*^_^*) 最近、ボランティアでしている作業に追われて動画を追加できていませんが、暇をみつけて頑張りたいと思っています。 応援よろしくお願いします。 (^_^)Y
メモリーの解放について教えてください。 今回のプログラムでは、reallocでエラーになった場合exit(1)で終わるのですが、それまでにallocやreallocしてきたメモリーの解放については特に考慮しなくてよいものなのでしょうか。 また今更で恐縮ですが、今までの練習問題でもエラーが発生してexit()で終了させた場合はmain.cppのEnd()関数が呼ばれずに終了すると思うのですが、これも特に問題ないのでしょうか。 細かいことで申し訳ないのですが、気になってしまったもので・・・ よろしくお願いします。
回答遅れてごめんなさ💦 exitの中で、すべてのメモリが解放されるので、ユーザプログラム側で、今まで獲得していたメモリを解放する必要はありません。 ただ、自分がどういったメモリを獲得していたかを意識する練習として、exitする前にメモリ解放するようにするのもよいと思います。 main.cppの中で行っている終了処理をしないで終わってしまう件も、システム的には問題ないです。ただ、プログラム仕様としては、不親切かもしれませんね。 ('◇')ゞ
@@momoharu 回答ありがとうございました。 お忙しいと思いますので、時間のある時で構いません。 メモリーの解放の件良く分かりました。 C#でのプログラミングがメインでしたので、ここら辺の感覚がいまいち掴めていませんでした。
今回のオペレーションフローには無いのですが、対戦相手のデータを全部入力した後に中断することもあるかもしれないのでBattleInit()のWAIT_ENTER();直前でもsave_battle_resume()を呼ぶようにしました。 ところで前回の動画で「仙石原すすき野」に行かれたとのこと、私は若いころ札幌の「すすきの」によく行っていました(^_^;) 動画の再開を楽しみにしています。
いつも分かりやすい説明をありがとうございます。 マクロに関して一つ質問させていただきたいのですがよろしいでしょうか。 今回のプログラムでは、WAIT_ENTERとreset_balloon(&balloon)がペアーになっているところが多かったのでこれをマクロにしようと思い以下のような記述を行いました。 #define WAIT_RESET WAIT_ENTER, reset_balloon(&balloon) するとWAIT_RESETマクロの呼び出しのところでエラーになりました。 インライン展開をしたところWAIT_ENTERの後のカンマのところでエラーになっていたのでカンマをセミコロンに戻したました。 #define WAIT_RESET WAIT_ENTER; reset_balloon(&balloon) //(1) 正常に動作しましたが、これだと二つの式になってしまうため中かっこで囲み以下のようにしました #define WAIT_RESET { WAIT_ENTER; reset_balloon(&balloon); } //(2) これも正常に動作しました。 自己流でマクロを作ってみたのですが、(1)や(2)はマクロの作法的に正しいのでしょうか。
自分なりの工夫をされることは、とっても素晴らしいことです! 壁にぶつかり、その壁を乗り越えてスキルがアップしますので、頑張ってください。 さて、今回の件ですが、このやり方だと、文法エラーが発生する可能性があります。 if(条件) WAIT_RESET; else // ★エラー発生 ○○; プログラミングテクニックとして「do{}while(0)」というものがあります。 下記の動画の2:24辺りから説明しています。 「C応用特別編 マクロ関数の注意点(do{}while(0)を使う)」 ruclips.net/video/sVAsQL3TVx4/видео.html ということで、C言語のマクロの書き方作法として、このようなものもありますので参考にしてみてください。
@@momoharu 複文をマクロにするときはここまで考慮しておかないといけないのですね。 とても良く理解できました。 ありがとうございました。 それにしても既に動画での解説があったとは驚きました。 これからも分かりきった事を質問してしまうかもしれませんが、よろしくお願い致します。
今、趣味系ボランティア作業中で忙しくしており、動画投稿がストップしている状態ですが、少し落ち着いたならば動画投稿を再開したいと思っておりますので、応援よろしくお願いいたします。 (゚゚)(。。)ペコッ
今、「NULLポインター"〇〇"を逆参照しています」というワーニングに悩んでいます。 例えば、AA_left.txtを読み込むことを前提として「空読み」処理のwhileループ直後に height=5; という一行を追加して実行したところ正常に表示されますが、48行目のaa[i]=cp;や52行目の*cp++='\0';で上記ワーニングが発生しました。 試しに、height=5;をwhileループ内に入れるとワーニングは発生しませんでした。 このようなワーニングに遭遇したのは、最終行が改行で終了していないAAファイルに対応させようとしている時でした。 尚、ポインターがNULLでないことを確認してから代入するとワーニングは消えます。 これは記述のどこかに誤りがあるのか、それともVisualStudioがチェックしすぎなので無視してよいものなのか、あるいはポインターへの代入の都度NULLでないことを確認しなければならないのか、悩んでいます。 このような現象に関して何か心当たりはありますでしょうか?
練習問題26の動画を見てメモリーが正常に確保できたかどうかを確認するようにしたら「NULLポインター"〇〇"を逆参照しています」というワーニングは出なくなりました。 ありがとうございました。 ただ、aa[i]=cp;のところで「'aa'への書き込み中にバッファオーバーランが発生しました」という新たなワーニングが出てしまいました。 heightは5だから動的確保したメモリ容量は問題ないと思うのですが.... トホホな状態です。
heightに直接5を代入するのではなく height = height - height + 5; とすると、「'aa'への書き込み中にバッファオーバーランが発生しました」が出なくなりました。 どういうことなんでしょう? ここら辺はVisualStudio内のことなので、あまり深く立ち入らない方がよいのですかね。
find_nameの第二引数 "char* name" にもconstがつけられると思うのですが?
コメントありがとうございます。 はい、確かに👏 int find_name(const status_t a[], int n, const char *name); のように、引数nameも、const を付けた方がよいです。 ご指摘、ありがとうございます🤗
今のままだと全員消滅した後に戦闘を行うと無限ループになる不具合があります。 (これから先の動画で触れているのであれば無視してください) 全員消滅時にfind_opponent()を呼ぶとdo-whileループから抜けません。 do-whileループに入る条件に「&& a[i].Life > 0」が抜けていたみたいです。 またfind_opponent()の戻り値が-1の時は戦闘しないようにする修正も必要だと思います。 以上、間違えていたらすいません。
コメントありがとうございます🤗 素晴らしいです👏 このプログラムには幾つかバグが ありました。 ご指摘の通りです。 以下に修正案を示します。 LIFEが0より大きいかどうかで、生存を確かめた方がスッキリくるかと思います。 int find_opponent(status_t a[], int n) { for (int i = 0; i < n; i++) { if (a[i].LIFE > 0) { // 生存しているか? // 生存者が一人でもいる場合に選ぶ do { i = rand() % n; } while (a[i].LIFE <= 0); return i; } } return -1; // 生存者が一人もいない } あと、もう一つ修正しなければならいのは、find_opponentを呼び出している所で、負の値かを調べる必要があります。 void menu_buttle_proc(status_t a[], int n, status_t* player) { system("cls"); printf("***** 戦闘 ***** "); int i = find_opponent(a, n); if (i < 0) { // ★ココ printf("対戦相手がいません "); } else { printf("対戦相手:%s ", a[i].NAME); rewind(stdin); (void)getchar(); if (buttle(player, &a[i]) == player) { printf("%sは消滅した ", a[i].NAME); } else { printf("%sは負けてしまった ", player->NAME); } } } 他でもバグ仕込んでいるかもしれません。 ご協力いただけると嬉しいです😊
@@momoharu なるほど LIFEだけで判断できるんですね。 丁寧な返信、励みになります。 ありがとうございました。
いろいろ実験して分かったこと 変数定義の順とメモリ割付の順について 32ビット版 ・定義順と逆にメモリに割り付けられる(上方向) 64ビット版 ・定義した順番にメモリーに割り付けられる(下方向) てっきり同じと思っていたら違うんですね。
コメントありがとうございます (*^_^*) メモリへの割り付け方は決まっている訳ではなく、コンパイラのバージョンによって異なる可能性もあります。 メモリへの割り付けが決まっていないことで、見えなかったバグが顕著化することもあります。 いろいろ実験してみてください。
遅ればせながら、基礎編完了しました。 ありがとうございました。 迷路作成の再帰部分を理解するのが大変でした。 一か所だけ変更したところがあります。 Lifeが3未満の状態で敵を倒すとLifeがマイナスでゲームオーバーになるので Lifeの更新結果がマイナスになったら0を入れ直すようにしました。 (マイナスのLifeに違和感を感じたもので。個人的な感覚の問題です) 次は応用編を頑張りたいと思います。
コメントありがとうございます (*^_^*) 基礎編を完了したとのこと、おめでとうございます。 プログラムに正解はなく、独自にアレンジは是非にお勧めです。 マイナスのLIFEは美しくないですよね (^◇^;) 次は、応用編を頑張ってください。
最近、過去動画を見てC、C++を勉強中です 関数名ですが、「InputSelectAndNotSelectWayErase」なんてのはどうでしょう?
すいません。扉の選択にも使用するので上記関数名は却下です。 早まってしまいました。
コメントありがとうございます。 名前つけるの苦手です😅 参考にさせてください😊
とても残念です ボックス記号 (■) が vscode 2022 コマンド プロンプトで疑問符 (?) として表示されます。
ボックス記号 (■) が全角文字のため、文字化けしたようです。半角文字なら大丈夫なので、ひとまず、以下のように修正してみてください。 set_text_color(Block_list[type][i][j]); printf("■"); ↓ set_back_color(Block_list[type][i][j]); printf(" "); // 半角スペースを2つ
10:O7 🧐 本当に予想外。 int data[3] = { 1,2 }; printf("%d ", data[0]); printf("%d ", data[1]); printf("%d ", data[2]);✅ OUTPUT 1 2 0❗✅
配列の初期化では、余った部分は0がセットされるんです😅
日本の昔の楽譜データが凄いですねえ~♪
そうなんです! これを書いた人って凄いです。多分、この楽譜を書いた頃はレコーダーなんて無かったと思うので、聞いて記憶した事を書く作業だったと思うんですよね。 頭が下がります😓
待っていました!!!python!!!嬉しい!
コメントありがとうございます😊 頑張りまーす💪
最近C言語のマクロ定数について調べた時にこのチャンネルを見つけたのですが、Pythonの動画を始めることを知ってびっくりしました。 楽しみにしております‼️
急にPythonを始めることにしました😅 C++速習編を作成していたのですが、動画でも紹介したPDF化の作業が入ってきて、これはPythonで自動化しなければ・・・ということになりました。 昔Pythonで、いろいろな事を自動化していましたが、PCを入れ替えた時に、その環境はすっかり消えてしまいました。次回は、Python環境のセットアップをしますので、参考にしてもらえると幸いです。 それでは、また👋
『百春流Python講座』楽しみにしています。
コメントありがとうございます😊 今回のシリーズは、資料をPDFにまとめていく作業を通して、プログラムで効率化できそうな部分に焦点を当てて、ChatGPTに助けてもらいながらPythonプログラミングをしていこうと思っています。 Pythonの文法に、あまり精通している訳ではないので、ここはChatGPTさんを頼ろうと思っています😅 気づいたことあったら、またコメントお願いします😀
最後まで勉強しました。外国人さえもわかりやすかったDXライブラリガイド動画シリーズです。ご配布いただきありがとうございました!
励みになるコメントありがとうございます😊 頑張ります💪
C#版の「テトリス風ゲーム」出来ました。 自分はテトリスが苦手なため、ゴーストブロックを表示するように改造しました。 ホールド機能なども追加したいなと思っています。 これまでのシリーズを見てきて、コンポーネント指向でのゲーム作りが何となく分かってきました。 長い間ありがとうございました。
お疲れ様でした😊 「C++初歩編」では、まずはオブジェクト指向のプログラミングに慣れてもらうため、文法的なことを殆ど説明せずにプログラムをガリガリ書いてしまいましたので、ここで少し復習の意味を込めて「C++速習編」で文法的なことを説明する予定です。 ここで一息ついた後、サンジェイさんの本に戻り、新しい所に進んでいこうと思っています。この本は奥が深く、勉強するのが大変です😅 これからもプログラミング楽しんでくださいね👋 ヾ(*´∀`*)ノ
C#版「迷路脱出ゲーム」出来ました。 C++とC#の言語仕様の違い(C#にはtypedefが無い等)や代入動作の違いを吸収するのに少し手間取りました。 クラスが多くなってくるとクラス間の関連や各クラスの機能の把握が難しくなったのですが、 要所要所でのクラス関連図を使った説明に助けられました。 今コメント付けをしながら頭を整理しています。
迷路ゲームの完成、おめでとうございます。 この動画を見ながら、C#に置き換えて作成しているとの事、素晴らしいです👏 これからも頑張ってください😊
ふと思ったのですが、値渡しと参照渡しの時の挙動の違いって、 スタックへ実引数のアドレスがpushされるか、それとも実引数の値自体がコピーされpushされるのか、みたいな違いになるのでしょうか??
はい、そうです😊 変数xに10が入っていたとします。 「x」と実引数に書くと、10という値がスタック領域にpushされ、「&x」と実引数に書くと、10が入っている変数xのメモリのアドレスがスタック領域にpushされます。 値がpushされることを値渡し、アドレスがpushされることを参照渡しと言います。
@@momoharu ご丁寧に本当にありがとうございます! 他の動画も参考にさせていただきます!
宜しくお願いします。 (*´∀`*)ノ
素晴らしい解説でした!! ここで一つ質問なんですが 実引数はスタックへpushされますが、仮引数はスタックへpushされると言うより、スタックへpushされた実引数のメモリ領域に対して宣言をするといった感じでいいでしょうか? つまり関数終了時に解放されるため、固定されたメモリ領域を仮引数が持つのではなくて、仮引数のメモリ領域は関数ごとに変動するといった理解でいいでしょうか?
コメントありがとうございます😊 その理解で良いです🙆 関数呼び出しのタイミングで、実引数がスタックにpushされ、メモリが割り当てられる事になります。このメモリを仮引数側で名前と、そのメモリがどの様なデータ型かを割り当てることになります。このため、仮引数が参照するメモリは、呼び出される場所によって変動することになります。
@@momoharuお返信ありがとうございます! 通知がされなくて気付くのが遅れました! 非常にわかりやすかったです
こんばんは。懐かし風のゲームですね。昔グラディウスみたいなを作ってみたいって思っていました。当時もマップエディタみたいなのでマップを作っていたのでしょうかね。今ならパソコンでも作れるはずですが、これがなかなかハードルが高いですね。
コメントありがとうございます😊 シューティングゲームは迫力ありますが、なかなか敷居が高いです😅 ただ、敵や弾の動きはプログラミングスキルを上げるには、よい題材と思っています。 少しネタ集めしようと思います。 ヾ(*´∀`*)ノ
日々視聴しております。助かります。 長旅でしたが、完成ですね。 お疲れ様でした。m(__)m 蛇足ですが、 プログラミング練習教材として、 JavaScriptを使ってのゲーム作成も 面白そうだと思い始めまして、 調べ始めたところです。 (開発環境の敷居の低さが魅力のようです。)(#^^#)
コメントありがとうございます。 同じゲームを、色々なプログラミング言語で実装するなんていうのも面白そうですね😊 やりたいことがつきない、というのはまだ認知症にはなっていないな、と自分を慰めております😅 これからも応援よろしくお願いします。 ( ^o^)ノ
日々視聴しております。助かります。 制御系ですと、 ごちゃごちゃ動作 ≒ チャタリング(バタツキ) 閾値制御などを書くと、 かなりの頻度で、ハマることになりますね。 動かしてから気が付くってこと、毎度です。((+_+))
コメントありがとうございます😀 チャタリングなんて言葉ありましたね。 懐かしいです😅
日々視聴しております。助かります。 先日、趣味のPHPデバッグをしていますと、なかなかエラーがとれなくって はまってしましました。原因は()の不揃いでした。 それで、思い出したことがあります。 C言語系ですと int atai = 40; if ( atai == 30) {何某処理} なんてなイフ文を if ( 30 == atai ) {何某処理} なんて書いていたこと。 イコール一つが見つけられなくて。。。春、 ^^) _旦~~
if(30==atai)を間違えてif(30=atai)と書くと文法エラーになるので、等価条件は、定数を左辺に書いた方が良い、というやつですね。 そんなルールありましたね、懐かしいです。 今は、VisualStudioが賢くなって、ある程度の書き間違えを指摘してくれるので、助かります。 ただ、時々、余計なお世話になることもありますが・・・😏
百春先生、いつも楽しく学習させていただいております。 質問なのですが、この回のような状況で、私のような素人の場合、まずActorの派生クラスでマウス用のクラスを作成し、オブジェクトとして扱うという方針を安易に立ててしまうのですが、そのような思考方法は先々詰まりやすいのでしょうか? 先生のようにMapMakerのUpdateにマウスのデータを置くという発想は、もし私が独力で考えた場合なかなか出てこないと思われます。 何かコツみたいなものがあるのでしょうか? オブジェクト主体というよりもデータ(メンバ変数)の置き場を主体に考えていったほうが良いのでしょうか?
プログラミングに正解はなく、私の書いたプログラムも単なる一例でしかありません。 今回、マウスの位置をUpdateにおいたのは、現段階では、Updateメソッドの中でしか使っていないためで、深い理由は無いと思います。 あまりに汎用化に走り過ぎると、プログラムが巨大化する傾向にあるので、最近は、目先のことに集中して、データ隠蔽する方向になっているかもしれません。 一番の隠蔽は、メソッドの中に隠蔽してまうことなので、今回は、Updateメソッドの中に閉じ込めたんだと思います。 私も、日々悩みながらプログラミングしていますので、何か変な事ありましたら、コメント宜しくお願いします。 σ(^◇^;)
@@momoharu 返信ありがとうございます(*^_^*)。今は一つのクラスにどのくらいの役割を担わせるのが適度なのかの判断がまだつかない段階ですので、少しでもメソッドやメンバ変数が増えてくると何となく整理して見やすくしたいなと思ってしまいます。またよろしくお願いします。
手軽で良いですよね
手軽で良いですよね
DXライブラリは手軽に扱えるので、便利させてもらっています。 作者の方には感謝感謝です(*⌒▽⌒*)
日々視聴しております。助かります。 ソースの不要箇所をビシビシ切っていくと コンパイルを通すのに一苦労です。 (あれ、もしかして、[コンパイルを通す]って表現は死語でした?((+_+))
いやー、「コンパイルを通す」は死語ではないと思うのですが、私も現場を離れて年月が過ぎているので定かではありません😅 不要と思って削除して、大量のエラーが出ると焦りますよね😆 人の作ったプログラムを、自分なりの解釈で、修正していくのは、それはそれで楽しいです。 私の作ったプログラムも、ビシビシ修正して鍛え直してください🤗
丁寧な解説ありがとうございます。今後もよろしくお願いいたします。
コメントありがとうございます。 分らない所がありましたら、遠慮なく質問してくださいね。 (*⌒▽⌒*)
日々視聴しております。助かります。 Stateパターンを使った状態遷移 = ステートマシン実装法(?) 組み込み制御で、割とよく使う方法ですね。(^^)/
コメントありがとうございます。 状態遷移表って便利ですよね。私が最初に経験した状態遷移のプログラムは通信制御プログラムでした。ゲームプログラムでも、色々使えるシーンがあると思うので、活用しようと思っています。 次回のタイルを使ったゲームでも活用予定です。 これからも応援宜しくお願いします。 (*⌒▽⌒*)
日々、視聴しております。助かります。 リファクタリング・・・ ある程度のトコロでやらなくてはいけないと思いながら、 実運用が開始された後だと、 怖くてなかなか出来ないのですよね。 プログラマーの悲哀を感じてしまいます。((+_+))
コメントありがとうございます😊 そうなんです。膨大な試験工程を終えると、スペース1つ入れるのも厳禁です。新たな機能を追加する時に、きちんとテストのための工数をもらわないとリファクタリングできませんよね😭 リファクタリングせずに、機能追加を重ねるとスパゲッティプログラムに突き進んでいってしまいます🍝 リファクタリングの重要さを理解している方が、マネージメントしてくれる事を祈ります🙏
今回は、いつにも増して内容の濃いシリーズでした。 「State」について自分なりに整理してみました。 今シリーズでのStateには二種類あり ・マウスボタンが押されていない時のふるまいを記述したState(StateA) ・マウスボタンが押されている時のふるまいを記述したState(StateB) そしてState間の遷移は ・マウスボタンが押された時にStateAからStateBへ遷移 ・マウスボタンが離された時にStateBからStateAへ遷移 一見自明の事のようですが、これらの原則を意識しながらStateの変更や追加をしないと段々と混乱してしまいます。 今回、タイルの選択状態を保持し(dropしても選択状態キープ)連続して貼り付けられるようにしたのですが、 当初曖昧な理解のまま修正したら動作不安定なものが出来上がってしまいました。 次回シリーズも楽しみにしています。
いつもコメントありがとうございます。 状態は、色々悩みながら、こんような状態に分けてみました。正解はありませんので、是非に改変してみてください。 それでは、またヾ(*´∀`*)ノ
日々視聴しております。助かります。 閑話休題 IDEのエディタを使っていると、 昔々、使用していたテキストエディタのことを思い出します。 MIFES、秀丸、Vz、vi等々、それぞれ特徴があって面白かったですし、 使っている人の歴史も垣間見えたりしました。 あと、「手に馴染むエディタ」なんていう言い方もありましたですね (^^♪
コメントありがとうございます。 (*⌒▽⌒*) 実は私、学生時代、紙テープとカードを使ってプログラムを作成していた時代の人なんです。 化石時代ですねσ(^◇^;) これからも応援よろしくお願いします。 (._.)オジギ
いつも楽しく学習させていただいております。デザインパターンは独学ではイメージがつかみづらく、学習を後回しにしてたところ、今回のシリーズで扱っていただきとても嬉しかったです。大変参考になりました。
コメントありがとうございます。 次回も、デザインパターンの一つであるStateパターンを使ったプログラムを鋭意作成中です。 頑張ります! (*⌒▽⌒*)
このプログラムにタイトルとゲームオーバー時にタイトルに戻るようにしてループするようにしたいのですが、どのようにすればいいでしょうか。
とりあえず、下記の様なtitle関数を作って、main関数を下記の様に書き直すと、最初にタイトル表示して、ゲームが終わると、再度、タイトル表示するようになります。 エイヤーと作ったので、悪しからず、参考までにしてくださいね。 bool title(void) { system("cls"); printf("************************ "); printf("* タイトル * "); printf("************************ "); printf("ESC:プログラム終了、スペース:ゲーム開始 "); int key; while (true) { key = input_key(); if (key == '*' || key == ' ') { break; } } system("cls"); return key == ' '; } int main(void) { system("cls"); CURSOR_ERASE; srand((unsigned int)time(NULL)); while (title()) { memset(Field, EMPTY, sizeof(Field)); Status = GAME_DOING; Point = 0; create_block(); do { print_field(); print_block(); } while (operate_block()); print_end(); wait_enter(); } CURSOR_DISPLAY; return 0; }
@@momoharu 本当にありがとうございます🙇♂
何度もすみません。テトリスのように次に出てくるブロックを隣に表示できるようにしたいのですがどのようにすれば良いのでしょうか
〈momoharuサイト〉 sites.google.com/view/momoharu/ このサイトの、「C復習」の中に「ゲームサンプル」という章があり、その中に「1.テトリス風ゲーム」があります。 RUclips動画が見られるようになっていますので「C言語復習17 テトリス風ゲーム」を見てもらえますか? 28:24辺りで、次のブロックを表示するプログラムを説明しています。 ・NextBlockという二次元配列を作る ・rotate_block関数の引数を追加する C応用編を勉強した人向けの内容ですが、NextBlockがどの様に使われているのかをヒントに、自分のプログラムに応用してみてください。 人のプログラムを読むことは、非常に力がつきます。 習っていない事が多く入っていますが頑張って読んでみてください。
@@momoharu ありがとうございます!頑張ります
一気にコード書いてたらエラーがあちこち出て取り返しつかなくなってしまいました。 コードかファイルがありましたら欲しいです。
以下から、動画で作成したプログラムをダウンロードできます。 〈C基礎_練習問題38.cpp〉 drive.google.com/file/d/1hczfgb0_0Lmao3Jaiy7M2rI7VKW1uMbw/ 気をつけて欲しいのは、Web上でコピーすると、見えない文字が入り込んで、ビルドエラーが発生することがあります。必ず、ダウンロードしてから利用してくださいね。
@@momoharu ありがとうございます!助かります
日々視聴しております。助かります。 余談ですが、キャラクタが動きだすと感動してしまいます。 業務用アプリ開発では味わえない面白さです(^^♪
コメントありがとうございます。 私も、プログラムが思った通りに動く度に感動しています😊
とても勉強になります。ありがとうございます!
励みになるコメントありがとうございます🤗 頑張りま~す💪 (≧∀≦)
日々視聴しております。助かります。 藪蛇ですが、社会に出てから、高校数学公式を見るのは初めてです。(^^♪
実は、私も、この当たりの動画を作成するにあたり、本当に久しぶりに高校数学や物理を復習しました。 ChatGPTさんにも助けてもらいながら、方程式を解いていました。 ChatGPTさんは、考え方のヒントはくれますが、時々嘘をつくので、自分で検証しながらプログラムを作成しました。思った通りに玉がピタッと止った時は嬉しかったです。 数学や物理の公式を勉強する時に、ゲームを作ると、その有り難みが分るので、高校生にはゲームプログラミングがお勧めですね。 これからも、コメント宜しくお願いします。 ヾ(*´∀`*)ノ
最近コンポーネント指向にすっかりハマってしまいました。 「倉庫番」風ゲームをコンポーネント指向的に作ったのですが、ちょうどマップ作成用のエディタを作ろうかなと思っていたところでした。 (今はエクセルで作ってます) 新シリーズ楽しみにしています。
コメントありがとうございます。 ジャストタイミングだったんですね。 よかったです(*⌒▽⌒*) デザインパターンについても触れながら進めていこうと思っているので、進行が少し遅くなるかもしれませんので、ご容赦くださいね。 ヾ(*´∀`*)ノ
これもまた面白いネタねすね!たのしみです。ありがとうございます。
コメントありがとうございます。 頑張ります( ^o^)ノ
この動画で縦のスクロールの範囲の設定をしていますが、横のスクロール範囲を設定するエスケープシーケンスはありますか。もしあったら是非教えていただきたいです。
残念ながら、縦スクロールの様な範囲指定のスクロールを行う横スクロール用のエスケープシーケンスははありません。 という事で、範囲指定で横スクロールしたい場合は、自力でプログラミングしてください。
日々視聴しております、助かります。蛇足ですが、DXライブラリ利用(C言語)VS2022版 百春 · プレイリスト に、この動画が含まれていないと思いますですよ。
ご指摘ありがとうございます。 (*^-^*) 蛇足なんかじゃ、ぜんぜんありません! 感謝感謝です。 これからも、宜しくお願いします。 ヾ(*´∀`*)ノ
FlappyBurdとDoodleJumpをC#で作り終えました。 いつもながら有料級の動画を配信してくださりありがとうございます。 コンポーネント指向について少ずつですが理解できました。 正直、FlappyBurdまではコンポーネント指向のメリットがよく分からなかったのですが DoodleJumpで足場のスクロールに関する一連の実装を見たとき納得がいきました。 現在、DoodleJumpに以下のような小さな改造を加えてゲームを楽しんでいます。 ・背景画像を雲に変えてスクロールスピードを若干遅くしパララックス効果を出す ・左右の方向キーを離したとき少しずつスピードを落とす これからも素晴らしい動画を楽しみにしています。
コメントありがとうございます。 プログラムが動いた瞬間というのは嬉しいですよね。新たな機能を加えるのは、スキルアップにとても良いことですので、これからも頑張ってください。 私の方は、今まで中途半端に作っていたものを整理・整頓しながら、動画に仕立て直し中です。 なかなか新しいジャンルに突入できていませんが、自分のペースで進めていこうと思っています。 これからも、宜しく応援をお願いします。 (*⌒▽⌒*)Y
百春先生、本年(2024年)も楽しく学ばせていただきたいと思っています。よろしくお願いいたします。 さて、昨年末からサンジェイさんの本を読みやすくするため、SDLについても海外の人の動画で少しずつ学ぶようにし始めたところ、ECS(Entity Component System)というオブジェクト指向のコンポーネントモデルの先にあるものをよく見かけるようになりました。 どうやら最近のゲームに多い、大量のゲームオブジェクトを一画面に表示させるのに特に適したデータ指向のプログラミングと、私なりに見当をつけているのですが、こちらのECSについて、いつか本当にお暇な時で構いませんので、取り上げていただけたらと思っております。重ね重ねよろしくお願いします。
コメントありがとうございます。 プログラミングしていくと考え方の重要さが、ひしひしと身にしみますね。ECSは、データ指向型でゲームを作成する時に便利な機能という記事がありましたが、まずは、サンジェイさんのモデルを使って、やろうと思っている事を片付けたならば、ご要望頂いた様な新しい事にチャレンジしてみたいと思います。 要望に全てお応えできないかもしれませんが、これからも、どんどんコメントくださいね。 (*^-^*)Y
動画の中で、飛行時間を記録するメンバー変数を宣言していますが、その変数名が「飛行」を意味するFlightを使って、mFlightTimerと名付けるつもりが、mFrightTimerになってしまいました。この動画の次の回である「〈C++初歩編05_5〉DoodleJump風ゲーム(5) 竹コプターの装着と脱着」で元にしているプログラムでは、このスペルミスを修正したプログラムを使っています。 以上、スペルミスがあった事のお知らせまで😣
教えていただきありがとうございました。 動画の内容は丁寧に説明されていたので理解できました。
理解出来て良かったです😊