ただいま大富豪を製作しています。
環境
OS:Win Vista
コンパイラ: VC++EE
言語: C++ + DXライブラリ
大富豪で手札を捨てるときの動作を作ってます。
まず画面に自分の手札がすべて画像として表示されており、カードを指すカーソルを
左右に移動させることができます。捨てるカードを好きな枚数選択、最後に決定に相当するボタン(今はEです)を
押すと、それが現在の状況で捨てることが可能か判断します。
今、捨てることが可能か判断する関数を作っています。
たぶんかなり長いのでソースも添付しておきます。
問題点:
決定キー(E)を押すと、
"list iterator incompatible"
と表示されます。
訳すと イテレーターが矛盾してます ってことですよね。
そう思って見直しているのですが、問題箇所がわかりません。
お願いします。
トランプの画像はhttp://www2.jan.ne.jp/~hide/syumi/gifs/tr/のを使用しています。
ゲームが完成したら、素材は自前で用意する予定です
typedef struct{
CARDMARK suit; //カードの種類(スペード、ダイヤ等
int num; //カードの数字(1~13
int img; //カードの画像
int place; //カードがどこにあるか(0=山札、1=player1、2=ply2、3=ply3、4=ply4、5=捨て札
int trush_flag; //手札を場に出す(捨てる)かどうかのフラグ -1=捨てない 1=捨てる
}Card;
typedef struct{
char name[20]; //名前
int num_tehuda; //手札枚数
list<Card> tehuda; //手札のカード情報
}Player;
typedef struct{
Card nowcard[4];
int nowmaisuu;
int turn; //今誰のターンか 0~3
int kaku_flag; //革命が起こっているか 0:ない 1:ある
}Ba;
Ba NowBa;
Player player[4];
CheckCardCorrect(){
list<Card> Itizi;
int maisuu=0;
int i=0;
for(it = player[NowBa.turn].tehuda.begin();it!=player[NowBa.turn].tehuda.end();it++){
if((*it).trush_flag==1){
Itizi.push_back((*it));
maisuu++;
}
}
if(Itizi.size()==0)
return -1;
//出したカードがすべて同じ数字か
it = Itizi.begin();
Card a;
if(Itizi.size()>1){
for(i=0;i<Itizi.size()-1;i++){
a = (*it);
it++;
if(a.num!=(*it).num)
return -1;
}
}
//場のカードと枚数が違えばエラー
if(Itizi.size()!=NowBa.nowmaisuu && NowBa.nowmaisuu!=0)
return -1;
//数字の大きさ比較
it = Itizi.begin();
//革命してなくて出したカードが小さかったら
if(NowBa.kaku_flag==0 && NowBa.nowcard[0].num>=(*it).num){
return -1;
/*for(int i=0;i<maisuu;i++){
NowBa.nowcard[i] = player[NowBa.turn].tehuda[i];
//player[NowBa.turn].num_tehuda -= maisuu;
return 0;*/
}
else if(NowBa.kaku_flag==1 && NowBa.nowcard[0].num<=(*it).num){
return -1;
}
it = player[NowBa.turn].tehuda.begin();
while(it != player[NowBa.turn].tehuda.end()){
if((*it).trush_flag==1)
player[NowBa.turn].tehuda.erase(it);
else
it++;
}
return 0;
}
drawGameMain(){
int i=0;
if(Key[KEY_INPUT_Z]==1){
for(int k=0;k<4;k++){
while(player[k].tehuda.size()<13){
int a = GetRand(52);
if(card[a].place==-1){
card[a].place = k;
player[k].tehuda.push_back(card[a]);
player[k].num_tehuda++;
count++;
}
}
}
}
if(Key[KEY_INPUT_A]==1){
for(i=0;i<52;i++){
card[i].place=-1;
count=0;
if(i<4)
player[i].tehuda.clear();
}
}
//////////////////カーソル制御////////////////
if(Key[KEY_INPUT_RIGHT]==1)
cursor++;
if(Key[KEY_INPUT_LEFT]==1)
cursor--;
if(cursor<0)
cursor = player[0].tehuda.size();
if(player[0].num_tehuda!=0)
DrawFormatString(115+(cursor%player[0].num_tehuda)*48,675,red,"▲");
if(Key[KEY_INPUT_Q]==1){
it = player[0].tehuda.begin();
for(i=0;i<cursor;i++){
if(it != player[0].tehuda.end())
it++;
}
(*it).trush_flag *= -1;
}
if(Key[KEY_INPUT_E]==1){
modori=CheckCardCorrect();
}
DrawFormatString(0,0,white,"手札枚数%d,戻り値%d回",cursor,modori);
for(it = player[0].tehuda.begin();it!=player[0].tehuda.end();it++){
if((*it).trush_flag==-1)
DrawGraph(48*i+100,610,(*it).img,FALSE);
else
DrawGraph(48*i+100,600,(*it).img,FALSE);
i++;
}
}