7年前のソースコード

ひどいものを発掘した。大体プログラミング学習し始めたくらいの時期のもの。
気が向いたら書き直してみたい。

/*作るのに当たってのメモ

card数列は、終わりを100、カードが存在しないのを60とする。
また、card_num数列も同じ。

*/

#define		PLAYER	4
#define		ALL		54
#define		STOP	_getch()

int		yama[ALL];
int		card[PLAYER][ALL];
int		card_num[PLAYER][ALL];
int		turn[PLAYER];
int		arg_set[PLAYER-1][PLAYER-1];			//[NPCの番号][0:混ぜ方 1:カードの引き方]
int		agari[PLAYER];
int		player_nokori=PLAYER;
int		ranking[PLAYER];
char	card_name[PLAYER][ALL][20];
int		number,next,a,han;

//関数の仮宣言
void	yama_make();
void	yama_shuffle();
void	card_sort(int);
void	card_dump(int , int);
				//(int(プレイヤーの番号) , int(   0:捨てる際にメッセージを表示しない 1:表示する
				//2:あなたが相手から引く 3:COMが相手から引く)  )
void	card_num_make(int);
void	card_name_make(int);
void	card_number(int,int);					//(int(プレイヤーの番号) , int(0:手札を表示しない 1:表示する 2:番号のみ表示))
void	wait(int);								//引数の値だけ、停止
void	arg_shuffle(int,int);					//第一引数:プレイヤーの番号 第二引数:アルゴリズムの設定
void	arg_draw(int,int);						//第一引数:プレイヤーの番号 第二引数:アルゴリズムの設定
void	agari_han();


int _tmain(int argc, _TCHAR* argv[])			//本体
{	
	int aa , a_0 , a_1 , a_2;
	srand( (unsigned)time(NULL) );
	for(a=0 ; a<PLAYER ; a++)
		agari[a]=0;

	while(1)
	{

		printf("開始(1)終了(0)");
		scanf("%d",&han);
		if(han==1)
		{
			yama_make();
			yama[ALL-1]=60;
			yama_shuffle();
			printf("\nカードを配ります。");
			STOP;
			for(a_0=0 ; a_0<(ALL+PLAYER) ; a_0++)
			{
				a=a_0 % PLAYER;
				aa=a_0 / PLAYER;
				if(a_0>ALL-1)
				{
					card[a][aa]=100;
				} else {
					card[a][aa]=yama[a_0];
				}
			}

			for(a=0 ; a<PLAYER ; a++)
			{
				card_name_make(a);
				if(a==0)
				{
				card_number(a,1);
				_getch();
				}
				else
				{
				card_number(a,2);
				}
			}
			STOP;
			printf("\n");
			for(a=0 ; a<PLAYER ; a++)
			{
				card_num_make(a);
				if(a==0)
				{
					card_dump(a,1);
				} else {
					card_dump(a,0);
				}
				card_sort(a);
				card_num_make(a);
			}

			for(a=0 ; a<PLAYER ; a++)
			{
				card_name_make(a);
				if(a==0)
				{
				card_number(a,1);
				_getch();
				}
				else
				{
				card_number(a,2);
				}
			}
			STOP;
			printf("\n");
			printf("今回の順番は、\n");
			for(a=0 ; a<PLAYER ;a++)
			{
				turn[a]=a;
			}
			for(a=0 ; a<100 ;a++)
			{
				while(1)
				{
					a_0=rand()%4;
					a_1=rand()%4;
					if(a_0!=a_1)
					{
						a_2=turn[a_0];
						turn[a_0]=turn[a_1];
						turn[a_1]=a_2;
						break;
					}
				}
			}
			for(a=0 ; a<PLAYER ;a++)
			{
				if(turn[a]==0)
				{
					printf("(%d)あなた\n",a+1);
				}
				else
				{
					printf("(%d)COM%d\n",a+1,turn[a]);
				}
			}

			a=0;
			STOP;
			while(1)
			{
				if(turn[a]==0 && agari[0]==0)
				{
					printf("あなたの番です。\n");
					_getch();
					card_number(turn[a],1);
					if(a+1>=player_nokori)	{
						next=0;
					} else {
						next=a+1;
					}
						card_number(turn[next],2);
					while(1)
					{
						_getch();
						printf("どのカードを引きますか?(0~%d)",number-1);
						scanf("%d",&han);
						if( (han>=0) && (han<number) )
						{
							card_name_make(next);
							printf("\n[%s]を引きました。",card_name[next][han]);
							STOP;
							card_number(turn[a],0);

							if(card[turn[a]][number]==100)
								card[turn[a]][number+1]=100;
							card[turn[a]][number]=card[next][han];
							card[next][han]=60;

							card_sort(next);
							card_number(next,0);
							agari_han();

							card_num_make(turn[a]);
							card_name_make(turn[a]);
							card_dump(turn[a],2);

							card_sort(turn[a]);
							card_name_make(turn[a]);
							card_number(turn[a],1);
							agari_han();
							if(a<player_nokori-1)	{
								a++;
							} else {
								a=0;
							}
							break;
						}
						else
						{
							printf("値が不正です。\n\n");
						}
					}
				}
				else
				{
					printf("COM%dの番です。\n",turn[a]);
					card_number(turn[a],0);
					if(a+1>=player_nokori)	{
						next=0;
					} else {
						next=a+1;
					}
					card_number(turn[next],0);
					if(turn[next]==0)
					{
					}
					else
					{
						arg_shuffle(next,arg_set[next][0]);
						arg_draw(next,arg_set[a][1]);

						card_number(turn[a],0);
						if(card[turn[a]][number]==100)
							card[turn[a]][number+1]=100;

						card[turn[a]][number]=card[next][han];
						card[next][han]=60;

						card_sort(next);
						card_number(next,0);
						agari_han();

						card_num_make(turn[a]);
						card_name_make(turn[a]);
						card_dump(turn[a],3);

						card_sort(turn[a]);
						card_name_make(turn[a]);
						card_number(turn[a],1);
						agari_han();
						if(a<player_nokori-1)	{
							a++;
						} else {
							a=0;
						}
					}

				}
			}
				
				


			break;
		}
		else if(han==0)
		{
			break;
		} else {
			printf("値が不正です。\n\n");
		}


	}
	STOP;
	return 0;
}


