listの処理 大富豪製作

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Rom
記事: 25
登録日時: 14年前
住所: 日本

listの処理 大富豪製作

#1

投稿記事 by Rom » 14年前

こんにちは。Romと申します

ただいま大富豪を製作しています。
環境
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++;
			}
}
添付ファイル
ソース.zip
ソースファイルです
(4.73 KiB) ダウンロード数: 264 回

アバター
a5ua
記事: 199
登録日時: 14年前

Re: listの処理 大富豪製作

#2

投稿記事 by a5ua » 14年前

72行目の
player[NowBa.turn].tehuda.erase(it);

it = player[NowBa.turn].tehuda.erase(it);
としたらどうでしょうか。

Rom
記事: 25
登録日時: 14年前
住所: 日本

Re: listの処理 大富豪製作

#3

投稿記事 by Rom » 14年前

できました。初歩的なミスですねorz

ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る