●エレガントかつ単純Cソースでゲームを書く●

このエントリーをはてなブックマークに追加
1 ◆zYrWUdj2
ヒットアンドブロウって、何行(1行1命令)でつくれる?
31:01/10/28 13:37
別に宿題でもなんでもないんだが…
ちなみに俺のコード。長すぎるんだよ。

#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);
}
4デフォルトの名無しさん:01/10/28 13:37
続き

void 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();
}
5仕様書無しさん:01/10/28 15:49
>>1
読む気が起こらないようなコードを書くな!
>>5
おまえならどうかくんだよ
7デフォルトの名無しさん:01/10/28 23:11
age
いや、空でゲーム作れるやつには尊敬するよ>1
空白に対して
nbsp;
と半角で書くとインデントできるよ>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;
109:01/10/28 23:25
あり?
119:01/10/28 23:27
&nbsp;
だった。
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;
12デフォルトの名無しさん:01/10/28 23:32
>>9
かちゅーしゃで見たとき死ねるんだよなー

全角スペースでいいじゃん。
149:01/10/28 23:35
一応動作報告。
TurboC++1.01でそのまま動いたよ
tcc handb.c
15デフォルトの名無しさん:01/10/29 00:47
7行プログラムはエレガントでもなんでもないじゃん。
単にトリッキーなコードで短かくしてるだけじゃん。
すれ立てるまでもない質問はここで
http://pc.2ch.net/test/read.cgi/tech/1004183881/l50
17デフォルトの名無しさん:01/10/29 10:49
あげ
ヒットアンドブロウってなに?
19デフォルトの名無しさん:01/11/03 23:58
昔のCのソース引っ張り出してきて眺めたら綺麗だった。
OOPLは駄目だな。
20デフォルトの名無しさん:01/11/04 00:18
>>18
>>18
数当てゲーム。
4桁以上の数字をヒントを参考にして何回めかで当てる。
掛け金でも無いと、ちっともおもしろくないが。
4桁の場合、
最初はなにも掲示されず、参加者は適当な数字を4つ選ぶ。
この時点で当てられる事は無いに等しいから、高額商品が並ぶ。
2回目。最初に選んだ数字に対して、どれだけ近いのか、
ヒントをもらえる。
例えば、正解が1234にたいして、参加者が出した解答が0132
だとすると、×△○△となる。
・×はどの桁にも含まれない数。
・△はどれかの桁に含まれる数。
・○は正解。桁と数が一致している。
という意味。
これをすべて○になるか、一定回数繰り返す。
>>20
それなんか違うゲームじゃ。

1234に対して0132なら1hit 2blow。
hit=数字も場所もあっているものの数
blow=数字はあっているが場所が違うものの数
また、数字は重複しては使われないという条件もつく。
とりあえずCで「命令」という言葉を使わないでクレ
なんかキショい
231:01/11/04 11:05
いえ。重複も可能にしてあります。

0045 に対して…
1034 ならば 1 hit 1 blow
0102 ならば 1 hit 2 blow というように。
>>23
hit と blowは同じ値を共有することがあるってこと?
>>23の例だと
0045に対して0102は
最上位のの0がhitで、どっちも0が2こあるから2blow
ってこと?

・・・仕様がはっきりしなけりゃプログラムできん。
0123に対して0000は1hit3blow?
好きなように作ればいいじゃん
271:01/11/04 12:21
ごめん間違えた。>>23

0045 に対しての 0102 は、一番左の 0 が 1hit, もう一つの 0 が 1blow で、1hit 1blow です。

0123 に対しての 0000 は 1 hit 0 blow.
0103に対しての0010は1hit1blow?
29デフォルトの名無しさん:01/11/04 14:03
0103 に対しての
0010 は 1 hit 2 blow です。何故か?

まず、一番左の 0 に対してヒット。
すると、ヒットを除外すると以下のようになる。

*103 に対しての
*010 は 2 blow です。

1 で 1 blow,
0 で 1 blow.

故に、1HIT 2BLOW
30デフォルトの名無しさん:01/11/04 14:26
おにぎり探偵団?とかいうこんな感じのあったな
コードブレーカー?
Hit and Blowねえ...
エレガントも何も、工夫の余地が無い気がするが。

#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;
}
とか言いつつ間違えてやんの>俺
これで完璧。

#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;
}
じゃ、次。

Hit 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の数)
が入っている。
35デフォルトの名無しさん:01/11/16 23:09
プログラムのコード自体ががCという形になっているコードがあったと思ったが。
至高の芸術作品。でもURL忘れた。
知っている人教えて。
36デフォルトの名無しさん:01/11/16 23:17
>>34
1回質問するにあたっての時間制限とかはつけなくていい?
37デフォルトの名無しさん:01/11/16 23:30
#include<stdio.h>
int main(void){
printf("象");
return 0;
}
エレファントなプログラムです。
ブロウジョブなら詳しいですが、何か?
39デフォルトの名無しさん:01/11/17 01:03
40デフォルトの名無しさん:01/11/17 07:27
>>39
そうだった。すまん。
41デフォルトの名無しさん
>>40
いや、謝るほどの事もない。