/*------------------------------------------------- * ひたすらわからにくい(? コードを目指してみた。 * 神経衰弱プログラムです。記憶力0のCPUと対戦できます。 * ソースの無断掲載禁止な!まあこんなヒドいソース * 誰もしないと思うけどネ。 * コンパイルはVC2003で確認。動作はXPSP2で確認済み * メモリ破壊バグ・書き換えバグなどあったら * 言ってください。つかここをreadmeに(ry * by エリオン(ワイド) *------------------------------------------------- */ /* * Ver 1.01 -- 例外を少し強化。終了処理をちゃんとかいてみる。 * Ver 1.02 -- コード行数軽量化 * Ver 1.03 -- コード短縮化 */ #include #include #include #define TX (9) #define TY (6) #define MAXCARD (54) #define SAMECHECK (Table[x1][y1] == Table[x2][y2] ? "一致" : "不一致") #define REPCHECK1 (Flag[x1][y1] == 2 || Flag[x1][y1] == 3 ? 1:0) #define REPCHECK2 (Flag[x2][y2] == 2 || Flag[x2][y2] == 3 ? 1:0) #define NBINT unsigned int Table[TX][TY] = {0},Flag[TX][TY]; int CardTable[MAXCARD],CardTable2[MAXCARD] = { 1,2,3,4,5,6,7,8,9,10,11,12,13, 1,2,3,4,5,6,7,8,9,10,11,12,13,99, 1,2,3,4,5,6,7,8,9,10,11,12,13, 1,2,3,4,5,6,7,8,9,10,11,12,13,99 }; int PlayerScore = 0, EnemyScore = 0; short TurnFlag;//0=プレイヤ 1=敵 char Card[][4] = {{" "},{"□"},{"○"},{"×"}};//1:未正解 2:正解 3:敵に取られた! NBINT x1, y1, x2, y2; void EasyAI(NBINT *F1x, NBINT *F1y, NBINT *F2x, NBINT *F2y) { *F1x = rand()%TX, *F1y = rand()%TY, *F2x = rand()%TX, *F2y = rand()%TY; } void EsperAI(NBINT *F1x, NBINT *F1y, NBINT *F2x, NBINT *F2y) { do{*F1x = rand()%TX,*F1y = rand()%TY,*F2x = rand()%TX,*F2y = rand()%TY;}while(Table[*F1x][*F1y] != Table[*F2x][*F2y]); } void ScoreMgr() {//スコア管理 (簡易改造チェック付与) int i,j; for(j = PlayerScore = EnemyScore = 0; j < TY; j++){// 常に再計算を行う for(i = 0; i < TX; i++){ PlayerScore += (Flag[i][j] == 2 ? 1:0); EnemyScore += (Flag[i][j] == 3 ? 1:0); } } printf("味方Score:%3d\t敵Score:%3d\n\n", PlayerScore, EnemyScore); } void TableShuffle() {//カードを切る int i, j, t; srand((unsigned)time(NULL));//擬似乱数の初期値をセット for (i = 0; i < MAXCARD; i++)CardTable[i] = CardTable2[i]; for (j = 0; j < TY; j++){ for(i = 0; i < TX; i++){ do{t = rand() % MAXCARD;}while(CardTable[t] == 0);//0じゃなかったらループを抜ける Table[i][j] = CardTable[t]; CardTable[t] = 0; Flag[i][j] = 1; } } } int main(int argc, char *argv[]) { int arg_count = 0, GameEnd = 0, AIType = 0,i,j; int ReturnNum;//不正な値かどうか簡易チェック TurnFlag=0;//初期化 while (arg_count < argc) {//引数を取得 if (strcmp(argv[arg_count], "-AIgod") == 0) {AIType = 1;} if (strcmp(argv[arg_count], "-AIeasy") == 0){AIType = 0;} arg_count++; } //初期化処理//// TableShuffle(),PlayerScore = EnemyScore = 0;//スコアを初期化 do{ printf("%sのターンです\n",TurnFlag==0?"あなた":"相手"); do { /*カードを出力*/ for (j = 0,puts(" 0 1 2 3 4 5 6 7 8"); j < TY; j++,puts("")){for (i = 0,printf("%d ", j); i < TX; i++){printf("%s", Card[Flag[i][j]]);}} do { int scheck = 0; if (TurnFlag==0){//プレイヤ //カードを引く printf("1つ目のカードを入力(x y) > "); scheck = scanf("%d %d", &x1, &y1); if (scheck == EOF){break;} if (scheck < 1){scanf("%*[^0-9]");} if ((x1<0||x1>=TX)||(y1<0||y1>=TY))y1=x1=0;//値がオーバしたら0を強引にセット printf("2つ目のカードを入力(x y) > "); scheck = scanf("%d %d", &x2, &y2); if (scheck == EOF){break;} if (scheck < 1){scanf("%*[^0-9]");} if ((x2<0||x2>=TX)||(y2<0||y2>=TY))y2=x2=0;//値がオーバしたら0を強引にセット }else if(TurnFlag==1){//敵 switch (AIType){//AIモード case 0:EasyAI(&x1, &y1, &x2, &y2);break;//雑魚AI case 1:EsperAI(&x1, &y1, &x2, &y2);break;//透視 } } }while (x1 == x2 && y1 == y2 || (REPCHECK1 + REPCHECK2) > 0); printf("[%2d,%2d]%2d = [%2d,%2d]%2d : %s\n",x1,y1, Table[x1][y1], x2,y2,Table[x2][y2], SAMECHECK); Flag[x1][y1] = Flag[x2][y2] = TurnFlag==0?(Table[x1][y1] == Table[x2][y2]?2:1):(Table[x1][y1] == Table[x2][y2]?3:1); ScoreMgr(); if ((PlayerScore + EnemyScore) == MAXCARD)break; }while(strcmp(SAMECHECK, "一致") == 0); TurnFlag=TurnFlag==0?1:0;//ターン終了したらフラグを変更 }while ((PlayerScore + EnemyScore) < MAXCARD);//カードがすべてオープンになったら終了 /*カードを出力*/ for (j = 0,puts(" 0 1 2 3 4 5 6 7 8"); j < TY; j++,puts("")){for (i = 0,printf("%d ", j); i < TX; i++){printf("%s", Card[Flag[i][j]]);}} printf("お疲れ様でした。\n得点[%2d対%2d]\nよって、あなたの%sです。\n", PlayerScore, EnemyScore, PlayerScore > EnemyScore ? "勝ち" : "負け"); system("pause"); return 0; }