#include<cstdio>
//queueクラスのinclude
#include<queue>
//定数INF1000の宣言
#define INF -1
//std名前空間の宣言
using namespace std;
//z座標とy座標をメンバに持つ構造体Pの宣言
struct P{
int x,y;
};
//初期マップの宣言 0:何もないマス 1:黒く塗りつぶされているマス
int Map[5][5]={{0,1,0,0,0},
{0,0,0,1,0},
{1,1,1,1,0},
{0,0,0,0,0},
{0,0,0,1,0}};
//4方向を表すために用いる配列(x用)
int dx[4]={0,1,0,-1};
//4方向を表すために用いる配列(y用)
int dy[4]={1,0,-1,0};
/*
この2つの配列については実際に使用しているfor文のところを見て
ax,ayの値がどのように変化しているかトレースをしてみてください。
*/
//make_P→Pを作る 関数
//2つの引数を使って構造体Pを宣言してそれぞれをメンバとし、完成したP型の構造体を返す
P make_P(int a,int b)
{
P s;s.x=a;s.y=b;
return s;
}
int main()
{
//P型のqueueクラスqの宣言
queue<P> q;
//qに初期座標である(0,0)を入れておく
//make_Pを使うことでP型の変数が返ってくるのでこのように要素を追加できる
q.push(make_P(0,0));
//各マスに対する歩数を格納する配列cntの宣言
int cnt[5][5];
//cntのすべての要素をINFで初期化する
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
cnt[i][j]=INF;
}
}
//初期座標までの歩数を0で初期化する
cnt[0][0]=0;
//q.empty()→qが空の状態かどうかを返す 空だったら:真 空じゃなかったら:偽
while(!q.empty()){
//qのfrontのx情報とy情報を取り出して変数xx,yyに格納する
int xx=q.front().x,yy=q.front().y;
//qの先頭を削除する。
q.pop();
//dx,dyを回すために使用するfor文(これを使うと4方向への処理がfor文のみで済む)
for(int i=0;i<4;i++){
//axにxx+dx[i]の値,ayにyy+dy[i]の値を代入する
int ax=xx+dx[i],ay=yy+dy[i];
//ax,ayがマップの範囲内に収まっているか?
if(ax>=0 && ax<5 && ay>=0 && ay<5){
//歩数の配列にまだ初期値が入っている(未到達)かつ
//初期マップ上では黒く塗りつぶされていないか
if(cnt[ax][ay]==INF && Map[ax][ay]!=1){
//歩数に今いるマス(xx,yy)のマスまでの歩数+1を代入する(一歩動くから)
cnt[ax][ay]=cnt[xx][yy]+1;
//qに一歩動いた先のマスの座標を格納する。
q.push(make_P(ax,ay));
}
}
}
}
//歩数を格納している配列からゴールの座標の値を出力する
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(cnt[i][j]>0)printf("%3d",cnt[i][j]);
else printf(" #");
}
puts("");
}
return 0;
}
横型探索を組み込みたいプログラムです
↓
各種動作のメソッド↓
getReady()
walkUp()
walkDown()
walkLeft()
walkRight()
searchUp()
searchDown()
searchLeft()
searchRight()
lookUp()
lookDown()
lookLeft()
lookRight()
putUp()
putDown()
putLeft()
putRight()
*/
/*******自作関数*******/
//ここに自作関数を宣言
void map_getready(void);//mapping
void map_searchup(void);//mapping
void map_searchdown(void);//mapping
void map_searchright(void);//mapping
void map_searchleft(void);//mapping
void map_lookup(void);//mapping
void map_lookdown(void);//mapping
void map_lookright(void);//mapping
void map_lookleft(void);//mapping
void map_walkdown(void);//mappng
void map_walkup(void);//mapping
void map_walkright(void);//mapping
void map_walkleft(void);//mapping
void f_baba(void); //外周
void check(void);//mapping check
void original(void);//実戦
/*********グローバル変数*********/
int wh_map[70][70];
int x=70/2;
int y=70/2;
int mode=1; //現在のモード
int old_mode=1; //前のモード
/*******************************/
int main()
{
int i=0;
int j=0;
//サーバーと接続する。もし失敗したらプログラムを終了
if(Connect()==false)return 0;
for (i=0;i<70;i++) //二次元配列の初期化
{
for (j=0;j<70;j++)
{
wh_map[i][j]=5;
}
}
while(1)
{
map_getready();
check();
f_baba(); //外周
}
//↓キニスンナ
// ソケットの解放
closesocket(sct);
// winsocketの解放
WSACleanup();
return 0;
}
void map_walkup(void)
{
walkUp();
y--;
}
void map_walkright(void)
{
walkRight();
x++;
}
void map_walkdown(void)
{
walkDown();
y++;
}
void map_walkleft(void)
{
walkLeft();
x--;
}
void map_getready(void)
{
getReady();
int gr=0;
int gr2=0;
int gr3=1;
if (v[2]==1 || v[4]==1 || v[6]==1 || v[8]==1) //上下左右に敵がいたらput
{
mode=6;
}
else if (v[1]==1 || v[3]==1 || v[7]==1 || v[9]==1) //斜めに敵がいたらput
{
mode=8;
}
else if (v[2]==3 || v[4]==3 || v[6]==3 || v[8]==3) //上下左右にハートがあったら取る
{
old_mode=mode;
mode=5;
}
else if (v[1]==3 || v[3]==3 || v[7]==3 || v[9]==3) //斜めにハートがあったら取る
{
old_mode=mode;
mode=7;
}
/*
wh_map[y-1][x-1]=v[1];
wh_map[y-1][x]=v[2];
wh_map[y-1][x+1]=v[3];
wh_map[y][x-1]=v[4];
wh_map[y][x]=v[5];
wh_map[y][x+1]=v[6];
wh_map[y+1][x-1]=v[7];
wh_map[y+1][x]=v[8];
wh_map[y+1][x+1]=v[9];
*/
for (gr=-1;gr<=1;gr++)
{
for (gr2=-1;gr2<=1;gr2++)
{
wh_map[y+gr][x+gr2]=v[gr3++];
}
}
}
void map_searchup(void)
{
searchUp();
int su=0;
/*
wh_map[y-1][x]=v[1];
wh_map[y-2][x]=v[2];
wh_map[y-3][x]=v[3];
wh_map[y-4][x]=v[4];
wh_map[y-5][x]=v[5];
wh_map[y-6][x]=v[6];
wh_map[y-7][x]=v[7];
wh_map[y-8][x]=v[8];
wh_map[y-9][x]=v[9];
*/
for (su=1;su>=9;su++)
{
wh_map[y-su][x]=v[su];
}
}
void map_searchright(void)
{
searchRight();
int sr=0;
/*
wh_map[y][x+1]=v[1];
wh_map[y][x+2]=v[2];
wh_map[y][x+3]=v[3];
wh_map[y][x+4]=v[4];
wh_map[y][x+5]=v[5];
wh_map[y][x+6]=v[6];
wh_map[y][x+7]=v[7];
wh_map[y][x+8]=v[8];
wh_map[y][x+9]=v[9];
*/
for (sr=1;sr>=9;sr++)
{
wh_map[y][x+sr]=v[sr];
}
}
void map_searchdown(void)
{
searchDown();
int sd=0;
/*
wh_map[y+1][x]=v[1];
wh_map[y+2][x]=v[2];
wh_map[y+3][x]=v[3];
wh_map[y+4][x]=v[4];
wh_map[y+5][x]=v[5];
wh_map[y+6][x]=v[6];
wh_map[y+7][x]=v[7];
wh_map[y+8][x]=v[8];
wh_map[y+9][x]=v[9];
*/
for (sd=1;sd>=9;y++)
{
wh_map[y+sd][x]=v[sd];
}
}
void map_searchleft(void)
{
searchLeft();
int sl=0;
/*
wh_map[y][x-1]=v[1];
wh_map[y][x-2]=v[2];
wh_map[y][x-3]=v[3];
wh_map[y][x-4]=v[4];
wh_map[y][x-5]=v[5];
wh_map[y][x-6]=v[6];
wh_map[y][x-7]=v[7];
wh_map[y][x-8]=v[8];
wh_map[y][x-9]=v[9];
*/
for (sl=1;sl>=9;sl++)
{
wh_map[y][x-sl]=v[sl];
}
}
void map_lookup(void)
{
lookUp();
int lu=0;
int lu2=0;
int lu3=1;
/*
wh_map[y-3][x-1]=v[1];
wh_map[y-3][x]=v[2];
wh_map[y-3][x+1]=v[3];
wh_map[y-2][x-1]=v[4];
wh_map[y-2][x]=v[5];
wh_map[y-2][x+1]=v[6];
wh_map[y-1][x-1]=v[7];
wh_map[y-1][x]=v[8];
wh_map[y-1][x+1]=v[9];
*/
for (lu=-3;lu<=-1;lu++)
{
for (lu2=-1;lu2<=1;lu2++)
{
wh_map[y+lu][x+lu2]=v[lu3++];
}
}
}
void map_lookright(void)
{
lookRight();
int lr=0;
int lr2=0;
int lr3=1;
/*
wh_map[y-1][x+1]=v[1];
wh_map[y-1][x+2]=v[2];
wh_map[y-1][x+3]=v[3];
wh_map[y][x+1]=v[4];
wh_map[y][x+2]=v[5];
wh_map[y][x+3]=v[6];
wh_map[y+1][x+1]=v[7];
wh_map[y+1][+2]=v[8];
wh_map[y+1][x+3]=v[9];
*/
for (lr=-1;lr<=1;lr++)
{
for (lr2=1;lr2<=3;lr2++)
{
wh_map[y+lr][x+lr2]=v[lr3++];
}
}
}
void map_lookdown(void)
{
lookDown();
int ld=0;
int ld2=0;
int ld3=1;
/*
wh_map[y+1][x-1]=v[1];
wh_map[y+1][x]=v[2];
wh_map[y+1][x+1]=v[3];
wh_map[y+2][x-1]=v[4];
wh_map[y+2][x]=v[5];
wh_map[y+2][x+1]=v[6];
wh_map[y+3][x-1]=v[7];
wh_map[y+3][x]=v[8];
wh_map[y+3][x+1]=v[9];
*/
for (ld=1;ld<=3;ld++)
{
for (ld2=-1;ld2<=1;ld2++)
{
wh_map[y+ld][x+ld2]=v[ld3++];
}
}
}
void map_lookleft(void)
{
lookLeft();
int ll=0;
int ll2=0;
int ll3=1;
/*
wh_map[y-1][x-3]=v[1];
wh_map[y-1][x-2]=v[2];
wh_map[y-1][x-1]=v[3];
wh_map[y][x-3]=v[4];
wh_map[y][x-2]=v[5];
wh_map[y][x-1]=v[6];
wh_map[y+1][x-3]=v[7];
wh_map[y+1][x-2]=v[8];
wh_map[y+1][x-1]=v[9];
*/
for (ll=-1;ll<=1;ll++)
{
for (ll2=-3;ll2<=-1;ll2++)
{
wh_map[y+ll][x+ll2]=v[ll3++];
}
}
}
void f_baba(void) //外周
{
if (mode==1)
{
if (v[8]!=2)
{
map_walkdown();
}
else
{
map_walkright();
mode=2;
}
}
else if (mode==2)
{
if (v[6]!=2)
{
map_walkright();
}
else
{
map_walkup();
mode=3;
}
}
else if (mode==3)
{
if (v[2]!=2)
{
map_walkup();
}
else
{
map_walkleft();
mode=4;
}
}
else if (mode==4)
{
if (v[4]!=2)
{
map_walkleft();
}
else
{
map_walkdown();
mode=1;
}
}
else if (mode==5) //上下左右にハートがあったら取りに行く
{
if (v[2]==3)
{
map_walkup();
}
else if (v[4]==3)
{
map_walkleft();
}
else if (v[6]==3)
{
map_walkright();
}
else
{
map_walkdown();
}
mode=old_mode;
}
else if (mode==6) //上下左右に敵がいたらput
{
if (v[2]==1)
{
putUp();
}
else if (v[4]==1)
{
putLeft();
}
else if (v[6]==1)
{
putRight();
}
else if (v[8]==1)
{
putDown();
}
}
else if (mode==7) //斜めのハートを取りに行く
{
if (v[1]==3)
{
map_walkleft();
}
else if (v[3]==3)
{
map_walkright();
}
else if (v[7]==3)
{
map_walkleft();
}
else if (v[9]==3)
{
map_walkright();
}
mode=old_mode;
}
else if (mode==8) //斜めに敵がいたらput
{
if (v[1]==1)
{
map_walkleft();
}
else if (v[3]==1)
{
map_walkright();
}
else if (v[7]==1)
{
map_walkleft();
}
else if (v[9]==1)
{
map_walkright();
}
mode=old_mode;
}
}
void check(void) //mapping check
{
int k=0;
int l=0;
printf ("現在の座標:");
printf ("[%d] [%d]\n",y,x);
printf ("------------------------------------\n");
for (k=0;k<70;k++)
{
for (l=0;l<70;l++)
{
if(x==l && y==k)
{
printf("O");//自分の現在位置
}
else if (wh_map[k][l]==0)
{
printf("!");//床
}
else if (wh_map[k][l]==3)
{
printf ("*");//ハート
}
else if (wh_map[k][l]==2)//ブロック
{
printf ("#");
}
else
{
printf ("%d",wh_map[k][l]); //初期化された二次元配列の値
}
}
printf ("\n");
}
printf("\n----------------------------------------------------------------------");
http://www.zenjouken.com/?page_id=517