「ゲームプログラマになる前に覚えておきたい技術」読み始めました

1章の荷物君を作ってみました。かかった時間は1時間10分
f:id:skru_y:20130914210614j:plain

#include <iostream>
using namespace std;


const int STAGE_HEIGHT = 5;
const int STAGE_WIDTH = 10;

char gameStage[STAGE_HEIGHT][STAGE_WIDTH] = 
                       { 	"########\n",
                       	"# ..   #\n",
                       	"# oo   #\n",
                       	"#      #\n",
                       	"########\n" };

char input()
{
	char c;
	cin >> c;
	return c;
}
void moveO(int x, int y)
{
	if(gameStage[y][x]=='.')
		gameStage[y][x] = 'O';
	else
		gameStage[y][x] = 'o';
}
void deleteO(int x, int y)
{
	gameStage[y][x] = ' ';
}
bool isComplate()
{
	int numO = 0;
	for(int i=0; i<STAGE_HEIGHT; i++)
	{
		for(int j=0; j<STAGE_WIDTH; j++)
		{
			if(gameStage[i][j] == 'O')
				numO++;
		}
	}

	if(numO == 2)
		return true;
	else
		return false;
}


class PLAYER
{
public:
	PLAYER(int xStart = 4, int yStart = 1)
	{
		x = xStart;
		y = yStart;
	}
	void moveP(char c)
	{
		switch(c)
		{
		case 'w': //上
			//移動方向に 'o' があり、その先は' 'か'.'
			if(gameStage[y-1][x]=='o'
				&& gameStage[y-2][x]!='o'
				&&	gameStage[y-2][x]!='#')
			{
				y--;
				deleteO(x, y);
				moveO(x, y-1);
			}
			else if(gameStage[y-1][x]==' '
					|| gameStage[y-1][x]=='.')
			{
				y--;
			}
			break;
		case 's': //下
			//移動方向に 'o' があり、その先は' 'か'.'
			if(gameStage[y+1][x]=='o'
				&&gameStage[y+2][x]!='o'
				&& gameStage[y+2][x]!='#')
			{
				y++;
				deleteO(x, y);
				moveO(x, y+1);
			}
			else if(gameStage[y+1][x]==' '
					|| gameStage[y+1][x]=='.')
			{
				y++;
			}
			break;
		case 'a': //左
			//移動方向に 'o' があり、その先は' 'か'.'
			if(gameStage[y][x-1]=='o'
				&& gameStage[y][x-2]!='o'
				&& gameStage[y][x-2]!='#')
			{
				x--;
				deleteO(x, y);
				moveO(x-1, y);
			}
			else if(gameStage[y][x-1]==' '
					 || gameStage[y][x-1]=='.')
			{
				x--;
			}
			break;
		case 'd': //右
			//移動方向に 'o' があり、その先は' 'か'.'
			if(gameStage[y][x+1]=='o'
				&& gameStage[y][x+2]!='o'
				&& gameStage[y][x+2]!='#')
			{
				x++;
				deleteO(x, y);
				moveO(x+1, y);
			}
			else if(gameStage[y][x+1]==' '
					 || gameStage[y][x+1]=='.')
			{
				x++;
			}
			break;
		default:
			break;
		}
	}
	void displayP() const
	{
		for(int i=0; i<STAGE_HEIGHT; i++)
		{
			for(int j=0; j<STAGE_WIDTH; j++)
			{
				if(i==y && j==x)
				{
					cout << 'p';
				}
				else if(gameStage[i][j] != '\0')
				{
					cout << gameStage[i][j];
				}
			}
		}
	}
private:
	int x;
	int y;
};



int main()
{
	PLAYER player;
	player.displayP();



	while(true)
	{
		char c = input();
		player.moveP(c);
		player.displayP();
		if(isComplate() == true)
		{
			cout << "Good!";
			break;
		}
	}

	//ストッパー
	while(true);


	return 0;
}

良かった点 : 1時間程度で作成できた、衝突判定と応答が正しく実装されている。
悪かった点 : 拡張性がない。
あとは、STAGEクラスを作って荷物とプレイヤーを管理させると良かったかもしれません。

参考書籍

ゲームプログラマになる前に覚えておきたい技術

ゲームプログラマになる前に覚えておきたい技術