この記事はUEC25アドベントカレンダーその1の10日目の記事です。
昨日の記事は柴犬被りさんのうわっ…私のキー数、多すぎ…?でした。キーボードって自作できるんですね、この大学はいるまで知りませんでした!二日連続で書いてるのすごいですね…
はじめに
はじめまして。UEC25生Ⅱ類のタケノコです。
この記事は、プログラミングのことを一切知らずに入学し、特にゲーム作りに関係のないサークルに入った人間が、ぼっちでゲームを作った話です。(そういうわけで、有識者から見たらお粗末な部分が多いでしょうけど、ご容赦ください…)
やはりというべきか、電通大生にはゲーム作りに興味のある人が多いように感じます。そういう人に、一切知識がなくとも、仲間がいなくともゲームは作れると背中を押せたら幸いです。
何作ったの?
一応、作ったものへの導線を軽く乗っけておきます。
これはブロック崩しとフラッピーバード。プレイできないかもしれません。
こっちはりさじゅうのブラウザゲーム。
新歓
実のところ、別にゲーム自体はそこまで好きではなかったので(好きではありますよ!)、ゲーム作り系のサークルへ入ることは考えたものの見送りました。
結果として、Ⅱ類へ入った理由でもある、ロボットづくり系のサークルへ入りました。一応、そこでC言語を使うことになり、春時点からC言語の勉強だけは進めました。
4月〜夏休み前まで
さてC言語の勉強を始めたはいいものの、if文やらfor文やらの使いかた学んだところで楽しくないですよね。練習問題やったとこで「実際これ何の役に立つの??」って思いました。
そんなとき、YoutubeのCUIでテトリス作る動画を見つけました。そこで、腕試しも兼ねて、簡単そうな⭕️❌ゲームでも作ろうと思い立ちました。
下のがソースです。多分VisualStudioに貼れば動きます。
━━━━━━━━━━━━━━━━━
ソースコードを表示(折りたたみ)
━━━━━━━━━━━━━━━━━━
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main (void) {
int masu[3][3] = { {0,0,0},{0,0,0},{0,0,0} };
int i;
int j;
int tate;
int yoko;
int count = 1;
while (1) {
system("cls");
for (i = 0; i <= 2; i++) {
for (j = 0; j <= 2; j++) {
printf("|");
if (masu[i][j] == 0) {
printf(" ");
}else if (masu[i][j] == 1) {
printf("○");
}else if (masu[i][j] == 2) {
printf("×");
}
printf("|");
}
printf("\n");
}
for (i = 0; i <= 2; i++) {
if ((masu[i][0] == 1 && masu[i][1] == 1 && masu[i][2] == 1) ||
(masu[0][0] == 1 && masu[1][1] == 1 && masu[2][2] == 1) ||
(masu[0][2] == 1 && masu[1][1] == 1 && masu[2][0] == 1) ||
(masu[0][i] == 1 && masu[1][i] == 1 && masu[2][i] == 1)) {
printf("先攻の勝ちです");
return 0;
}
else if ((masu[i][0] == 2 && masu[i][1] == 2 && masu[i][2] == 2) ||
(masu[0][0] == 2 && masu[1][1] == 2 && masu[2][2] == 2) ||
(masu[0][2] == 2 && masu[1][1] == 2 && masu[2][0] == 2) ||
(masu[0][i] == 2 && masu[1][i] == 2 && masu[2][i] == 2)) {
printf("後攻の勝ちです");
return 0;
}
}
if (count == 10) {
printf("引き分けです");
return 0;
}
printf("\n\n|0,0||0,1||0,2|\n|1,0||1,1||1,2|\n|2,0||2,1||2,2|\n置きたいマスを入力してください:");
(void)scanf("%d,%d",&tate,&yoko);
if (masu[tate][yoko] == 0) {
if (count % 2 == 1) {
masu[tate][yoko] = 1;
}
else {
masu[tate][yoko] = 2;
}
count++;
}
Sleep(100);
}
return 0;
}
で、さすがに簡単だったかなと思って、改良した下の重力四目並べ作りました。流石にボードが今でも売られてるだけあって、人とやれば楽しいです。対戦相手は非売品ですが。
━━━━━━━━━━━━━━━━━
ソースコードを表示(折りたたみ)
━━━━━━━━━━━━━━━━━━
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(void) {
int masu[6][7] =
{
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0}
};
int i;
int j;
int tate;
int count = 1;
while (1) {
system("cls");
for (i = 1; i <= 7; i++) {
printf(" %d ",i);
}
printf("\n");
for (i = 0; i <= 5; i++) {
for (j = 0; j <= 6; j++) {
printf("|");
if (masu[i][j] == 0) {
printf(" ");
}
else if (masu[i][j] == 1) {
printf("○");
}
else if (masu[i][j] == 2) {
printf("●");
}
printf("|");
}
printf("\n");
}
for (i = 0; i <= 5; i++) {
for (j = 0; j <= 3; j++) {
if (masu[i][j] == 1 && masu[i][j + 1] == 1 && masu[i][j + 2] == 1 && masu[i][j + 3] == 1) {
printf("\n先攻の勝ちです");
return 0;
}
else if (masu[i][j] == 2 && masu[i][j + 1] == 2 && masu[i][j + 2] == 2 && masu[i][j + 3] == 2) {
printf("\n後攻の勝ちです");
return 0;
}
}
}
for (i = 0; i <= 2; i++) {
for (j = 0; j <= 6; j++) {
if (masu[i][j] == 1 && masu[i + 1][j] == 1 && masu[i + 2][j] == 1 && masu[i + 3][j] == 1) {
printf("\n先攻の勝ちです");
return 0;
}
else if (masu[i][j] == 2 && masu[i + 1][j] == 2 && masu[i + 2][j] == 2 && masu[i + 3][j] == 2) {
printf("\n後攻の勝ちです");
return 0;
}
}
}
for (i = 5; i >= 3; i--) {
for (j = 0; j <= 3; j++) {
if (masu[i][j] == 1 && masu[i - 1][j + 1] == 1 && masu[i - 2][j + 2] == 1 && masu[i - 3][j + 3] == 1) {
printf("\n先攻の勝ちです");
return 0;
}
else if (masu[i][j] == 2 && masu[i - 1][j + 1] == 2 && masu[i - 2][j + 2] == 2 && masu[i - 3][j + 3] == 2) {
printf("\n後攻の勝ちです");
return 0;
}
}
}
for (i = 0; i <= 2; i++) {
for (j = 0; j <= 3; j++) {
if (masu[i][j] == 1 && masu[i + 1][j + 1] == 1 && masu[i + 2][j + 2] == 1 && masu[i + 3][j + 3] == 1) {
printf("\n先攻の勝ちです");
return 0;
}
else if (masu[i][j] == 2 && masu[i + 1][j + 1] == 2 && masu[i + 2][j + 2] == 2 && masu[i + 3][j + 3] == 2) {
printf("\n後攻の勝ちです");
return 0;
}
}
}
if (count == 43) {
printf("\n引き分けです");
return 0;
}
printf("\n置きたい列を入力してください:");
(void)scanf("%d", &tate);
if (masu[0][tate - 1] == 0) {
if (count % 2 == 1) {
for (i = 0; i <= 6; i++) {
if (masu[i][tate-1] != 0) {
masu[i - 1][tate - 1] = 1;
break;
if (i == 6) {
masu[i - 1][tate - 1] = 1;
break;
}
}
}
} else {
for (i = 0; i <= 6; i++) {
if (masu[i][tate - 1] != 0) {
masu[i - 1][tate - 1] = 2;
break;
if (i == 6) {
masu[i - 1][tate - 1] = 2;
break;
}
}
}
}
count++;
}
Sleep(100);
}
return 0;
}
とはいえこの時点では、まだまだ本格的なゲームは作ってません。でも、CUIでゲームを作るのはお勧めです。シンプルだから、あまり調べたりAIに頼る必要もありません。プログラミングやってる感は一番強かったです。
夏休み前半
ぶっちゃけ、ゲーム作ってたのは夏休みだけです。なんで、前後半に分けます。
前半は、ライブラリ使ってゲーム作るのを試しました。DXライブラリとSiv3Dです。
DXライブラリ
一応、知らない人が多いと思うので、説明します。以下コピペ。
DXライブラリ Windows版は、DirectXを使ったWindowsデスクトップアプリの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。(使用する際はC言語の知識だけで大丈夫です)
これによってプログラマーはゲームの本質的なプログラムに専念することが出来ます。かなり本格的なソフト制作からお遊び程度のミニゲーム制作まで幅広くカバーしています!
プログラムソースも公開していますので気兼ねなく使用してください。
スポチャンサークルが新歓の時にC言語の勉強で下の本がお勧めだといっていたので、その本を買いました。(夏休みまでろくに開かなかったし、まだ全部読んでもいませんけど…)
何作った?
本の中にテニスゲーム(球跳ね返すやつ)はあったんですけどブロック崩しがなかったので、ブロック崩しつくりました。
実は初めの玉の位置だけがランダムなので、全てのブロックを壊せない可能性のが高いです。
Siv3D
Siv3D勉強会がありましたね。自分もあれの告知で知りました。勉強会行きたかったのに、思いっきり家族旅行と被りましたね…
一応説明コピペ。
Siv3D(シブスリーディー)は、音や画像、AI を使ったゲームやアプリを、モダンな C++ コードで楽しく簡単に開発できるオープンソースのフレームワークです。豊富なサンプルコードとチュートリアルが用意され、オンラインのユーザコミュニティで気軽に質問や相談ができます。
夏休み中にC++の勉強もちょこっとしました。競プロにも手をだしたんですけど、10月中ばから全然やれてないですね…
何作った?
フラッピーバードです。Unityの物理演算機能ってすごいんだなって思いました。この程度だからまだましだけど、本格的なゲームを全部自作の物理演算でやるのはなかなか重労働でしょうね。
夏休み後半
ゲームエンジンとやらに手を出しました。Unityですね。あと、自分のゲームは作ってないけど、Godotも少しだけ触りました。
Unity
言わずと知れた超大手ゲームエンジン。ソシャゲとかはほぼこれで作られてる。あの原神でさえ。サークルとかだと基本Unityを使うんですかね?
Godot
Unityと比べたら無名。でもどうやら海外だと人気らしいです。AIにゲームの作り方について聞くとめっちゃ勧めてきます。ジェンダーかなんかで広報が大炎上したらしいけど、別に知ったことではないですよね。
何作ったの?
Unityで初めに載っけたりさじゅうのブラウザゲーム作りました。ゲームエンジンは比較的簡単に本格的なゲーム作れてすごいですね。でも、ネット記事のコピペとAIばっかで、自分で作ってるって感じはあんまりしませんでした。プログラミングよりむしろソフトの使い方のほうが大事そうですね…それがわからないんだけど…
素材
何に苦労したって素材の準備です。「Unityはアセットストアあるから素材の準備は楽」ってよく書いてあるけど、そんなことはないです。まずダウンロード方がよくわからん上、無料のやつが見つかりません。しかも、あっても無料のって公式チュートリアルとかので、微妙にオリジナルで別のゲームを作るには使いにくいんですよね。
それに、自分だけの素材も使いたかったですし。
無料で素材だけが欲しいなら下のサイトがお勧めです。自分でドット絵描くならその下のソフトがお勧めです。
9月
ゲームじゃないけどマウスカーソル作りました。もし良かったら是非使ってみてください!
夏休みのゲームと比べると比較的ドット絵がいい感じにできましたね。
これから作る人へのアドバイス
まぁ偉そうなこと言えるほど知識と経験はないですけど。
思ってるより簡単なので、もし興味があるのならとりあえず手を出してみるのがいいと思います。まとまった時間の確保が難しいですけどね…
ただ、一人でも初心者でもやればできます。自分もできましたしね。一応注意点として下の二つを挙げます。
- 公開形式
DXライブラリで作ったゲームに関しては、UEC25あつまれ〜!で公開した際にウイルス判定を受けました。たぶん一番良いのは、ブラウザゲームとしての公開です。でも、ブラウザゲームを作る手段、公開するサイトは限られてます。本気で人にプレイして欲しいなら、どうしてもUnityroomを持ってるUnityが強いのかなと思います。あとは、フォロワーの多いSNSアカウントがあると強いでしょうね。自分にはなかったですが。 - アイディア
多分、一番重要なのはプログラムとかツールなんかよりもアイディアです。特に自分は作りたいゲームも形にしたいものもなかったので既存の何かのパクリばかりです。パクリでも、もっとオリジナリティをだせるといいんですけどね。
ツールに関する考察
プログラミング初心者は、ゲームが好きかどうかに関わらず一旦CUIのゲームを作るのはいいかもと思います。printfの出力を消す手段さえ調べれば、あとはどんな入門書にものってる基本しか使いません。
プログラミングの練習自体を主目的にするのであれば、DXライブラリやSiv3Dみたいなライブラリ型ゲームエンジンで作るのもいい選択肢なんじゃないでしょうか。統合型ゲームエンジンだとソフトの使い方に依存する部分がすごく多いですし、2Dのそこそこなレベルまでのゲームであれば、むしろライブラリ型で作る方が楽かもしれません。商用のゲームも作られているようですし。
C言語の文法だけで書ける、日本語情報が非常に多いことがDXライブラリのいいところです。対してSiv3Dは、公式のドキュメントの充実具合、(比較的)マルチプラットフォーム対応なのがいいところですね。Macの人だとDXライブラリは使えませんし、ベータ版?とはいえブラウザ用ビルドに対応してるのもいいのかなと思います。
ライブラリ型ゲームエンジンには、海外で人気らしいRaylib、Python用のPygame、Go言語用のEbitengineや、C#用のMonoGameとかもあります。とくにMonoGameは、Terrariaなんかの制作に使われたらしいです。自分は今Goを勉強中ですね。まぁ、ゲーム作る方法はUnityだけじゃないってことです。
とはいえ、ゲームを作ることが目的な人、面白いゲームが作りたい人、多くの人に遊んで欲しい人は統合型ゲームエンジン、特にUnityがオススメかなと思います。2Dだけでいいよって人ならGodotも選択肢の一つに入ってきそうですね。統合型ゲームエンジンでも2Dならそこまで重くならないですし、たいしてプログラムの知識も必要ないです。
ちょうどいいことにUnityRoomのイベント、Unity1weekが12月22日からスタートです。この機会に参加してみるのもいいかもしれませんね。
感想
まぁぶっちゃけ、すでに経験がある人や、サークルでがちで作っているような人と比較すると自分のゲームはお粗末な出来です。困ったときに聞ける人もいないですし、やっぱり本気で作りたい人はサークルに入ったり、仲間を見つけたりしたほうがよさそうです。なんか新しいサークルはいろうかなぁ
記事は、無駄に長い上調べれば5分でわかる情報くらいしかのせられなかったのが残念。初心者の背中を押せる記事を作りたかったんですけどね。初めてQiitaで記事を書いたんですけど、書きやすかったですし、今後はもっと発信をしていきたいです。
明日はトラマトさんの Geminiを酷使して、1日を27時間にしてみるです。サークル、課題、長距離通学、時間が足りないと感じるばかりなので気になりますね!!


