Advanced Search
Search Results
186 total results found
第1回 スライドパズルを作ろう
スライドパズルを作ろう これまでC言語を使って、Hit & Blowゲームを作ってきました。 Hit & Blowでは、変数や配列だけでなく、構造体や関数を使って処理を整理する方法や、ゲームを繰り返し動かすゲームループについても学習しました。 これまでに学習したC言語を使って、コンソールで動くスライドパズルを作ってみよう! 新しい文法を覚えることよりも、構造体・関数・ゲームループなど、学習済みの内容を組み合わせてゲームを作ることが目標です。 1.今回作るゲーム スライドパズルは、数字の書かれたタイルを空いている場...
第2回 盤面の作成
盤面を作って表示しよう まずは、スライドパズルの盤面をプログラムの中に作って、画面に表示してみよう! ここでは、次の4つを作ります。 Board構造体 Position構造体 InitBoard() PrintBoard() Visual Studioで使う準備 Visual Studioでscanf()などを使うと、C4996の警告が出ることがあります。 授業でいつも使っているように、ファイルの一番上へ次の1行を書いておこう! #define _CRT_SECURE_NO_WARNINGS そのあとに、標...
第3回 そのタイル動く?
タイルを探して動かせるか調べよう このページでは、指定したタイルが動かせるかどうかを調べます。 スライドパズルでは、空白の上下左右にあるタイルだけを動かせます。 そのためには、まず、 空白はどこにある? 動かしたいタイルはどこにある? を調べる必要があります。 そこで、最初に**指定したタイルの位置を探すSearchTile()**を作ってみよう! タイルと空白の位置が分かったら、次にその2つが隣り合っているかを調べる**CanMoveTile()**を作ります。 1.指定したタイルの位置を探そう 例えば、次...
第4回 そのタイル動くよ!
タイルを動かそう スライドパズルでは、動かせるタイルを選んだら、そのタイルを空白の場所へ移動します。 このページでは、実際にタイルを動かすMoveTile()を作ってみよう! タイルを動かすには、 ① そのタイルが動かせるか調べる ② 空白の位置を探す ③ 動かすタイルの位置を探す ④ タイルと空白の値を入れ替える という処理が必要です。 ①では前のページで作ったCanMoveTile()、②と③ではSearchTile()を使えます。 新しく作るMoveTile()では、これらを使いながら最後にタイルと空白の値...
第5回 パズルが出来るようになりそう!
ゲームを完成させよう IsClear()で完成状態を判定して、作ってきた関数をゲームループに組み込んでみよう! 1.クリアしたか調べよう 完成状態では、InitBoard()で入れたときと同じように、どの場所でも 正しい値 = 配列の添字 + 1 になっています。 1か所でも違う場所があれば、まだクリアしていません。 穴埋め int IsClear(Board* board) { for (int i = 0; i < BOARD_WIDTH * BOARD_HEIGHT; i++) { ...
第6回 解けるようにパズルの問題を作りたい欲
パズルの問題を作ろう ゲーム開始時に盤面を崩して、遊べる問題を作ってみよう! 1.数字をランダムに並べるだけではダメ 例えば、乱数を使って1~16を適当に並べれば、ランダムな盤面は作れそうです。 しかし、スライドパズルにはどう動かしても完成できない並びがあります。 そのため、数字を完全にランダムに並べる方法で出題すると無理ゲーになっちゃいます。 2.完成状態から崩せばよい 完成状態から始めて、 動かせるタイルを1枚動かす ↓ また動かせるタイルを1枚動かす ↓ これを何回も繰り返す という方法で盤面を崩...
第7回 あとできることって何?
完成!そして自由制作へ C言語版スライドパズルの基本部分が完成したはず。 最後に全体の構成を確認して、自分だけの機能を追加してみよう! こうやって次々出来ることやれることを追加していくと、ゲーム作るって、終わりがないよね。 1.今回作った関数 作った関数と役割を確認してみよう。 InitBoard() PrintBoard() SearchTile() CanMoveTile() MoveTile() IsClear() ShuffleBoard() InitBoard() 盤面を初期化する Pri...
第1回 ゲームのシーケンス(画面遷移)を作る
第1回 ゲームループと画面の切り替えを作ろう 今回やること 今回から、コンソール版で作ったスライドパズルをDxLibのゲームへ作り替えていきます。 いきなりパズルの盤面を描くのではなく、まずはゲーム全体の流れを作ります。 今回のゲームでは、次の3つの画面を使います。 タイトル画面 プレイ画面 クリア画面 最初にこの3つを切り替えられるようにしておくと、このあと作るパズルの処理を「プレイ画面の中」へ順番に追加していけます。 1.ゲームの「状態」を作ろう 今、どの画面を表示しているのかを覚えておく必要がありま...
第2回 盤面を描画するまで
第2回 コンソール版の盤面をDxLibで表示しよう 今回やること 第1回では、 TITLE → PLAY → CLEAR → TITLE というゲーム全体の流れを作りました。 今回はPLAY画面へ、コンソール版で作ったスライドパズルの盤面を表示します。 パズルの仕組みを最初から作り直すのではありません。 コンソール版で作った、 盤面データ タイルを探す処理 動かせるか調べる処理 タイルを動かす処理 クリア判定 シャッフル は、そのまま利用します。 パズルの中身を作り直す必要はありません。 今回、DxLib用に...
第3回 マウスでタイルを動かす
第3回 マウスでタイルを動かそう 今回やること 前回は、コンソール版のBoardを使い、タイル画像で盤面をDxLibのウィンドウへ表示しました。 今回は、マウスでタイルを選んで動かせるようにします。 コンソール版では、 scanf() ↓ タイル番号 ↓ MoveTile() という流れでした。 DxLib版では、 マウスクリック ↓ クリックした場所のタイル番号 ↓ MoveTile() に変えます。 MoveTile()そのものは、コンソール版で作ったものをそのまま使います。 つまり今回は、...
第4回 クリア判定(はとても簡単)と問題生成(すでにある)
第4回 スライドパズルをゲームとして完成させよう 今回やること 前回までで、 盤面を描く マウスでタイルを選ぶ タイルを動かす ところまでできました。 ただし、ゲームを始めても盤面は完成状態のままです。 今回は、コンソール版ですでに作った、 ShuffleBoard() IsClear() をゲームの流れへつなぎます。 今回が終わると、 TITLE ↓ 問題を作る ↓ PLAY ↓ パズルを完成 ↓ CLEAR ↓ TITLE と、最初から最後まで遊べるスライドパズルになります。 ...
第5回 画面の調整(自分でかっこよくすればいいじゃん)
第5回 タイトル画面とクリア画面を仕上げよう 今回やること 前回までで、 TITLE ↓ PLAY ↓ CLEAR ↓ TITLE と、スライドパズルを最初から最後まで遊べるようになりました。 今回は新しいパズルの仕組みを増やすのではなく、 タイトル画面 プレイ画面 クリア画面 の見た目を仕上げます。 そのあと、ここまで作った関数を見直して、 どの関数が、どんな仕事を担当しているのか を整理します。 1.今の背景処理を見てみよう 第4回のゲームループでは、switchより前に次の処理がありま...
第6回 あとやれることある?
第6回 完成と自由制作 今回やること 前回までで、基本版のスライドパズルは完成しました。 今回は最初に、完成したプログラムが正しく動くことを確認します。 そのあと、自分で追加したい機能を1つ選んで、作品を仕上げてみよう! 自由制作でも、 何を追加する? ↓ どのデータが必要? ↓ どこで値を変える? ↓ どこで描く? ↓ 実行して確認 という順番で考えていきます。 1.ここまで作ったゲームの流れ 第1回では、最初にゲーム全体の入れ物を作りました。 そこへ少しずつスライドパズルの処...
第1回 倉庫お片付けゲーム(コスコマン)を作る
第1回 倉庫お片付けゲーム(コスコマン)を作る これから、倉庫お片付けゲーム(コスコマン) を作ります。 コスコマンは、倉庫の中にある荷物を押して、決められたゴールへ片付けていくパズルゲームです。 今回はまだプログラムを書きません。まず、どんなゲームを作るのかを見ていきましょう。 1.どうして「コスコマン」? 名前の元になっているのは、倉庫型のお店として有名なCOSTCOです。 日本では「コストコ」と呼ばれていますが、英語での発音をカタカナへ無理やり近づけると「コスコ」に近く聞こえます。 そこで、倉庫の中で荷物...
第2回 文字でステージを表示しよう
第2回 文字でステージを表示しよう 前回確認したコスコマンのステージを、今回はDxLibのウィンドウへ表示します。 目標は次の画面です。 ########## # # # . # # $ # # @ # # # ########## まだ@は動きません。まずは、数字で持っているステージを文字へ変えて描くところまで作ります。 1.まず、プログラム全体の流れを見よう ステージを表示するまでの大まかな流れは、次のようになります。 // ステージのデータと関数...
第3回 まずコスコマンを動かしてみよう
第3回 まずコスコマンを動かしてみよう 前回は、Mapの数字を文字へ変えてステージを表示しました。 今回は、Mapの中にいるコスコマンを探して、まず実際に動かします。 ここでは、まだ壁や荷物の判定は作りません。 **「Mapを書き換えると、画面上の@も動いて見える」**ことを先に確認します。 今回の流れ Mapからコスコマンの位置を探す ↓ 押したキーから移動先を決める ↓ 元のマスを床へ戻す ↓ 移動先をコスコマンのマスにする ↓ Mapを描くと、@...
第4回 移動処理を整理しよう
第4回 移動処理を整理しよう 前回は、WASDごとに移動先を直接計算しました。 W : nextPos.y = playerPos.y - 1; A : nextPos.x = playerPos.x - 1; S : nextPos.y = playerPos.y + 1; D : nextPos.x = playerPos.x + 1; 4つを見比べると、やっていることはどれも、 現在位置に「どちらへ1マス進むか」を足す という同じ処理です。 今回は、この重複を整理します。 今回の流れ W / A / ...
第5回 壁とゴールを判定しよう
第5回 壁とゴールを判定しよう 前回までの移動は、移動先のマスを見ずにHUMANで上書きしていました。 そのため、壁も荷物もゴールも消せます。 📺 第動画で確認 移動するときは、次の順で考えます。 今回の流れ 現在位置 ↓ 移動先を計算 ↓ 移動先に何がある? ↓ 動ける/動けないを決める 1.指定した位置に何があるか調べよう Pointで位置を渡すと、そのマスの種類を返すGetObjectNum()を作ります。 OBJNAMEの値を再び OBJNAMEは、Mapの1マスに何が入ってい...
第6回 荷物を押そう
第6回 荷物を押そう 前回は、コスコマンが床とゴールの上を歩き、壁や荷物の前で止まる処理を作りました。 今回は、コスコマンの前にある荷物を1マス押せるようにします。 今回できるようになること この回を完成させると、次の動きができるようになります。 荷物の先が床なら、荷物を1マス押す 荷物の先がゴールなら、荷物をゴールへ押す 荷物の先が壁・別の荷物・Mapの外なら、何も動かさない コスコマンや荷物がゴールから移動しても、ゴールを消さない 荷物を押すときは、横に並んだ3マスを調べます。 コスコマン → 荷物 → 荷...
第7回 文字版コスコマンを完成させよう
第7回 文字版コスコマンを完成させよう 前回までで、コスコマンは壁に止まり、ゴールを消さずに歩き、荷物を押せるようになりました。 今回は、文字版をゲームとして最後まで遊べるようにします。 今回できるようになること すべての荷物をゴールへ置くとクリアになる クリア後にENTERを押すと、次のステージへ進む Rを押すと、現在のステージを開始時の配置で読み込み直す 3つのステージを順番に遊べる 最後のステージをクリアすると、最初のステージを読み込む ゲーム中の処理は、次の順番で行います。 プレイ中 ↓ Rが...