DXライブラリでマップが作れない!?

このQ&Aのポイント
  • DXライブラリとVisualC++2008を使用してゲーム(アクション)を作成していますが、マップの作成に困っています。
  • マップの描写は成功したのですが、0の位置に判定を持たせることができません。
  • 色々試してみましたが、うまくいきません。どのようにすればいいでしょうか?
回答を見る
  • ベストアンサー

DXライブラリでマップが作れません・・・。

今DXライブラリとVisualC++2008を使ってゲーム(アクション)を作っているのですがマップが作れません・・・、構造体?をつかってマップの描写は成功したのですが、0のところに判定を持たせることができません・・・。どのようにすればいいのでしょうか?色々試してみてもできず困っています。 ソースの一部 #include"DxLib.h" #define MAP_SIZE 64 // マップチップ一つのドットサイズ #define MAP_WIDTH 10 // マップの幅 #define MAP_HEIGHT 8 // マップの縦長さ int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , } ; void HYOUZI(void); void SYOKIKA(void); struct dousa{ int power; int flag; }; struct dousa jump; struct zahyou { int x,y; int img; int flag; int muki_y; int muki_x; int x1; int x2; int x3; int x4; int y1; int y2; int y3; int y4; }; struct zahyou haikei; struct charcter { int x,y; int img; int flag; }; struct charcter ziki; struct map; //初期化 void SYOKIKA(void){ jump.flag=0; ziki.x=100; ziki.y=100; ziki.img=LoadGraph("red_player.bmp"); } //背景 void HYOUZI(void){ int i,j; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { if( MapData[ i ][ j ] == 0 ) { DrawBox( j * MAP_SIZE , i * MAP_SIZE , j * MAP_SIZE + MAP_SIZE , i * MAP_SIZE + MAP_SIZE , GetColor( 255 , 0 , 0 ) , TRUE ) ; } } } DrawGraph(ziki.x,ziki.y,ziki.img,TRUE); ScreenFlip(); } //動き void ugoki(void){ int OldX , OldY ; OldX = ziki.x ; OldY = ziki.y ; if (CheckHitKey(KEY_INPUT_RIGHT) == 1){ ziki.x=ziki.x+4; } if (CheckHitKey(KEY_INPUT_RIGHT) == 1) if (CheckHitKey(KEY_INPUT_Z) == 1) { ziki.x=ziki.x+8; } if (CheckHitKey(KEY_INPUT_LEFT) == 1){ ziki.x=ziki.x-4; } if (CheckHitKey(KEY_INPUT_LEFT) == 1) if (CheckHitKey(KEY_INPUT_Z) == 1) { ziki.x=ziki.x-8; } if(ziki.x>640){ ziki.x=-10; } if(ziki.x<-10){ ziki.x=640; } //ジャンプ jump.power-=1; ziki.y -=jump.power; if(ziki.y>400){ jump.power=0; ziki.y=400; jump.flag=0; } if (CheckHitKey(KEY_INPUT_DOWN) == 1 && jump.flag == 0){ jump.power=30; jump.flag=1; } if (CheckHitKey(KEY_INPUT_UP) == 1 && jump.flag == 0){ jump.power=20; jump.flag=1; } if( MapData[ ziki.x ][ ziki.y ] == 0 ) { ziki.x = OldX ; ziki.y = OldY ; } } int WINAPI WinMain ( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { ChangeWindowMode(TRUE); if(DxLib_Init()==-1) { return -1; } SYOKIKA(); SetDrawScreen(DX_SCREEN_BACK); while(ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0){ HYOUZI(); ugoki(); ClearDrawScreen(); } DxLib_End(); return(0); } 分かる人がいたらぜひ教えてください(o_ _)o

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

> if( MapData[ ziki.x ][ ziki.y ] == 0 ) おもいっきり配列オーバーフローしますが、というかよくAccess Violation出ませんね…… 横640x縦400の座標系を横10x縦8に変換しないと駄目です。 #普通は何もない=0、何かある=0以外のような気はするけどそれは置いておきます

