Visual Studio 2010 と Qt 4.7 (両方のウィンドウ) で c++ の組み合わせを使用してゲームを行っています。ゲームは戦艦のクローンであり、コンソール入力ベースです。Qt デザイナーの Qt 側では、GUI は 10x10 のグリッド レイアウトで構成され、ラベルを使用してゲーム セルのピックスマップを保持します。
2 次元配列での位置を表すために、各ラベルに念入りに名前を付けました (つまり、フリート マップ => F_00
=> F[0,0]
=> F[i],[j]
)。プロパティ エディターを使用して、表示するピックスマップを手動で選択できますが、動的なものが必要です。
update mapboard クラスを使用して、プレイヤーが発砲した後にゲーム ボードを再描画します。これは char 配列に保存され続けます。一般的な getupdatearray タイプの関数を使用して、それぞれのピックスマップを更新したいと思います。配列をトラバースすると、現在個々のラベルに関連付けられているピックスマップが更新され、配列のいとこに一致します。(F[5][6] = 'X'
ヒットの場合、ループが配列内のその位置に到達すると、 F_56 のピックスマップのグリッドが更新され、 hit.png に等しくなり、 empty.pngが置き換えられます。
これを達成するループを作成する方法は考えていますが、各ラベルのピックスマップをランタイム機能と現在のコンパイル時 (静的) 機能の線に沿ったものにする方法がわかりません。QPainter と画像を扱う別の Qt クラスについて読んだことがありますが、まだ苦労しています。
2 次元配列に基づいてこれらのピックスマップを更新するにはどうすればよいですか?
- ループ構造 - 私は理解することができます
- 条件ステートメント - 私は理解することができます
- ラベルを扱うqt固有の構文-初心者なので、atmがわかりません。
これは、私がmap.hでやろうとしている種類の疑似コードです:
#include <QtCore>
#include <QtGui>
// WARNING: PSEUDOCODE, DOES NOT COMPILE
// AT A LOSS ON HOW TO SELECT THE CORRECT LABEL
// MAYBE A CHILD CLASS FOR THAT?
class map {
public:
char updateboard(char mapname, char b[][10]){
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
char C = b[i][j];
if (C == 'M'){//miss
Qlabel mapname_[i][j](<img src='images/missspace.png'/>);
mapname_[i][j].show();
}
else if(C == 'X'){//hit
Qlabel mapname_[i][j](<img src='images/hitspace.png'/>);
mapname_[i][j].show();
}
else if(C == ' '){//undiscovered space
Qlabel mapname_[i][j](<img src='image/emptyspace.png'/>);
mapname_[i][j].show();
}
}
}
}
};
次に、mainwindow.cpp に map.h を含めて、次のように言います。
// calls class function update board
// takes updated array values and replaces old pixmap with new
map.updateboard(T,b[][10]); // target map update
map.updateboard(F,v[][10]); // fleet map update
前もって感謝します
アップデート:
ボタンを押してピックスマップを交換できるようになりましたが、もっと動的なものを作成したいと思います。次を使用してxy値を追加することにより、変更したいラベルの名前を配置するQstringを使用したかった:
TR_position.append(QString::number(xvalue));
次を使用して呼び出そうとすると:
ui->TR_position->setPixmap(QPixmap(":/images/missspace.png"));
...それは明らかに機能しません。大文字と小文字を区別して入力する方法、または文字列の内容を Qlabel 名として使用する方法はありますか?