下
C言語のお勉強ページに対するご意見・ご感想スレ
33:へなちょこ管理人 ★ 2009/01/23(金) 21:22:29 【びん取りゲーム】 ルール:交互に1〜3本のびんを取ります。最後の1本を取った人が負けです。 びんの本数: 20 先攻後攻を決めます...先攻 [1] / 後攻 [2] : 1 ===========================あなたの先攻でスタート============================ 何本取りますか?...3 プレイヤー>3 本取ったぞ! □□□■■■■■■■■■■■■■■■■■ あと 17 本! コンピュータ>1 本取ったぞ! □□□□■■■■■■■■■■■■■■■■ あと 16 本! 何本取りますか?...2 プレイヤー>2 本取ったぞ! □□□□□□■■■■■■■■■■■■■■ あと 14 本! コンピュータ>2 本取ったぞ! □□□□□□□□■■■■■■■■■■■■ あと 12 本! 何本取りますか?...2 プレイヤー>2 本取ったぞ! □□□□□□□□□□■■■■■■■■■■ あと 10 本! コンピュータ>1 本取ったぞ! □□□□□□□□□□□■■■■■■■■■ あと 9 本! 何本取りますか?...3 プレイヤー>3 本取ったぞ! □□□□□□□□□□□□□□■■■■■■ あと 6 本! コンピュータ>1 本取ったぞ! □□□□□□□□□□□□□□□■■■■■ あと 5 本! 何本取りますか?...1 プレイヤー>1 本取ったぞ! □□□□□□□□□□□□□□□□■■■■ あと 4 本! コンピュータ>3 本取ったぞ! □□□□□□□□□□□□□□□□□□□■ あと 1 本! =================================ゲーム終了================================== あなたの負け!また挑戦してね! nterキーを押すと終了...
34:へなちょこ管理人 ★ 2009/01/23(金) 21:23:57 #include <stdio.h> #include <time.h> #include <stdlib.h> #include <windows.h> //びん取りゲーム main () { int bin_max;//びんの総本数 int bin;//残りびんの本数 int max = 3;//一度に取れるびんの最大数 int p_turn = 0;//プレイヤーターンフラグ int p_get, m_get;//プレイヤー、コンピュータそれぞれの取ったびんの数 int i; srand(time(NULL)); //びんの総本数を決める bin_max = rand()%5 + 20; bin = bin_max; printf("【びん取りゲーム】\n"); printf("ルール:交互に1〜3本のびんを取ります。最後の1本を取った人が負けです。\n"); printf("びんの本数: %d\n", bin_max); //先攻後攻を決める printf("先攻後攻を決めます...先攻 [1] / 後攻 [2] : "); scanf("%d", &p_turn); while(getchar() != '\n') { } if(p_turn == 1 || p_turn == 2) { printf("============================あなたの"); if(p_turn == 1) { printf("先攻"); } else if(p_turn == 2) { printf("後攻"); p_turn = 0; } printf("でスタート============================\n\n"); } else { printf("不正な値を受け取りました...強制的にプレイヤーは後攻です。\n\n"); p_turn = 0; } //びんを交互に取る for(; bin > 1; p_turn = !p_turn) { if(p_turn) {//プレイヤーのターン do { p_get = 0; printf("何本取りますか?..."); scanf("%d", &p_get); while(getchar() != '\n') { } } while((p_get < 1) || (p_get > max)); printf("プレイヤー>%d 本取ったぞ!\n", p_get); bin -= p_get; if(bin <= 0) { printf("プレイヤー>0になっちゃったよ・・・\n"); } } else {//コンピュータのターン if(bin <= max + 1) { m_get = bin - 1; Sleep(500); } else { m_get = rand()%max+1; Sleep(rand()%500 + 1000); } printf("コンピュータ>%d 本取ったぞ!\n", m_get); bin -= m_get; } //残り本数の表示 if(bin >= 1) { for(i = 0; i < bin_max; i++) { if(i < bin_max - bin) { printf("□"); } else { printf("■"); } } printf(" あと %d 本!\n", bin); } } printf("\n==================================ゲーム終了==================================\n"); //勝敗判定 if(!p_turn && (bin <= 0)) { p_turn = !p_turn; } if(p_turn) { printf("あなたの負け!また挑戦してね!\n"); } else { printf("あなたの勝ち!\n"); } /***********************************以下追加文********************************/ printf("Enterキーを押すと終了..."); rewind(stdin); getchar(); /***********************************追加文終了********************************/ return 0; }
35:名無しさんが転んだ! 2009/01/26(月) 09:45:38 演習7-4の解答ページが見れなくなっています。
36:へなちょこ管理人 ★ 2009/01/26(月) 20:00:22 >>35 ローカル見てみたらどうやら解いてないみたいです。。。 ちょっと解いてみますね。
37:へなちょこ管理人 ★ 2009/01/26(月) 23:19:05 現在Cのコンパイル環境がないので昔のPCでちまちまやるの面倒だった・・・。 おおざっぱですが、やってみました。挙動がおかしかったらご指摘下さい。
38:へなちょこ管理人 ★ 2009/01/26(月) 23:20:16 /* 符号無し整数xのposビット目からn個のビットを、1にした値を返す関数set_n、0にした値を返す関数reset_n、反転した値を返す関数inverse_n unsigned set_n( unsigned x, int pos, int n) { /*…*/ } unsigned reset_n( unsigned x, int pos, int n) { /*…*/ } unsigned inverse_n( unsigned x, int pos, int n) { /*…*/ } を作成せよ。 */ #include <stdio.h> /*---整数x中のセットされたビット数を返す---*/ int count_bits(unsigned x) { int count = 0; while(x){ if ( x & 1U ) count++; x >>= 1; } return count; } /*---unsigned型のビット数を返す---*/ int int_bits(void) { return count_bits(~0U); } /*---unsigned型のビット内容を表示---*/ void print_bits(unsigned x) { int i; for ( i = int_bits() - 1; i >= 0; i-- ) putchar((( x >> i ) & 1U ) ? '1' : '0'); putchar('\n'); } /*符号無し整数xのposビット目からn個のビットを1にした値を返す*/ unsigned set_n(unsigned x, int pos, int n) { unsigned i = 1U; int j; for ( j = pos -1; j < pos; j++ ) { i <<= 1 i += 1; } return i | x; } /*符号無し整数xのposビット目からn個のビットを0にした値を返す*/ unsigned reset_n(unsigned x, int pos, int n) { unsigned i = 1U; int j; for ( j = pos -1; j < pos; j++ ) { i <<= 1 i += 1; } i = ~i; return i & x; } /*符号無し整数xのposビット目からn個のビットを反転した値を返す*/ unsigned inverse_n(unsigned x, int pos, int n) { unsigned i = 1U; int j; for ( j = pos -1; j < pos; j++ ) { i <<= 1 i += 1; } return i ^ x; } int main(void) { unsigned no; int bit; printf("整数を入力してください:"); scanf("%lu", &no); puts("ビットの中身"); print_bits(no); printf("何ビット目を処理しますか:"); scanf("%d", &bit); printf("ON_n:\t"); print_bits(set_n(no, bit)); printf("OFF_n:\t"); print_bits(reset_n(no, bit)); printf("INVERSE_n:"); print_bits(inverse_n(no, bit)); return 0; }
39:へなちょこ管理人 ★ 2009/01/26(月) 23:23:44 fooooooooooooooooooooooooo forの中のj = pos - 1ってのは全部j = 0におきかえてくだしあ。 間違えたまま保存してたw
40:@携帯 2009/01/27(火) 13:03:01 [sage] あー ちゃんと引数あたえてなかったりでめちゃめちゃや。 帰宅してから直します。
41:へなちょこ管理人 ★ 2009/01/27(火) 20:12:43 >符号無し整数xのposビット目からn個のビットを 右にn個なのか左にn個なのか・・・。 humm...
42:へなちょこ管理人 ★ 2009/01/27(火) 20:40:51 /* 符号無し整数xのposビット目からn個のビットを、1にした値を返す関数set_n、0にした値を返す関数reset_n、反転した値を返す関数inverse_n unsigned set_n( unsigned x, int pos, int n) unsigned reset_n( unsigned x, int pos, int n) unsigned inverse_n( unsigned x, int pos, int n) を作成せよ。 */ #include <stdio.h> /*---整数x中のセットされたビット数を返す---*/ int count_bits(unsigned x) { int count = 0; while(x) { if ( x & 1U ) count++; x >>= 1; } return count; } /*---unsigned型のビット数を返す---*/ int int_bits(void) { return count_bits(~0U); } /*---unsigned型のビット内容を表示---*/ void print_bits(unsigned x) { int i; for ( i = int_bits() - 1; i >= 0; i-- ) putchar((( x >> i ) & 1U ) ? '1' : '0'); putchar('\n'); } /*符号無し整数xのposビット目からn個のビットを1にした値を返す*/ unsigned set_n(unsigned x, int pos, int n) { unsigned i = 1U; int j; for ( j = 0; j < n - 1; j++ ) { i <<= 1; i += 1; } i <<= pos - n; return i | x; } /*符号無し整数xのposビット目からn個のビットを0にした値を返す*/ unsigned reset_n(unsigned x, int pos, int n) { unsigned i = 1U; int j; for ( j = 0; j < n - 1; j++ ) { i <<= 1; i += 1; } i <<= pos - n; i = ~i; return i & x; } /*符号無し整数xのposビット目からn個のビットを反転した値を返す*/ unsigned inverse_n(unsigned x, int pos, int n) { unsigned i = 1U; int j; for ( j = 0; j < n - 1; j++ ) { i <<= 1; i += 1; } i <<= pos - n; return i ^ x; } int main(void) { unsigned no; int bit,n; printf("整数を入力してください:"); scanf("%lu", &no); puts("ビットの中身"); print_bits(no); printf("何ビット目を処理しますか:"); scanf("%d", &bit); printf("何個処理しますか:"); scanf("%d", &n); printf("ON_n:\t\t"); print_bits(set_n(no, bit, n)); printf("OFF_n:\t\t"); print_bits(reset_n(no, bit, n)); printf("INVERSE_n:\t"); print_bits(inverse_n(no, bit, n)); return 0; }
上
前
次
1-
新
書
写
板
AA
設
索
C言語のお勉強ページに対するご意見・ご感想スレ http://newcomer.s368.xrea.com/test/read.cgi/bbs/1186266778/l50