ゲーム制作において

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
零夜

ゲーム制作において

#1

投稿記事 by 零夜 » 3年前

今、VisualStudio2019,C言語にてシンプルなゲームを制作しています。

テトリスのようなフィールドで、上から降りてくるブロックをフィールドの一番下にいる自機から発射される弾で撃っていき、ブロックがフィールドの一番下まで来てしまったらゲームオーバー、ブロックが一番下まで来ないように1分間耐えられたらゲームクリアといったものを考えています。
その降りてくるブロックのことなのですが、思ったように動かせていません。

下記のように動かしたいです。

<現在>
■■■ ■ ■■■■■   ■■■ ■ ■■■■■   ■■■ ■ ■■■■■
        →  ■■ ■■■■■■■■ → ■■ ■■■■■■■■
                     ■■■■■ ■■ ■■
<目標>
■■■ ■ ■■■■■   ■■ ■■■■■■■■   ■■■■■ ■■ ■■
        →  ■■■ ■ ■■■■■ → ■■ ■■■■■■■■
                     ■■■ ■ ■■■■■
(ブロックのずれは関係ないです)

以下コードです

コード:

#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h> // system()
#include <windows.h> // Sleep()

#define SIZE_X 14
#define SIZE_Y 21
#define WALL 1
#define BLOCK 4

int main()
{
	int c = 0;
	int wait_time = 600;
	int x, y;
	int bx, by; //ブロックの座標
	int r;
	int timecount = 60;
	int field[SIZE_Y][SIZE_X] =
	{
		{1,1,1,1,1,1,1,1,1,1,1,1,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1}, //センター
		{1,0,0,0,0,0,0,0,0,0,0,0,1}, //センター
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,1,1,1,1,1,1,1,1,1,1,1,1},
	};
	//ブロックを初期位置へ
	bx = 1, by = 1;

	while (1)
	{
		//BLOCKの動き
		srand(time(NULL)); //横方向のBLOCK表示は乱数でランダムに
		for (bx = 1; bx < 11; bx++) //1つずつ決めていく
		{
			r = rand() % 2;
			switch (r)
			{
			case 0: //r=0なら表示しない
				field[by][bx] = 0;
				break;

			case 1: //r=1なら表示
				field[by][bx] = BLOCK;
				break;
			}
		}
		by++; //1座標進める 

		if (by == 19) //もしブロックが一番下まで到達したらゲームオーバー
		{
			printf("GAME OVER \n");
			break;
		}

		//画面表示 
		for (y = 0; y < SIZE_Y; y++)
		{
			for (x = 0; x < SIZE_X; x++)
			{
				switch (field[y][x])
				{
				case 0:
					printf(" ");
					break;
				case WALL: //壁
					printf("■");
					break;
				case BLOCK: //ブロック
					printf("□");
					break;
				}
			}
			printf("\n");
		}

		Sleep(wait_time); //少しの時間止める
		system("cls"); //画面消去
	}
	return 0;
}
C言語は主に入出力、反復、条件、配列を勉強済です。

よろしくお願いいたします。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: ゲーム制作において

#2

投稿記事 by あたっしゅ » 3年前

コード:

//#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h> // system()
#include <windows.h> // Sleep()
#include <time.h>  // time()


#define SIZE_X 14
#define SIZE_Y 21
#define WALL 1
#define BLOCK 4

