マウスの入力待機方法とは

このQ&Aのポイント
  • VC++でMFCで簡単なカードゲームを作ろうとしています。人間のターンにおいて、マウスがクリックされるまでどうやって待機すればいいのか教えてください。
  • マウスの入力待機方法を教えてください。VC++でMFCを使って簡単なカードゲームを作っていますが、人間のターンでマウスのクリックを待つ方法がわかりません。
  • VC++のMFCを使って簡単なカードゲームを作っていますが、人間のターンでマウスのクリックを待つ方法がわかりません。マウスの入力待機方法を教えてください。
回答を見る
  • ベストアンサー

マウスの入力を待つには?

VC++でMFCで簡単なカードゲームを作ろうとしています。 Com■■■■■ ←適当なアルゴリズムでカードを出す    [ 場 ] Man■■■■■ ←マウスでクリックしたカードを出す ・人間 VS コンピュータで交代に場に手札を出す ・手札はそれぞれ5枚ずつ持っている 以下のような処理を考えたのですが、人間のターンにおいて、マウスがクリックされるまでどうやって待機すればいいのか教えてください。 お願いします。 void CGameDlg::GameTurn(void){  while(n_com!=0 || n_man!=0){ // n_com,n_man=カード残り枚数   if( turn==1 ){ // turn:1=コンピュータ    《カードを選んで出す処理》(省略)    n_com--;    turn=0; // ターン交代   }  else{ // turn:0=人間    《マウスの入力を待つ処理》     ?? ここが分かりません ??    n_man--;    turn=1;   }  }  return; } void CGameDlg::OnLButtonDown(UINT nFlags, CPoint point){ 《マウスクリックされた札を出す処理》(省略) }

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

Windowsのプログラムはイベントドリブンです。 マウスの入力を意識して待つ必要はなくクリックされればクリックされたというメッセージがプログラムに伝えられます。 プログラムはメッセージを受け取ると自動的にそのメッセージに対応した処理を(その処理がプログラムされていれば)実行します。 void CGameDlg::OnLButtonDown(UINT nFlags, CPoint point){ // コンピュータ側の処理 // 人間側の処理 // 終了判定処理 }

beni_sakura
質問者

お礼

あぁ、言われてみればそうですね! 無事に処理できるようになりました。 ありがとうございます!!

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

自動的にというのは変ですね MFCならメッセージマップ等で処理しますがこの辺はVisual C++が自動的に書いてくれたりするのでそう書いてしまいました

関連するQ&A

  • 無限ループ中におけるマウスイベント処理について

    import java.awt.*; import java.awt.event.*; //他のインポートは省略。 public class Test extends Frame {  public static void main(String[] args) {   new Test();  }  public Test() {   //フレームの基本設定は省略。   enableEvents(AWTEvent.MOUSE_EVENT_MASK);   show();   mainLoop();  }  private void mainLoop() {   while(true) {    //処理は省略。   }  }  public void processMouseEvent(MouseEvent e) {   //処理は省略。  }  //他のメソッドは省略。 } こんな感じのプログラムを作ったのですが、mainLoop メソッドの無限ループにはまって何もできなくなるはずが、 なぜか普通にマウスイベント処理ができたので不思議に思っております。 VB などで同じようなプログラムを作るときは無限ループの最後に DoEvents でイベント処理をさせております。 言語仕様なのか自分の使ってる PC や OS など環境のせいなのが気になっております。 Java 言語に詳しい方、もし何かご存知でしたら教えて下さい。 (なお、省略した部分は普通の計算処理とかなので影響はないと思われます。)

    • ベストアンサー
    • Java
  • 解説をお願いします。

    どこを変えればよいのでしょうか? #include<stdio.h> int main(void) int n,m,x; char my_turn; printf("最後にタバスコを取った側がピザを食べます\n"); printf("タバスコの数?"); scanf("%d",&n); printf("1回にタバスコを振れる最大の数?"); scanf("%d",&m); if(n < 1 || m < 1) return 0;//負数の入力を拒否します for(my_turn = 1; n!=0; my_turn ^=1){ *1 if(my_turn){ x = (n - 1)%(m + 1);//なぜこの様な式になるのかを特に教えてください。 if(x == 0) x =1; printf("私は %d 回タバスコを振ります\n",x); }else do{ printf("何回振りますか?"); scanf("%d",&x); }while(x <= 0 || x > m || x > n); n = n - x; printf("残りは %d 回です\n",n); } if(my_turn) printf("あなたの負けです\nおいしく召し上がれ"); else printf("私の負けです\nいただきます"); return 0; } 問題の条件を入力した瞬間に,先手か後手かどちらか必勝かが分かります. そこで,先手必勝の場合はコンピュータが先手を選択し,後手必勝の場合は,コン ピュータは必ず後手を勝手に選択する処理を追加し,人間がコンピュータに絶対に 勝てないプログラムに変更する、

  • 4人プレイの七並べGAMEを作りたいのですが。初心者です。

    初心者です。宜しくお願いします。 4人プレイで内3人がコンピュータ。というトランプゲーム(七並べ)をつくりたいのですが、3人のコンピュータ自動処理後の 自分で選んでイベント待ち状態?をつくるにはどうしたらいいのかわかりません。 (参考) run(){ while(flag == true){ 1P処理のメソッド();  //COM1   2P処理のメソッド();  //COM2   3P処理のメソッド();  //player   4P処理のメソッド();  //COM3    thread.sleep(3000); かなりはしょっての説明で恐縮ですが、 この3Pの場所で、マウスでカードを選びクリックするまでストップさせたいんです。選んでクリックするとまた4P→1P→2P・・・と動作させたいのですが、どうすればいいのかわからず質問しました。 今の地点の動きは、1Pの処理(3秒)→2Pの処理(3秒)→3Pの処理(3秒内で選んでクリックしないとプログラムストップ)→4Pの繰り返しになっています。3Pの場面でrunメソッド内のwhileのフラグをfalseにしてマウスイベントのメソッドを別フラグでtrueにし、クリックしたらまたrunメソッド内のwhileのフラグをfalseに戻すという処理でかろうじて動いているのですが、普通の方法というか、なにかいい方法教えてください。お願いします。

  • 初心者です。お助けください。

    とりあえず関数を説明します。 NumberCOM:0475で初期化した重複のない30個の乱数をとり配列COM[30]に格納した後、表示する。 NumberMAN:適当に6個の整数をとって、配列MAN[6]に格納した後、表示する。 Sort:配列COMとMANの要素をそれぞれ小さい順にならべて、表示する。 (但し、下にやったように配列Work[100]を設けて考えないといけないという縛りつき) 実行したら NumberCOMとNumberMANはうまく実行できるんですが、 配列COMのSortがうまくいきません。 Sortした後のCOM配列の要素数がNumberCOM関数で作ったCOM配列の要素よりも少なく、重複して表示されてしまいます。 どうしたらうまくSortできるのでしょうか。見にくくて申し訳ありませんが、お教えください。 #include<stdio.h> #include<stdlib.h> #define N 30 #define n 6 int NumberCOM(int *com){ int a,b; srand(0475u); for(a=0;a<N;a++){ com[a]=(rand()/(RAND_MAX +1.0)*100); for(b=0;b<a;b++){ /*重複を避ける*/ if(com[a]==com[b]){ com[b]=(rand()/(RAND_MAX +1.0)*100); com[a]=com[b]; } } printf("%d,",com[a]); } printf("\n"); } int NumberMAN(int *man){ int c; man[0]=8;man[1]=70;man[2]=58;man[3]=89;man[4]=92;man[5]=23; for(c=0;c<n;c++){ printf("%d,",man[c]); } printf("\n"); } int Sort(int *a,int ko){ int d,e,f=0,Work[100]={0}; for(d=0;d<ko;d++){ Work[a[d]]=1; } for(e=0;e<100;e++){ if(Work[e]==1){ a[f]=e; f=f+1; } } for(f=0;f<ko;f++){ printf("%d,",a[f]); } printf("\n"); } int main(void){ int COM[N],MAN[n]; NumberCOM(COM); NumberMAN(MAN); Sort(COM,N); Sort(MAN,n); return 0; }

  • 遊戯王のモンスター効果について

    攻撃表示の N・グランモール(このカードが相手モンスターと戦闘を行う場合、ダメージ計算を行わずその相手モンスターとこのカードを持ち主の手札に戻す事ができる。)に対して ソードブレイカー(1ターンに1度、このカードのエクシーズ素材を1つ取り除き、種族を1つ宣言して発動できる。このカードが、宣言した種族のモンスターと戦闘を行う場合、ダメージ計算を行わずそのモンスターを破壊する。) の効果を発動させて攻撃した場合どちらの効果が優先されるのでしょうか? 宜しくお願いします。

  • 解説をお願いします

    解説をお願いします。 次のプログラミングの解説をお願いします。 #include<stdio.h> int main(void) int n,m,x; char my_turn; printf("最後にタバスコを取った側がピザを食べます\n"); printf("タバスコの数?"); scanf("%d",&n); printf("1回にタバスコを振れる最大の数?"); scanf("%d",&m); if(n < 1 || m < 1) return 0;//負数の入力を拒否します for(my_turn = 1; n!=0; my_turn ^=1){ *1 if(my_turn){ x = (n - 1)%(m + 1);//なぜこの様な式になるのかを特に教えてください。 if(x == 0) x =1; printf("私は %d 回タバスコを振ります\n",x); }else do{ printf("何回振りますか?"); scanf("%d",&x); }while(x <= 0 || x > m || x > n); n = n - x; printf("残りは %d 回です\n",n); } if(my_turn) printf("あなたの負けです\nおいしく召し上がれ"); else printf("私の負けです\nいただきます"); return 0; }

  • java リアルタイムでマウスの座標を取得したい

    マウスのリアルタイム座標を取得したいのですが、 以下のソースを作りました。 しかし、リアルタイムどころか、マウスをクリックしても座標が取得できません どこを修正すればいいのでしょうか? import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.event.MouseEvent; import java.net.URL; import java.awt.Image; /*<applet code="applet001" width="640" height="480"></applet>*/ public class applet001 extends Applet implements MouseListener, MouseMotionListener { Dimension dim; int mouse_x, mouse_y; //アプレットの初期化時呼び出される public void init() { dim = getSize(); addMouseListener( this ); } public void update(Graphics g) //オーバーライドして最低限のことだけをする { paint(g); } public void paint(Graphics g) { g.drawString( "マウス:" + mouse_x + "," + mouse_y, 60, 120 ); g.fillOval(mouse_x,mouse_y,30,30); } // マウスの処理 public void mousePressed( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); } public void mouseClicked( MouseEvent e ) {} public void mouseReleased( MouseEvent e ) {} public void mouseEntered( MouseEvent e ) {} public void mouseDragged( MouseEvent e ) {} // public void mouseExited( MouseEvent e ) {} // public void mouseMoved( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); repaint(); } }

    • ベストアンサー
    • Java
  • 「VC++2008」の「Invalidate」について

    「VC++2008 Express Edition」の入門者です。「Invalidate」の動作で悩んでいます。 動作は、「マウスを左クリックしたところに赤印を付ける」と言う物です。 最初、以下の様に「Form1」での時には問題なく動いていました。 -------------------------------------------------------------------------------- //マウスクリック   private: System::Void Form1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { //~~~~~~~~~~~~~~ //      マウス処理 //~~~~~~~~~~~~~~       Invalidate();   } //画面描画   private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { //~~~~~~~~~~~~~~ //      赤印を付ける //~~~~~~~~~~~~~~   } -------------------------------------------------------------------------------- 上記では、マウスを左クリックすると赤印がすぐに付き、問題はありませんでした。 上記を「Form1」から「panel4」上に書き換えたのが下記です。 -------------------------------------------------------------------------------- //マウスクリック   private: System::Void panel4_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { //~~~~~~~~~~~~~~ //      マウス処理 //~~~~~~~~~~~~~~       Invalidate();   } //画面描画   private: System::Void panel4_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { //~~~~~~~~~~~~~~ //      赤印を付ける //~~~~~~~~~~~~~~   } -------------------------------------------------------------------------------- 上記では、マウスを左クリックしても赤印が書かれません。 一度別のプログラムなどに行って、赤印の場所が隠れて、またはこのプログラムWindowsを移動して、 赤印の場所を画面外に出して見えなくしてから戻った瞬間に赤印が書かれます。 上記の動作をInvalidateがしてるとは思うのですが・・・ Invalidateの使い方(updateも関係?)を教えて頂きたく、質問いたしました。 宜しくお願いいたします。

  • ウイルスに感染し、キーボード、マウスが使えなくなりました。

    Emailで送られてきた添付ファイルをオープンして、ウイルスに感染し、キーボードとマウスが使えなくなり、とても困っています。 Avast4と言うウイルスソフトを入れていたのですが、それが、確か、W12 Trojanと言うウイルスを検出したと警告があったので、チェストに移動する、削除するなどの選択をクリックしても、何回も同じ警告が出てきて、処理されませんでした。 それで、Reboot後、Avast4でWindowが立ち上がる前にウイルススキャンをして、検出したウイルスの処理の選択画面まで行ったのですが、その処理の選択番号をキーボードで押しても反応せず、仕方なく強制終了しました。 そして再起動したら、Outlookなどが立ち上がったのですが、(それまで使っていた設定ではなく、セーフモードで立ち上げたような大きなフォントでの画面でした。)キーボード、マウスともまったく使用不能になっていて、どうしようも出来ない状態になってしまいました。 出来るのは、強制終了して、再立ち上げだけで、上に書いた状態の画面が出てきます。 それで、アンチウイルスソフトのCDを駆動すれば、自動的に修復してくれるかと思い、コンピューターを起動後すぐにF2ボタンを押して(Dellのデスクトップを使用)CDROMを 1st Boot Device に選択して、友人から借りたノートンのアンチウイルスソフト、Norton 360 Version2.0 を走らせたのですが、何の効果もなく、以前と同じ、フォントの大きな画面が出てきて、ウイルスの駆除は出来ずに、大いに困っています。 とにかく、キーボードもマウスも使えないので、アンチウイルスソフトも起動できない状態です。 どなたか、こういう状況のときの解決策を教えていただけませんでしょうか? 今は、出張用で使う小さいノートブックで仕事をして、これもそれで書いています。 よろしくお願いいたします。

  • ポインタについて

    #include <stdio.h> void douteki(void); double *d; FILE *f; int main(void){ int i; char dummy[10]; douteki(); /****省略****指定したファイルを開く**/ for(i=0;i<10;i++){ fscanf(f,"%s",dummy); *(d+i)=atof(dummy);     /**←ここ**/ } /**********あと,いろいろとdがさしている値を利用して処理する。******/ free(d); } void douteki(void){ if((d=(double*)malloc(10))==NULL){ fprintf(stdout,"領域が確保できませんでした。\n"); exit(1); } } 時間がなく急いで書いたので、細かい間違いはあるかもしれませんが、動的確保をして、そのアドレスが指している場所に、ファイルのデータをそれぞれ入れたいのですが、/****←ここ****/のところで、スレッド停止が出てしまいます。どこを間違えているのでしょうか?ちなみに時々、実行が出来るときもあります。 よろしくおねがいします。

専門家に質問してみよう