●エレガントかつ単純Cソースでゲームを書く●
■ このスレッドは過去ログ倉庫に格納されています
00031
NGNGちなみに俺のコード。長すぎるんだよ。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* 標準マクロ、関数定義ここから */
#define TRUE 1
#define FALSE 0
void randmize(void){
srand( time(NULL) );
}
/* 標準マクロ、関数定義ここまで */
void number_to_array(int source, int *array){
array[0] = source / 1000;
array[1] = source % 1000 / 100;
array[2] = source % 100 / 10;
array[3] = source % 10;
}
void create_question(int *array){
int i;
for (i=0;i<4;i++)
array[i]=rand()%10;
}
void input_answer(int *answer){
int n;
do{
printf("4桁の数字を入力(頭のゼロを省略しないように) > ");
scanf("%d",&n);
}while ( n >= 10000);
number_to_array(n, answer);
}
0004デフォルトの名無しさん
NGNGvoid judge(int *computer, int *answer, int *hit, int *blow){
int i,j;
int hit_flag[4]={0,0,0,0};
*hit = 0;
*blow = 0;
for (i=0; i<4; i++)
if ( computer[i] == answer[i]){
(*hit)++;
hit_flag[i] = TRUE;
}
for (i=0; i<4-1; i++)
for (j=i+1; j<4; j++)
if ( (!hit_flag[i]) && (computer[i] == answer[j]) )
(*blow)++;
}
void play(void){
int computer[4], player[4], hit, blow;
create_question( computer );
do{
input_answer( player );
judge( computer, player, &hit, &blow );
printf("[%d]Hit [%d]Blow _ %d%d%d%d\n", hit, blow,computer[0],computer[1],computer[2],computer[3]);
}while ( hit != 4);
return;
}
void main()
{
randmize();
play();
}
0006デフォルトの名無しさん
NGNGおまえならどうかくんだよ
0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNGnbsp;
と半角で書くとインデントできるよ>1
↓例
voidnbsp;number_to_array(intnbsp;source,nbsp;intnbsp;*array){
nbsp;nbsp;nbsp;nbsp;array[0]nbsp;=nbsp;sourcenbsp;/nbsp;1000;
nbsp;nbsp;nbsp;nbsp;array[1]nbsp;=nbsp;sourcenbsp;%nbsp;1000nbsp;/nbsp;100;
nbsp;nbsp;nbsp;nbsp;array[2]nbsp;=nbsp;sourcenbsp;%nbsp;100nbsp;/nbsp;10;
nbsp;nbsp;nbsp;nbsp;array[3]nbsp;=nbsp;sourcenbsp;%nbsp;10;
}nbsp;
00109
NGNG00119
NGNGだった。
void number_to_array(int source, int *array){
array[0] = source / 1000;
array[1] = source % 1000 / 100;
array[2] = source % 100 / 10;
array[3] = source % 10;
}
0012デフォルトの名無しさん
NGNGかちゅーしゃで見たとき死ねるんだよなー
全角スペースでいいじゃん。
0013デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/984182993/
00149
NGNGTurboC++1.01でそのまま動いたよ
tcc handb.c
0015デフォルトの名無しさん
NGNG単にトリッキーなコードで短かくしてるだけじゃん。
0016デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1004183881/l50
0017デフォルトの名無しさん
NGNG0018デフォルトの名無しさん
NGNG0019デフォルトの名無しさん
NGNGOOPLは駄目だな。
0020デフォルトの名無しさん
NGNG>>18
数当てゲーム。
4桁以上の数字をヒントを参考にして何回めかで当てる。
掛け金でも無いと、ちっともおもしろくないが。
4桁の場合、
最初はなにも掲示されず、参加者は適当な数字を4つ選ぶ。
この時点で当てられる事は無いに等しいから、高額商品が並ぶ。
2回目。最初に選んだ数字に対して、どれだけ近いのか、
ヒントをもらえる。
例えば、正解が1234にたいして、参加者が出した解答が0132
だとすると、×△○△となる。
・×はどの桁にも含まれない数。
・△はどれかの桁に含まれる数。
・○は正解。桁と数が一致している。
という意味。
これをすべて○になるか、一定回数繰り返す。
0021デフォルトの名無しさん
NGNGそれなんか違うゲームじゃ。
1234に対して0132なら1hit 2blow。
hit=数字も場所もあっているものの数
blow=数字はあっているが場所が違うものの数
また、数字は重複しては使われないという条件もつく。
0022デフォルトの名無しさん
NGNGなんかキショい
00231
NGNG0045 に対して…
1034 ならば 1 hit 1 blow
0102 ならば 1 hit 2 blow というように。
0024デフォルトの名無しさん
NGNGhit と blowは同じ値を共有することがあるってこと?
>>23の例だと
0045に対して0102は
最上位のの0がhitで、どっちも0が2こあるから2blow
ってこと?
・・・仕様がはっきりしなけりゃプログラムできん。
0025デフォルトの名無しさん
NGNG0026デフォルトの名無しさん
NGNG00271
NGNG0045 に対しての 0102 は、一番左の 0 が 1hit, もう一つの 0 が 1blow で、1hit 1blow です。
0123 に対しての 0000 は 1 hit 0 blow.
0028デフォルトの名無しさん
NGNG0029デフォルトの名無しさん
NGNG0010 は 1 hit 2 blow です。何故か?
まず、一番左の 0 に対してヒット。
すると、ヒットを除外すると以下のようになる。
*103 に対しての
*010 は 2 blow です。
1 で 1 blow,
0 で 1 blow.
故に、1HIT 2BLOW
0030デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNG0032デフォルトの名無しさん
NGNGエレガントも何も、工夫の余地が無い気がするが。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int digit(int n, int number)
{
while (n-- > 0)
number /= 10;
return number % 10;
}
int main()
{
int q, a, hit, blow, i, j;
srand(time(NULL));
q = rand() % 10000;
do {
do {
printf("input 4 digits: ");
fflush(stdout);
scanf("%d", &a);
} while (a < 0 || a > 9999);
for (i = 0, hit = blow = 0; i < 4; i++)
for (j = 0; j < 4; j++)
if (digit(i, q) == digit(j, a))
if (i == j)
hit++;
else
blow++;
printf("%d hits, %d blow.\n", hit, blow);
} while (hit < 4);
return 0;
}
0033デフォルトの名無しさん
NGNGこれで完璧。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void number_to_array(int source, int *array)
{
int i;
for (i = 0; i < 4; i++) {
array[i] = source % 10;
source /= 10;
}
}
int main()
{
int q, a, hit, blow, i, j;
int qs[5], as[5];
srand(time(NULL));
q = rand() % 10000;
q = 103;
number_to_array(q, qs);
do {
do {
printf("input 4 digits: ");
fflush(stdout);
scanf("%d", &a);
} while (a < 0 || a > 9999);
number_to_array(a, as);
for (i = 0, hit = blow = 0; i < 4; i++)
if (qs[i] == as[i]) {
hit++;
as[i] = -1;
} else
for (j = 0; j < 4; j++)
if (qs[i] == as[j]) {
blow++;
as[j] = -1;
break;
}
printf("%d hits, %d blow.\n", hit, blow);
} while (hit < 4);
return 0;
}
0034デフォルトの名無しさん
NGNGHit and Blowを解くプログラム作ろうぜ。
平均してもっとも短い手順で解けたやつが勝ち。
ただし、「最初は0123、次は4567」なんていう定石をプログラミング
するのは無し。毎回同じアルゴリズムで答を返すこと。
関数の仕様:
struct result { int ans; int hits; int blows };
int solve(int n, struct result history[]);
呼び出すと、n回目の答(n = 0, 1, 2, ...)を整数で返す。
(0012なら10進数の12を返す。)history[]には、n-1回目
までに自分が返した答と、それに対する反応(hitとblowの数)
が入っている。
0035デフォルトの名無しさん
NGNG至高の芸術作品。でもURL忘れた。
知っている人教えて。
0036デフォルトの名無しさん
NGNG1回質問するにあたっての時間制限とかはつけなくていい?
0037デフォルトの名無しさん
NGNGint main(void){
printf("象");
return 0;
}
エレファントなプログラムです。
0038デフォルトの名無しさん
NGNG0039デフォルトの名無しさん
NGNGhttp://www.layer-8.com/sce/smp_detail.php3?view_flg=&argCatId=1&argSubCat=23&argSmpId=94
0040デフォルトの名無しさん
NGNGそうだった。すまん。
0041デフォルトの名無しさん
NGNGいや、謝るほどの事もない。
■ このスレッドは過去ログ倉庫に格納されています