void	yama_make()							//山札の新規作成
{
	int i_0=0;

	for(i_0=0 ; i_0<ALL ; i_0++)
	{
		yama[i_0]=i_0+1;
	}
}
void	yama_shuffle()						//山札を混ぜる
{
	int i_0=0 , i_1=0 , i_2=0 , i_3=0;

	for(i_0=0 ; i_0<=1000 ; i_0++)
	{
		while(1)
		{
			i_1=rand()%ALL;
			i_2=rand()%ALL;
			if(i_1!=i_2)
			{
				i_3=yama[i_1];
				yama[i_1]=yama[i_2];
				yama[i_2]=i_3;
				break;
			}

		}
	}
}
void	card_sort(int i)					//各プレイヤーの手札を並び替え
{
	int i_0 , i_1 , i_2;
	for(i_0=0 ; card[i][i_0]<100 ; i_0++)
	{
		for(i_1=0 ; card[i][i_1+1]!=100 ; i_1++)
		{
			if(card[i][i_1]>card[i][i_1+1])
			{
				i_2=card[i][i_1];
				card[i][i_1]=card[i][i_1+1];
				card[i][i_1+1]=i_2;
			}
		}
	}
}
void	card_dump(int i,int ii)						//手札カードのうち、番号の同じもの同士を捨てる。
{
	int i_0 , i_1, i_2=0;

	for(i_0=0 ; card_num[i][i_0]!=100 ; i_0++)
	{
		for(i_1=i_0+1 ; card_num[i][i_1]!=100 ; i_1++)
		{
			if((card_num[i][i_0] == card_num[i][i_1]) && card_num[i][i_0] != 60)
			{
				if(ii==1)
				{
					card_name_make(i);
					printf("場に[%s]と[%s]が捨てられました。\n",card_name[i][i_0],card_name[i][i_1]);
				}
				if(ii==2)
				{
					printf("場に[%s]と[%s]を捨てました。\n",card_name[i][i_0],card_name[i][i_1]);
				}
				if(ii==3)
				{
					printf("場に[%s]と[%s]が捨てられました。\n",card_name[i][i_0],card_name[i][i_1]);
				}
				card_num[i][i_0]=60;
				card_num[i][i_1]=60;
				card[i][i_0]=60;
				card[i][i_1]=60;
				i_2=1;
				break;
			}
		}
	}
	if(i_2==0)
	{
		if(ii==2)
		{
			printf("捨てるカードはありません。\n");
		}
		if(ii==3)
		{
			printf("捨てるカードが無かったようです。\n");
		}
	}
}