int main()
{
	int c = 0;
	int wait_time = 600;
	int x, y;
	int bx, by; //ブロックの座標
	int r;
	int timecount = 60;
	int field[SIZE_Y][SIZE_X] =
	{
		{1,1,1,1,1,1,1,1,1,1,1,1,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1}, //センター
		{1,0,0,0,0,0,0,0,0,0,0,0,1}, //センター
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,1,1,1,1,1,1,1,1,1,1,1,1},
	};

	//ブロックを初期位置へ
	bx = 1, by = 1;
	srand(time(NULL)); //横方向のBLOCK表示は乱数でランダムに // Mainloop の外に移動。

	while (1)
	{
		// BLOCK を下にスクロール。
		for (y = SIZE_Y - 4; y>0; y--)
		{
			for (x = 1; x < SIZE_X - 1; x++)
			{
				field[y + 1][x] = field[y][x];
			}
		}

		//BLOCK 発生
		for (bx = 1; bx < 11; bx++) //1つずつ決めていく
		{
			r = rand() % 2;
			switch (r)
			{
			case 0: //r=0なら表示しない
				field[by][bx] = 0;
				break;

			case 1: //r=1なら表示
				field[by][bx] = BLOCK;
				break;
			}
		}
		//by++; //1座標進める 

		//if (by == 19) //もしブロックが一番下まで到達したらゲームオーバー
		//{
		//	printf("GAME OVER \n");
		//	break;
		//}

		//画面表示 
		for (y = 0; y < SIZE_Y; y++)
		{
			for (x = 0; x < SIZE_X; x++)
			{
				switch (field[y][x])
				{
				case 0:
					printf(" ");
					break;
				case WALL: //壁
					printf("■");
					break;
				case BLOCK: //ブロック
					printf("□");
					break;
				}
			}
			printf("\n");
		}

		// BLOCK ブロックが一番下まで到達しているか ?
		for (x = 1; x < SIZE_X - 1; x++)
		{
			if (field[SIZE_Y - 3][x] == BLOCK) {
				printf("GAME OVER \n");
				break;
			}
		}


		Sleep(wait_time); //少しの時間止める
		system("cls"); //画面消去
	}
	return 0;
}


// end.
東上☆海美☆「
VS2019 コンソール C++ モード。
こんな感じみみ ?
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

黎夜
記事: 1
登録日時: 3年前

Re: ゲーム制作において

#3

投稿記事 by 黎夜 » 3年前

あたっしゅ さんが書きました:
3年前

コード:

//#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h> // system()
#include <windows.h> // Sleep()
#include <time.h>  // time()


#define SIZE_X 14
#define SIZE_Y 21
#define WALL 1
#define BLOCK 4

int main()
{
	int c = 0;
	int wait_time = 600;
	int x, y;
	int bx, by; //ブロックの座標
	int r;
	int timecount = 60;
	int field[SIZE_Y][SIZE_X] =
	{
		{1,1,1,1,1,1,1,1,1,1,1,1,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1}, //センター
		{1,0,0,0,0,0,0,0,0,0,0,0,1}, //センター
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,1,1,1,1,1,1,1,1,1,1,1,1},
	};

	//ブロックを初期位置へ
	bx = 1, by = 1;
	srand(time(NULL)); //横方向のBLOCK表示は乱数でランダムに // Mainloop の外に移動。

	while (1)
	{
		// BLOCK を下にスクロール。
		for (y = SIZE_Y - 4; y>0; y--)
		{
			for (x = 1; x < SIZE_X - 1; x++)
			{
				field[y + 1][x] = field[y][x];
			}
		}

		//BLOCK 発生
		for (bx = 1; bx < 11; bx++) //1つずつ決めていく
		{
			r = rand() % 2;
			switch (r)
			{
			case 0: //r=0なら表示しない
				field[by][bx] = 0;
				break;

			case 1: //r=1なら表示
				field[by][bx] = BLOCK;
				break;
			}
		}
		//by++; //1座標進める 

		//if (by == 19) //もしブロックが一番下まで到達したらゲームオーバー
		//{
		//	printf("GAME OVER \n");
		//	break;
		//}

		//画面表示 
		for (y = 0; y < SIZE_Y; y++)
		{
			for (x = 0; x < SIZE_X; x++)
			{
				switch (field[y][x])
				{
				case 0:
					printf(" ");
					break;
				case WALL: //壁
					printf("■");
					break;
				case BLOCK: //ブロック
					printf("□");
					break;
				}
			}
			printf("\n");
		}

		// BLOCK ブロックが一番下まで到達しているか ?
		for (x = 1; x < SIZE_X - 1; x++)
		{
			if (field[SIZE_Y - 3][x] == BLOCK) {
				printf("GAME OVER \n");
				break;
			}
		}


		Sleep(wait_time); //少しの時間止める
		system("cls"); //画面消去
	}
	return 0;
}


// end.
東上☆海美☆「
VS2019 コンソール C++ モード。
こんな感じみみ ?
(掲示板初心者なもので質問投稿の仕方を間違えていました別垢で失礼いたします)
な、なるほど…分かりやすくありがとうございます...!
これからも精進します
ありがとうございました...!!

返信

“C言語何でも質問掲示板” へ戻る