daikon999
質問者

お礼

>>おもいっきり配列オーバーフローしますが、というかよくAccess Violation出ませんね…… 横640x縦400の座標系を横10x縦8に変換しないと駄目です。 お答えいただきありがとうございます ただ、変換のしかたがググッても、参考書見てもわからない・・・。 できれば座標系の変換方法を教えてもらえないでしょうか、お願いしますm(_ _;m) >>#普通は何もない=0、何かある=0以外のような気はするけどそれは置いておきます そうなんですか、色々なサイト見てやったので少しごっちゃになったりしてます。

その他の回答 (1)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

> #define MAP_SIZE 64 とのことなので64分してやればいいのです。 ただし動かすキャラの大きさに合わせて四隅というか四辺で判定してやる必要と、ぶつかったら単純に元に戻すのではなくぎりぎりでぶつからない位置に合わせる必要がありますが。

daikon999
質問者

お礼

教えていただきありがとうございましたm(_ _)m

関連するQ&A

  • DXライブラリの透過処理について

    #include "DxLib.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { ChangeWindowMode(TRUE); SetDrawScreen(DX_SCREEN_BACK); if(DxLib_Init()==1) { return -1; } char key[256]; // int haikei; int mapchip[2][152]; int i,j; //int x = 0, y = 0; //haikei = LoadGraph("haikei/草原.jpg"); LoadDivGraph("03.png",5,1,5,32,32,mapchip[0]); LoadDivGraph("mura.png",1,1,1,32,32,mapchip[1]); while(ScreenFlip()==0 && ProcessMessage() == 0 && GetHitKeyStateAll(key)==0) { // ClearDrawScreen(); // DrawGraph(x,y,haikei,FALSE); for(i = 0; i<15;i++) { for(j=0;j<20;j++) { DrawGraph(j*32,i*32,mapchip[0][4],FALSE); } } DrawGraph(32,32,mapchip[1][0],TRUE); /* if(CheckHitKey(KEY_INPUT_RIGHT) == 1) x+=10; if(CheckHitKey(KEY_INPUT_LEFT) == 1) x-=10; if(CheckHitKey(KEY_INPUT_UP) == 1) y-=10; if(CheckHitKey(KEY_INPUT_DOWN) == 1) y+=10; */ if(key[KEY_INPUT_ESCAPE] == 1) { DxLib_End(); return 0; } } } 「DrawGraph(32,32,mapchip[1][0],TRUE);」という処理でmura.pngの左上のカラーキーで透過するはずですがしません。 Win10のペイントで作ったpngファイル形式に対応してないかと思うのですが、よくわかりまえん。 なぜ?

  • c 言語 B tree

    C言語で B-treeを実装するプログラムを書きました。 まだtreeに挿入する関数しか書いておりませんが。。 まず空の根を作ってからそこにどんどん要素を挿入していくのですが、どうも要素が 挿入されていないように思えます。 どこがいけないのか分かる方いらっしゃいませんか? よろしくお願いします。 #include <stdio.h> #define T 10 struct b_tree{ int key[2*T-1]; struct b_tree *node[2*T]; int size; int leaf;//この節点が葉であったら1とする }; void BTreeCreate(void); void BTreeSplitChild(struct b_tree x,int i,struct b_tree y); void BTreeInsert(struct b_tree t,int k); void BTreeInsertNonfull(struct b_tree x,int k); void PrintBtree(struct b_tree x); struct b_tree root; int main (int argc, const char * argv[]) { // insert code here... /*int t;*/ char command; int key; BTreeCreate(); /*scanf("%d",&t);*/ while (1) { scanf("%c %d",&command,&key); if (command=='E') break; if(command=='I') BTreeInsert(root,key);//木にkeyを挿入 } PrintBtree(root); //木を表示 return 0; } void BTreeCreate(void){//空のB-木の生成 struct b_tree x; x.leaf=1; x.size=0; root=x; } void BTreeSplitChild(struct b_tree x,int i,struct b_tree y){ /*B-木における節点の分割をする節点xのi番目の枝の先にある節点yが飽和であった 場合にyをyの中央値で分ける。yの中央値はxの新たなkeyとなりxの枝数は1つ増える*/ int j; struct b_tree z; z.leaf=y.leaf; //zが葉であるかどうかはyが葉であるかどうかに依る z.size=T-1; //また新しくできるxの子zは最小数のkey(T-1)を持たせる for (j=1; j<= T-1; j++) { z.key[j]=y.key[j+1]; //yの中央値よりおおきい値(T-1個)をzに渡す } if(y.leaf==0){ //またyが個をもつ場合は枝もzに渡す for (j=1; j<=T; j++) z.node[j]=y.node[T+j]; } y.size=T-1; //そしてyのサイズも中央値とzに渡した分小さくなる for (j= x.size+1; j>=i+1; j--) { //xにyの中央値を渡すのでx枝の右半分を1つずつ右へずらす x.node[j+1]=x.node[j]; } x.node[i+1]=&z; //i+1番目の枝に新たな子zのポインタを与える for (j=x.size; j>=i; j--) { //値も右へずらす x.key[j+1]=x.key[j]; } x.key[i]=y.key[T]; //xのi番目の値をyの中央値とする。 x.size=x.size+1; //xは1サイズup } void BTreeInsert(struct b_tree t,int k){ int Tsub=T; //条件部にTが使えなかったのでTsubに退避 struct b_tree r,s; r=t; if (r.size == Tsub) { /*根が飽和だった場合を考える新たな親を必要とするため それをsとする。するとsは葉ではなく、sizeは0, そして元々の根rのポインタを与える*/ s.leaf=0; s.size=0; s.node[1]=&r; root=s; BTreeSplitChild(s,1,r); BTreeInsertNonfull(r,k); } else { BTreeInsertNonfull(r,k); } } void BTreeInsertNonfull(struct b_tree x,int k){ /*未飽和の節点xにkを挿入しようと考える。*/ int i; int Tsub=T; if (x.leaf==1) { /*もし、xが葉であれば大小関係を考えて挿入。その際他のkey を右へ1つずつずらす。またxのサイズを1up*/ while (i>=1 && k<x.key[i]) { x.key[i+1]=x.key[i]; i--; } x.key[i+1]=k; x.size++; } else { /*もしxが葉でなければどこの枝をたどればいいのか考える*/ while (i>=1 && k<x.key[i]) { i--; } i++; if ((*x.node[i]).size == 2*Tsub-1) { /*たどる枝の先が飽和であった場合分割する*/ BTreeSplitChild(x, i, *x.node[i]); if (k > x.key[i]) { i++; } } BTreeInsertNonfull(*x.node[i],k);//枝をたどる } } void PrintBtree(struct b_tree x){ printf("abc"); printf("%d",x.leaf);//実行するとleafが1のままなので、数が挿入されていない? int i,l;        if(x.leaf==1){ for (i=1; i<=x.size; i++) { printf("%d def",x.key[i]); } if(l==0)printf("\n"); }else { for (i=1; i<=x.size; i++) { printf("%d ghi",x.key[i]); } if(l==0)printf("\n"); l++; printf(" jkl"); for (i=1; i <= x.size+1; i++) { PrintBtree(*x.node[i]); } } printf("\n"); }

  • RPGゲームの簡単なプログラムを打ってみたんですがうまく表示されません

    RPGゲームの簡単な初歩的なサンプルプログラムを自分で打ってみたんですが、思った通りに表示されません。 以下のソースのどこかおかしいとこありますでしょうか。 #include<stdio.h> #include<windows.h> #define MAP_SIZE_Y 10 #define MAP_SIZE_X 10 int x = 4,y = 5; int j,i; int map[100][100] = { {1,1,1,1,1,1,1}, {1,0,0,3,0,0,1}, {1,0,0,0,0,0,1}, {1,0,2,0,2,0,1}, {1,0,0,0,0,0,1}, {1,1,1,1,1,1,1}, }; void DrawMap(){ for(j = 0; i < MAP_SIZE_Y; j++){ for(i = 0; i < MAP_SIZE_X; i++){ if(j == y && i == x){ printf("勇"); }else{ switch ( map[j][i]){ case 1: printf("■"); break; case 2: printf("兵"); break; case 3: printf("王"); break; default:printf(" "); break; } } } printf("\n"); } } void main(){ while(1) { system("cls"); DrawMap(); } }

  • 敵との当たり判定

    現在VisualC++2008でゲームを製作してるんですが 自分と敵との当たり判定がわかりません。 どのようにすればいいか教えてもらえないでしょうかm(_ _)m #define SCREEN_WIDTH (640) // 画面の横幅 #define SCREEN_HEIGHT (480) // 画面の縦幅 #define CHIP_SIZE (32) // 一つのチップのサイズ #define MAP_WIDTH (SCREEN_WIDTH / CHIP_SIZE) // マップの横幅 #define MAP_HEIGHT (SCREEN_HEIGHT / CHIP_SIZE) // マップの縦幅 #define CHAR_SIZE (30) // プレイヤーのサイズ float PlX, PlY ; // プレイヤーの座標(中心座標) int ActMain( void ) { // プレイヤーの座標を初期化 PlX = 100.0F ; PlY = 1.0F ; // マップ { int i, j ; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { // 1のところだけ描画 if( MapData[i][j] == 1 ) { DrawBox( j * CHIP_SIZE, i * CHIP_SIZE, j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE, GetColor( 0, 0, 0 ), TRUE ) ; } } } } //プレイヤーの描写 DrawBox( ( int )( PlX - CHAR_SIZE * 0.5F ), ( int )( PlY - CHAR_SIZE * 0.5F ), ( int )( PlX + CHAR_SIZE * 0.5F ) + 1, ( int )( PlY + CHAR_SIZE * 0.5F ) + 1, GetColor( 255, 0, 0 ), TRUE ) ; Cr = GetColor( 255 , 255, 255 ) ; //敵の描写 DrawGraph(teki[0].x,teki[0].y,teki[0].img,TRUE); //初期化 void SYOKIKA(void){ teki[0].x=500; teki[0].y=200; teki[0].img=LoadGraph("red_player.bmp"); //当たり判定をつくったつもりですが反応せず・・・。一応あたったらPlXを0に移動させようとしています。 if(PlX==teki[0].x) PlX=0; if(PlX==teki[0].y) PlX=0; if(PlY==teki[0].x) PlX=0; if(PlY==teki[0].y) PlX=0; がソースです(文字数が足りないのであたり判定に関係ありそうな(敵と自分の座標関連)ところだけ抜きました)今のところ敵、自分、マップ表示や自分の移動などはできているのですが、敵に触れても反応せず、ときおり敵のいないまったく関係のない場所でPlXが0に移動したりしてしまいます ソースみづらくて申し訳ありません。

  • ゲームプログラミングについて

    ファイル分割について。(長文失礼) scene.hファイル #include "Dxlib.h" #define EXTERN #else #define EXTERN extern #endif extern void Opening(); extern void Menu(); extern void Danjon(); extern void attack(); extern void Ending(); EXTERN int apple;// 画像を入れる変数 EXTERN int TITLE_CG; EXTERN char KeyBuf[256];// キーが押されてる状態を入れる文字配列 EXTERN int Key[256]; // キーが押されているフレーム数を格納する EXTERN int x=320, y=240; EXTERN int function_status=0,White; scene.cppファイル #include "scene.h" void Opening(){ } void Menu(){ DrawString(100,140,"メニュー画面 (xをプッシュ)",White); if(KeyBuf[KEY_INPUT_X]==1) function_status=2; } void Danjon(){ DrawString(100,180,"ダンジョン画面 (cをプッシュ)",White); if(KeyBuf[KEY_INPUT_C]==1) function_status=3; } void attack(){ DrawString(100,220,"戦闘画面 (vをプッシュ)",White); if(KeyBuf[KEY_INPUT_V]==1) function_status=4; } void Ending(){ DrawString(100,260,"エンディング画面 (bをプッシュ)",White); if(KeyBuf[KEY_INPUT_B]==1) function_status=5; } main.cppファイル #define _SCENE_H_ #include "scene.h" 以下(長くなるので)一部抜粋の形をとりました void gpCalc() {     if( Key[ KEY_INPUT_RIGHT ] >= 1 ){ x += 5 ;     }     if( Key[ KEY_INPUT_DOWN ] >= 1 ){ y += 5;     }     if( Key[ KEY_INPUT_LEFT ] >= 1 ){ x -= 5;     }     if( Key[ KEY_INPUT_UP ] >= 1 ){ y -= 5;     } } switch(function_status) { case 0: Opening();    DrawRotaGraph( x, y, 1.0, 0.0, TITLE_CG, TRUE );    break;    case 1:    Menu();    DrawRotaGraph( x, y, 1.0, 0.0, apple, TRUE );    break;    case 2:    Danjon();    break;    case 3:    attack();    break;    case 4:    Ending();    break;    default: return 0;    break; } int x,y,function_statusが何かこの文章ではわかりにくいとは思いますが、なにとぞご勘弁を。 これでF5を押すと、int x,y,function_statusの三つが既にmain.objで定義されているといわれ、エラーが出てしまいます。(念のため、一つのファイルにまとめたものは実行確認済みです) ヘッダーファイルの書き方に問題があるのでしょうか?それとも、mainで余計なことをしてしまっているのでしょうか。 どなたか教えていただけないでしょうか。 もし必要であればmainのソースもすべて開示したいと思っています。 (おそらく書ききれると思います)

  • C言語にて至急質問!!

    授業でゲーム作成してますがタイム表示とえさの残り数表示と残りのライフ表示 のプログラムがわかりません プログラムは下にあります #include<stdio.h> #include<stdlib.h> #include<time.h> #include"utility.h" int map[25][40]; typedef struct{ int x; int y; int life; int col; }CHAR; void disp(int,int); void main(void) { FILE *fp; CHAR man,mapsize,teki[5]; int i,j,cnt = 0,x,y,flg,wx,wy,stime = 0,etime = 0 ; GetConsoleHandle( ); srand(time(NULL)); fp = fopen("map.txt","r"); if(fp == NULL){ printf("ファイルエラー\n"); return; } fscanf(fp,"%d %d",&mapsize.y,&mapsize.x); fscanf(fp,"%d %d",&man.y,&man.x); wy = man.y; wx = man.x; fscanf(fp,"%d" "%d",&y,&x); for(i = 0;i < mapsize.y;i++) for(j = 0;j < mapsize.x;j++){ fscanf(fp,"%d",&map[i][j]); if(map[i][j] == 1) cnt++; } fclose(fp); disp(mapsize.x,mapsize.y); Locate(man.x * 2 +10,man.y + 3); printf("Э"); if(map[man.y][man.x] == 1){ cnt--; map[man.y][man.x] = 0; } man.life = 10; man.col = 0x0e; for(i = 0;i < 5;i++){ teki[i].y = y; teki[i].x = x; teki[i].life = 1; teki[i].col = rand() % 7 + 9; } while(cnt && man.life){ Wait(100); if(KeyCheck(ESCAPE)) break; Locate(man.x * 2 + 10,man.y + 3); SetColor2(0x00); printf(" "); if(KeyCheck (LEFT) && map[man.y][man.x - 1] != 9){ man.x--; } if(KeyCheck (RIGHT) && map[man.y][man.x + 1] != 9){ man.x++; } if(KeyCheck (UP) && map[man.y - 1][man.x] != 9){ man.y--; } if(KeyCheck (DOWN) && map[man.y + 1][man.x] != 9){ man.y++; } flg = -1; for(i = 0;i < 5;i++){ if(man.y == teki[i].y && man.x == teki[i].x) flg = i; } if(flg == -1){ if(map[man.y][man.x] > 9){ j = map[man.y][man.x]; man.x = j / 100; man.y = j % 100; } if(map[man.y][man.x] == 1){ cnt--; map[man.y][man.x] = 0; } else if(map[man.y][man.x] == 2){ map[man.y][man.x] = 0; stime = time(NULL); etime = stime + 10; } }else{ stime = time(NULL); if(stime < etime){ teki[flg].life--; if(map[teki[flg].y][teki[flg].x] == 1){ map[teki[flg].y][teki[flg].x] = 0; cnt--; }else if(map[teki[flg].y][teki[flg].x] == 2){ map[man.y][man.x] = 0; stime = time(NULL); etime = stime + 10; } }else{ man.life--; SetColor(0x0f); Locate(60,3); Locate(teki[flg].x * 2,teki[flg].y); SetColor2(teki[flg].col); printf("Ψ"); man.x = wx; man.y = wy; Wait(3000); Locate(man.x * 2 + 10,man.y + 3); SetColor2(man.col); printf("Э"); } } Locate(man.x * 2 + 10,man.y + 3); SetColor2(man.col); printf("Э"); for(i = 0;i < 5;i++){ if(teki[i].life == 1){ Locate(teki[i].x * 2 + 10,teki[i].y +3); switch(map[teki[i].y][teki[i].x]){ case 0:SetColor2(0x0f); printf(" "); break; case 1:SetColor2(0x0f); printf("・"); break; case 2:SetColor2(0x0c); printf("♪"); break; } j = rand() % 4; if(j == 0 && map[teki[i].y - 1][teki[i].x] != 9){ teki[i].y--; } if(j == 1 && map[teki[i].y][teki[i].x + 1] != 9){ teki[i].x++; } if(j == 2 && map[teki[i].y + 1][teki[i].x] != 9){ teki[i].y++; } if(j == 3 && map[teki[i].y][teki[i].x - 1] != 9){ teki[i].x--; } Locate(teki[i].x * 2 + 10,teki[i].y + 3); stime = time(NULL); if(stime < etime) SetColor2(teki[i].col << 4); else SetColor2(teki[i].col); printf("Ψ"); }else{ stime = time(NULL); if(stime >= etime){ teki[i].life = 1; teki[i].y = y; teki[i].x = x; } } } } } void disp(int x,int y){ int i,j; for(i = 0;i < y;i++){ for(j = 0;j < x;j++){ Locate(j*2 + 10,i + 3); switch(map[i][j]){ case 0:SetColor2(0x00); printf(" "); break; case 1:SetColor2(0x0f); printf("・"); break; case 2:SetColor2(0x0c); printf("♪"); break; case 9:SetColor2(0x99); printf("■"); break; default:SetColor2(0x0d); printf(" "); } } } } このどこかに質問したプログラムがはいるかもおしえてほしいです。 至急回答をどうかおねがいします

  • C言語の課題をやっております。

    C言語の課題をやっております。 ずいぶん考えたのですが、行き詰まってしまいました。 課題は、 1.構造体を作り、名簿風の決められたデータを入れる(初期化?) 2.名前の順に並べ替える 3.画面に表示する という3段階です。 これらを1つのmain関数内で作ることはできたのですが、 それぞれinput sort output関数で作り、main関数で呼び出して完成させる必要があります。 sort outputはかろうじてできたのですが、inputが動かせません。 今の考えとしては、mainでinputを呼び出し、 input関数内で構造体を初期化して、戻り値で構造体のアドレス?をmainに返して、 そのアドレスをそれぞれsort outputに渡し、処理してもらいたいと考えています。 エラーのでる箇所は、main関数の構造体アドレスのやりとりと、 input関数の戻り値のあたりで 問題のあるポインタ、とか移植性のないポインタ、などと 出てしまいます。 書いたプログラムをmain,input,sortまで載せます。 整理できておらずわかりにくいプログラムですが、考え方、間違っているところ、修正点など ご意見を頂きたく思っています。 よろしくお願いします。 # include <stdio.h> struct day { int yy; int mm; int dd; }; typedef struct hito { int NO; char NAME[10]; struct day ENTRANCE; struct day BIRTH; }HITO; void main(void){ int input(void); int output(struct hito *pt); int sort(struct hito *pt); int i,j; int x; struct hito *pt; pt=input(); sort(pt); output(pt); return; } int input(void){ int i,x; struct hito *ptt; HITO list[9]= { {1456, "okayama", 2004,4,1, 1980,2,4}, {2452, "wada", 2005,4,1, 1984,10,2}, {2552, "ikeyama", 2005,4,1, 1987,5,10}, {3456, "meguro", 2006,4,1, 1982,5,2}, {4242, "sagami", 2007,10,1, 1972,3,3}, {5123, "ohsawa", 2008,10,1, 1965,2,2}, {5222, "akagi", 2009,1,4, 1988,3,4}, {6212, "hasebe", 2009,4,1, 1990,8,3}, }; return list; } int sort(struct hito *pt){ int i,j,x; for (i=0; i<8; i++){ for(j=i+1; j<9; j++){ if((pt+i)->NAME[0] > (pt+j)->NAME[0]){ *(pt+9)=*(pt+i); *(pt+i)=*(pt+j); *(pt+j)=*(pt+9); } } } return 0; }

  • Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が

    Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が間違っているのかずっと考えているのですがいまだに解決策が見つかりません。ヒントでもいいのでお願します。 #include <stdio.h> int init(void); void show(void); int chk_cmp(void); char input(void); int move(char cmd); #define N 4 int panel[N][N] = { { 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 0}, {13, 14, 15, 12} }; int x, y; int main(void) { printf("これは15パズルです。\n" "左上から右に向かって「1」から「15」が並ぶよう,\n" "「0」を動かしてください。\n" "操作はテンキーで行います。( 8(上),4(左),6(右),2(下) )\n"); if( !init() ) { printf("パネルの初期化に失敗しました。「0」のパネルがありません。\n"); return 1; } while(1) { show(); if( chk_cmp() ) { printf("完成です!\n"); break; } while(1) { if( move(input()) ) { break; } else { printf("そっちには動かせません。\n"); } } } return 0; } int init(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(panel[i][j]==0){ x=j; y=i; return 1; } } } return 0; } void show(void) { int i,j; printf("---------------\n"); for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ printf("%3d",panel[i][j]); } printf("\n"); } printf("---------------\n\n"); } int chk_cmp(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(i==N-1&&j==N-1){ if(panel[i][j]!=0){ return 0; } }else{ if(panel[i][j]!=N*i+j+1){ return 0; } } } } return 1; } char input(void) { int comand; while(1){ scanf("%d",&comand); if(comand==8||comand==4||comand==6||comand==2){ break; } printf("8(上),4(左),6(右),2(下)を入力してください。"); } return comand; } int move(char cmd) { int dx=0, dy=0; if(cmd==8){dy=-1;}//上 if(cmd==4){dx=-1;}//左 if(cmd==6){dx=1;}//右 if(cmd==2){dy=1;}//下 if(x+dx>=0&&x+dx<=N-1&&y+dy>=0&&y+dy<=N-1){ panel[y][x]==panel[y+dy][x+dx]; panel[y+dy][x+dx]==0; y+=dy; x+=dx; return 1; } else{return 0;} }

  • ブロック崩し

    大学でプログラム習ってるんですが、全然できないのでこのままじゃまずいと思って勉強がてらゲームを作ってみる事にしました。ブロック崩しを作ろうとしたのですが、球を動かす機能を関数化する所とブロックの配置をどうすればいいかで悩んでます。どうすればよろしいでしょうか。DXライブラリで作ってます。 #include "DxLib.h" typedef struct _racket{ int g_racket; int g_x; int g_y; }racket; typedef struct _block{ int stone; int x; int y; }block; typedef struct _tama{ int ball; int x; int y; int vx; int vy; }tama; int Key; tama ta; void ball_attack() { ta.x = 300; ta.y = 450; ta.vx = 4; ta.vy = 4; ta.ball = LoadGraph("ball.bmp"); DrawGraph(ta.x, ta.y, ta.ball, TRUE); ta.x += ta.vx; ta.y += ta.vy; if(ta.x < 5 || ta.x > 635) ta.vx = -ta.vx; if(ta.y < 5 || ta.y > 475) ta.vy = -ta.vy; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { //tama ta; racket ra; //ta.x = 300; //ta.y = 450; //ta.vx = 4; //ta.vy = 4; ra.g_x = 300; ra.g_y = 420; ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); // 透過色を変更 SetTransColor( 255 , 255 , 255 ) ; ra.g_racket = LoadGraph("ziki.bmp"); //ta.ball = LoadGraph("ball.bmp"); while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0) { // メッセージループに代わる処理をする if( ProcessMessage() == -1 ) { break ; // エラーが起きたらループを抜ける } ClearDrawScreen(); ball_attack(); /* DrawGraph(ta.x, ta.y, ta.ball, TRUE); ta.x += ta.vx; ta.y += ta.vy; if(ta.x < 5 || ta.x > 635) ta.vx = -ta.vx; if(ta.y < 5 || ta.y > 475) ta.vy = -ta.vy*/; // キー入力取得 Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ; // 右を押していたら右に進む if( Key & PAD_INPUT_RIGHT ) ra.g_x += 3 ; // 左を押していたら左に進む if( Key & PAD_INPUT_LEFT ) ra.g_x -= 3 ; // 読みこんだグラフィックを画面左上に描画 DrawGraph( ra.g_x , ra.g_y , ra.g_racket , TRUE ) ; ScreenFlip(); } WaitKey(); DxLib_End(); return 0; }

  • map::find()の戻り値が変数に入ってくれません。

    こんにちは、boundaryといいます。 ユーザー型のキーとユーザー型の値をmapに挿入したのです が、map::find()の戻り値が変数に入ってくれません。 operator=を定義しないといけないのかなと思いやってみた のですがうまくいきません。 std::map<ユーザー型,ユーザー型>::iteratorを定義しない といけないのでしょうか? どなたかお知恵をお貸しください。 よろしくおねがいします。 windows2000 vc6.0sp5 ps.ソースコードを載せようとしたのですが、質問文字数が 最長文字数を超えるようで質問する事ができません。 ですのでかなり端折っています。(スミマセン) /* mapのキーです。 */ typedef struct _StateAndReturn { int State; int Return; } StateAndReturn; /* mapの値です。 */ struct NextStateAndFunc { NextStateAndFunc& operator=(const NextStateAndFunc& X){ NextState = X.NextState; MemFuncPointer = X.MemFuncPointer; } typedef int (Funcs::*pFunc)(); int NextState; pFunc MemFuncPointer; }; class CEventMap { private: typedef int (Funcs::*pFunc)(); typedef map<StateAndReturn, NextStateAndFunc, my_less> _EventFuncMap; _EventFuncMap EventFuncMap; public: void Set(int StateNow, int ServerReturnCode, int StateNext, pFunc pF) { /*登録します。*/ } const NextStateAndFunc Answer(int StateNow, int ServerReturnCode) { StateAndReturn tempStateAndReturn; tempStateAndReturn.State = StateNow; tempStateAndReturn.Return = ServerReturnCode; map<StateAndReturn, NextStateAndFunc>::const_iterator ite; ite = EventFuncMap.find(tempStateAndReturn); /* ←ここでエラーになります。 */ return ite->second; } };

専門家に質問してみよう