void	card_num_make(int i)
{
	int i_0;
	for(i_0=0 ; card[i][i_0]!=100 ; i_0++)
	{
		switch(card[i][i_0])
		{
			case 1:
			case 14:
			case 27:
			case 40:
				card_num[i][i_0]=1;
				break;
			case 2:
			case 15:
			case 28:
			case 41:
				card_num[i][i_0]=2;
				break;
			case 3:
			case 16:
			case 29:
			case 42:
				card_num[i][i_0]=3;
				break;
			case 4:
			case 17:
			case 30:
			case 43:
				card_num[i][i_0]=4;
				break;
			case 5:
			case 18:
			case 31:
			case 44:
				card_num[i][i_0]=5;
				break;
			case 6:
			case 19:
			case 32:
			case 45:
				card_num[i][i_0]=6;
				break;
			case 7:
			case 20:
			case 33:
			case 46:
				card_num[i][i_0]=7;
				break;
			case 8:
			case 21:
			case 34:
			case 47:
				card_num[i][i_0]=8;
				break;
			case 9:
			case 22:
			case 35:
			case 48:
				card_num[i][i_0]=9;
				break;
			case 10:
			case 23:
			case 36:
			case 49:
				card_num[i][i_0]=10;
				break;
			case 11:
			case 24:
			case 37:
			case 50:
				card_num[i][i_0]=11;
				break;
			case 12:
			case 25:
			case 38:
			case 51:
				card_num[i][i_0]=12;
				break;
			case 13:
			case 26:
			case 39:
			case 52:
				card_num[i][i_0]=13;
				break;
			
			
			case 53:
			case 54:
				card_num[i][i_0]=14;
				break;

			default:
				card_num[i][i_0]=60;
				
		}

	}
	card_num[i][i_0]=100;
}

