・ハッシュ探索法
 ハッシュテーブルの配列による実装(かぶり無し)
 ハッシュテーブルをリストで実装
・リスト構造の話(連結リスト、リンクリスト、リンクトリスト)
 →単方向リスト forward_list(単方向、前方追加型リスト)
 →双方向リスト list(双方向、前方・後方追加型リスト)
  →循環リスト  ????
  ⇒前方追加型
   常に前にデータを追加
  ⇒後方追加型
   常に後ろにデータを追加
・構造体(C/C++でレコード型を表現するモノ)
 複数の型をパックして新しい型として使える
  例)
  ベクトル型 座標(整数)と長さ(原点からの長さ)
 struct vector2D{
     int x, y; //座標
     double l; //長さ
  };
 vector2D p1,p2,p3;
  vector2D p[5];

  トランプを表してみようよ

 トランプ
  ・マーク(♥♦♣♠:suit)
  ・数字 (A,2~10,J,Q,K)
  ⇒コンピュータプログラムの上でどのような表し方をするか
  モデリング:現実世界のものをコンピュータの中でどう表現するか?
 struct card{
     int suit;   //0~4  ♥:0 ♦:1 ♣:2 ♠:3 B:4
     int number; //0~13 B:0 A:1 2~10 J:11 Q:12 K:13
  }
  表示の工夫
  suit 0 ⇒"♥", 1 ⇒"♦", 2 ⇒"♣", 3 ⇒"♠", 4 ⇒"B" 
    number 1 ⇒"A",11 ⇒"J",12 ⇒"Q",13 ⇒"K" 0 ⇒"B"
  card c = {2, 1};
  c.suit   で cのsuirにアクセス(代入、参照)
  c.number で  cのnumberにアクセス
 
  ♣A←これを表示したい
  if(c.suit == 0)
	cout << "♥";
  else if(c.suit == 1)
	cout << "♦";
  else if(c.suit == 2)
	cout << "♣";
  else if(c.suit == 3)
	cout << "♠";
  else
    cout << "B";

  switch(c.suit)
  {
      case 0:cout << "♥";break;
      case 1:cout << "♦";break;
      case 2:cout << "♣";break;
      case 3:cout << "♠";break;
    case 4:cout << "B";break;
  }
  
  cout << mark[0];  ♥
 cout << mark[1];  ♦
 cout << mark[2];  ♣
 cout << mark[3];  ♠
 cout << mark[4];  B 
 string mark[5] = {"♥","♦","♣","♠","B"};

 スタックとキュー

 スタック(後入れ先出し(LIFO Last-in First-out))
  深さ7のスタック(整数)
   上|_|_|_|_|_|_|_|底
  プッシュ(データをスタックに入れる)
  5をプッシュ
   上|_|_|_|_|_|_|5|底
    push(3) 
     上|_|_|_|_|_|3|5|底
    push(7) 
      上|_|_|_|_|7|3|5|底
   ポップ(データをスタックから削除)
    一番上のデータが消える
    pop()
   7←上|_|_|_|_|_|3|5|底
  pop()
   3←上|_|_|_|_|_|_|5|底

 キュー(行列で並ぶ人 待ち行列)
 キュー(先入先出 FIFO(First-in First-out)
   長さ7のキュー
   出|_|_|_|_|_|_|_|入  待:3,5,7,9
      enque(3) エンキュー
   出|3|_|_|_|_|_|_|入  待:5,7,9
   enque(5) エンキュー
   出|3|5|_|_|_|_|_|入  待:7,9
      deque() デキュー
  3←出|5|_|_|_|_|_|_|入  待:7,9
     enque(7) エンキュー
      出|5|7|_|_|_|_|_|入  待:9
#include <iostream>
#include <forward_list> //双方向リスト
#include <string>
using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::forward_list;
 
string mark[5] = { u8"♥", u8"♦", u8"♣", u8"♠", u8"B" };
//A 2~10 J Q K, Bで表示
string num[14] = { "B","A","2","3","4","5","6",
				   "7","8","9","10","J","Q","K" };//最後まで書いてみる
 
struct card
{
	int suit;   //スート 0:H 1:D 2:C 3:S 4:B 0~4
	int number; //数字 0:J 1:A 2:2 ... 11:J 12:Q 13:K  0~13
};
 
void printCard(card _dat)
{
	cout << mark[_dat.suit] << num[_dat.number];
}
 
int irand(int _num)
{
	return(rand() % _num);
}
 
void shuffle(card _dat[], int _cnum)
{
	for (int i = 0; i < 100; i++)
	{
		int n1 = irand(_cnum);
		int n2 = irand(_cnum);
		std::swap(_dat[n1], _dat[n2]);
	}
}
 
void printMydeck(forward_list<card>& _dat)
{
	for (auto theI = _dat.begin(); theI != _dat.end(); theI = std::next(theI))
	{
		printCard(*theI);
		cout << " ";
	}
}
//card dat;
//dat.suit = 2;
//dat.number = 12;
//"♦Q"を表示! したいけどうまくいかないから DQ
int main() {
	system("chcp 65001");
	system("cls");
	//配列でやってみる cards[13*4+2]
	//for分とかを組み合わせて
	//各マーク4×13枚+ジョーカー2枚でカードを初期化してみよう
	const int card_num = 4 * 13 + 2;
	card mycard[card_num];
	int i = 0;
	for (int mk = 0; mk < 4; mk++) //mk(スートの種類を表す変数)0~3
	{
		for (int nb = 1; nb <= 13; nb++)//トランプの番号
		{
			//mycard[13 * mk +(nb-1)].suit = mk ;
			//mycard[13 * mk +(nb-1)].number = nb ;
			mycard[i].suit = mk;
			mycard[i].number = nb;
			i++;
		}
	}
	//多分 iは 52になっている 通常カード index 0~ index 51 の13x4=52枚
	mycard[i].suit = 4;//ババ一枚目 index 52
	mycard[i].number = 0;
	i++;
	mycard[i].suit = 4;//ババ二枚目 index 53
	mycard[i].number = 0;
 
	shuffle(mycard, card_num);
 
	forward_list<card> mydeck;\
	const int deck_size = 15;	//デッキサイズを指定する定数
	for (int i = 0; i < deck_size; i++)
	{
		mydeck.push_front(mycard[i]);
	}
 
 
	//iterator くり返し用の、「アドレスを入れる」変数
 
	forward_list<card>::iterator theI = mydeck.begin(); //listの先頭要素のアドレス
	while (true)
	{
		if (theI == mydeck.end())
		{
			break;
		}
		else
		{
			printCard(*theI); //
			cout << " ";			
			theI = std::next(theI);//forward_list, list 両方可能
			//theI = std::prev(theI);//listのみ可能		
		}
	}
	cout << endl; 
	card p1[2], p2[2];
	p1[0] = mydeck.front();//先頭データをp1の1枚目として配る
	mydeck.pop_front();//先頭データを削除
	printMydeck(mydeck);
    //p1とp2に2枚ずつカードを配る p1p2p1p2
    //P1、P2の持ってる2枚のカードの数字の和 BBは0点を得点として
    //、得点の多いほうが勝ち
	//Aは14点として数えましょう
	//2人のプレーヤーの手札を公開して、
	//どちらが勝ちか判定して表示する
    //できちゃった人は追加課題として、デッキの枚数を増やして、3回勝負にする
	//とかやってみてください。
}
  • game-engineer/classes/2022/game-programing-1/first-term/9/9-07-56.txt
  • 最終更新: 3年前
  • by root