void	card_name_make(int i)
{
	int i_0;
	for(i_0=0 ; card_num[i][i_0]!=100 ;i_0++)
	{
		switch(card[i][i_0])
		{
			case 1:
				strcpy( card_name[i][i_0] , "†①" );
				break;
			case 2:
				strcpy( card_name[i][i_0] , "†②" );
				break;
			case 3:
				strcpy( card_name[i][i_0] , "†③" );
				break;
			case 4:
				strcpy( card_name[i][i_0] , "†④" );
				break;
			case 5:
				strcpy( card_name[i][i_0] , "†⑤" );
				break;
			case 6:
				strcpy( card_name[i][i_0] , "†⑥" );
				break;
			case 7:
				strcpy( card_name[i][i_0] , "†⑦" );
				break;
			case 8:
				strcpy( card_name[i][i_0] , "†⑧" );
				break;
			case 9:
				strcpy( card_name[i][i_0] , "†⑨" );
				break;
			case 10:
				strcpy( card_name[i][i_0] , "†⑩" );
				break;
			case 11:
				strcpy( card_name[i][i_0] , "†⑪" );
				break;
			case 12:
				strcpy( card_name[i][i_0] , "†⑫" );
				break;
			case 13:
				strcpy( card_name[i][i_0] , "†⑬" );
				break;
			case 14:
				strcpy( card_name[i][i_0] , "○①" );
				break;
			case 15:
				strcpy( card_name[i][i_0] , "○②" );
				break;
			case 16:
				strcpy( card_name[i][i_0] , "○③" );
				break;
			case 17:
				strcpy( card_name[i][i_0] , "○④" );
				break;
			case 18:
				strcpy( card_name[i][i_0] , "○⑤" );
				break;
			case 19:
				strcpy( card_name[i][i_0] , "○⑥" );
				break;
			case 20:
				strcpy( card_name[i][i_0] , "○⑦" );
				break;
			case 21:
				strcpy( card_name[i][i_0] , "○⑧" );
				break;
			case 22:
				strcpy( card_name[i][i_0] , "○⑨" );
				break;
			case 23:
				strcpy( card_name[i][i_0] , "○⑩" );
				break;
			case 24:
				strcpy( card_name[i][i_0] , "○⑪" );
				break;
			case 25:
				strcpy( card_name[i][i_0] , "○⑫" );
				break;
			case 26:
				strcpy( card_name[i][i_0] , "○⑬" );
				break;
			case 27:
				strcpy( card_name[i][i_0] , "◇①" );
				break;
			case 28:
				strcpy( card_name[i][i_0] , "◇②" );
				break;
			case 29:
				strcpy( card_name[i][i_0] , "◇③" );
				break;
			case 30:
				strcpy( card_name[i][i_0] , "◇④" );
				break;
			case 31:
				strcpy( card_name[i][i_0] , "◇⑤" );
				break;
			case 32:
				strcpy( card_name[i][i_0] , "◇⑥" );
				break;
			case 33:
				strcpy( card_name[i][i_0] , "◇⑦" );
				break;
			case 34:
				strcpy( card_name[i][i_0] , "◇⑧" );
				break;
			case 35:
				strcpy( card_name[i][i_0] , "◇⑨" );
				break;
			case 36:
				strcpy( card_name[i][i_0] , "◇⑩" );
				break;
			case 37:
				strcpy( card_name[i][i_0] , "◇⑪" );
				break;
			case 38:
				strcpy( card_name[i][i_0] , "◇⑫" );
				break;
			case 39:
				strcpy( card_name[i][i_0] , "◇⑬" );
				break;
			case 40:
				strcpy( card_name[i][i_0] , "★①" );
				break;
			case 41:
				strcpy( card_name[i][i_0] , "★②" );
				break;
			case 42:
				strcpy( card_name[i][i_0] , "★③" );
				break;
			case 43:
				strcpy( card_name[i][i_0] , "★④" );
				break;
			case 44:
				strcpy( card_name[i][i_0] , "★⑤" );
				break;
			case 45:
				strcpy( card_name[i][i_0] , "★⑥" );
				break;
			case 46:
				strcpy( card_name[i][i_0] , "★⑦" );
				break;
			case 47:
				strcpy( card_name[i][i_0] , "★⑧" );
				break;
			case 48:
				strcpy( card_name[i][i_0] , "★⑨" );
				break;
			case 49:
				strcpy( card_name[i][i_0] , "★⑩" );
				break;
			case 50:
				strcpy( card_name[i][i_0] , "★⑪" );
				break;
			case 51:
				strcpy( card_name[i][i_0] , "★⑫" );
				break;
			case 52:
				strcpy( card_name[i][i_0] , "★⑬" );
				break;
			case 53:
				strcpy( card_name[i][i_0] , "JK" );
				break;
			case 54:
				strcpy( card_name[i][i_0] , "JK" );
				break;
			case 60:
				strcpy( card_name[i][i_0] , "" );
		}


	}
}

void	wait(int i)
{
	int i_0;
	i_0=int(time(NULL));
	while((int(time(NULL))-i_0)<i)
		;
}
void	card_number(int i , int ii)
{
	int i_0 , i_1=0 , i_2=1;
	if((ii!=0) && i==0)
	{
		printf("あなたの手札は、\n");
	}
	else if(ii != 0) 
	{
		printf("COM%dの手札は、",i);
	} else 
		;

	for(i_0=0 ; card[i][i_0]!=100 ; i_0++)
	{
		if(card[i][i_0]!=60)
		{
			if(ii==2)
			{
				printf("[%d]",i_0);
			}
			else if(ii==1)
			{
				if(i_2>10)
				{
					printf("\n");
					i_2=0;
				}
				printf("[%s]",card_name[i][i_0]);
				i_2++;
			}
			i_1++;
		}
	}
	if((ii!=0) && ii==0) 
	{
	printf("%d枚です。\n",i_1);
	} else if(ii != 0) {
	printf("(%d枚)\n\n",i_1);
	}
	number=i_1;
}

void	agari_han()
{
	int i_0 , i_1 , i_2;
	if(number==0)
	{
		player_nokori-=1;
		ranking[PLAYER-player_nokori]=turn[a];
		if(turn[a]==0)	{
			printf("あなたは%d着です。\n",PLAYER-player_nokori);
		} else {
			printf("COM%d%d着です。\n",turn[a],PLAYER-player_nokori);
		}
		turn[a]=PLAYER;
		for(i_1=0 ; i_1<PLAYER-1 ;i_1++)
		{
			if(turn[i_1]==PLAYER)
			{
				i_2=turn[i_1];
				turn[i_1]=turn[i_1+1];
				turn[i_1+1]=i_2;
			}
		}

		if(player_nokori==1)
		{
			ranking[PLAYER-player_nokori]=0;
			printf("\nゲーム終了\n");
			STOP;
			printf("\n結果発表\n");
			wait(4);

			for(i_0=0 ; i_0<PLAYER ;i_0++)
			{
				if(ranking[i_0]==0)
				{
					printf("%d\tあなた\n",i_0+1);
					wait(2);
				} else {
					printf("%d\tCOM%d\n",i_0+1,ranking[i_0]);
					wait(1);
				}
			}
		}
	}
}

void	arg_draw(int i,int ii)
{
	int i_0=0 , i_1=0 , i_2=0 , i_3 , i_4;
	switch(ii)
	{

	case 0:
		han=rand()%number;
		break;

	case 1:
		if(rand()%2==0)	{
			han=0;
		}else{
			han=number-1;
		}
		break;

	case 2:
		if(player_nokori<PLAYER)
		{
			han=rand()%number;
		}
		else
		{
			han=number/2;
		}
		break;
	case 3:
		if(player_nokori<PLAYER)
		{
			if(rand()%2==0)	{
				han=0;
			}else{
				han=number-1;
			}
		}
		else
		{
			han=number/2;
		}
		break;
	}
}

void	arg_shuffle(int i,int ii)
{
	int i_0=0 , i_1=0 , i_2=0 , i_3 , i_4;
	switch(ii)
	{

	case 0:
		{
			for(i_0=0 ; card[i][i_0]<100 ; i_0++)
			{
				for(i_1=0 ; card[i][i_1+1]!=100 ; i_1++)
				{
					if(card[i][i_1]>card[i][i_1+1])
					{
						i_2=card[i][i_1];
						card[i][i_1]=card[i][i_1+1];
						card[i][i_1+1]=i_2;
					}
				}
			}
		}
		break;

	case 1:
		{
			for(i_0=0 ; card[i][i_0]<100 ; i_0++)
			{
				for(i_1=0 ; card[i][i_1+1]!=100 ; i_1++)
				{
					if(card[i][i_1]<card[i][i_1+1])
					{
						i_2=card[i][i_1];
						card[i][i_1]=card[i][i_1+1];
						card[i][i_1+1]=i_2;
					}
					else if(card[i][i_1]==60)
					{
						i_2=card[i][i_1];
						card[i][i_1]=card[i][i_1+1];
						card[i][i_1+1]=i_2;
					}
				}
			}
		}
		break;

	case 2:

		card_number(i,0);

		for(i_0=0 ; i_0<100 ; i_0++)
		{
			while(1)
			{
				i_2=rand()%number;
				i_3=rand()%number;
				if(i_2!=i_3)
				{
					i_4=yama[i_2];
					yama[i_2]=yama[i_3];
					yama[i_3]=i_4;
					break;
				}

			}
		}
	}
}