「CNT」を含む日記 RSS

はてなキーワード: CNTとは

2020-12-23

ゲートルーラーゲーム性についての率直な感想

話題のゲートルーラーについて。

プレイしてみたけど正直言ってあんまりおしろくはなかったです。

今はこのカードゲーム話題の八割くらいは中心になってる某店長奇行になってますが、

それを抜きにしてカードゲームとしてどうなの?って所が大きかったかな。

 

ルーラーっていうものによって異種格闘技戦的なことができるのが

多分このゲームの一番のウリだと思うんだけど、

ルーラー同士のバランスっていう意味だとまぁ、うん。

散々言われてるけど毎ターン2デッキトップ2枚をタダ出しできるデッキ

馬鹿正直にコスト払わないと出せないデッキが殴り合ったらそりゃさ。

とは言え、坊主めくり側は手札自体が無いから例えば手札回収カードとかは使えないわけで、

そういう所で今後バランスはとれていくかもしれないという希望はある。

 

しかしこのルーラーはいらん所まで指図してきて、

そのせいで一見さんお断りの面倒くさい仕様になってるのはいかがなものか。

 

これは実際のルーラーテキストだけど、

A-1アプレティスとH-8ハイランダー

HP12、ATK4、STR3

ゲームの準備】特になし(手札もエナジーも使わない)

【ターン開始時】デッキトップ2枚めくってタダ出しできる。

ルール】手札なし。コストは常時支払ったものとなる。

両方ともテキストの内容なんも違いがないんですよね。

何が違うのかっつったらわざわざカードに書かれたQRコード読み取って

ルール確認しにいかないとわからんのですよ。面倒くさいね

 

で、実際この2種類何が違うのかっつったらデッキビルディング制限が違って、

A-1アプレティスは

所属軍は2種まで、同名カード4枚まで(レジェンドカードは同名1枚のみ)、

H-8ハイランダーはその名の通り、

所属軍は3種まで、同名カードは1枚ずつしか入れられない。

っていうこんな程度の違いしかないんですよね。

 

所属軍ってのは遊戯王で言えば属性、デュエマで言えば文明みたいな

カードを組み分けするもんだと思ってくれればいいんだけど、

他のカードゲームだったらそういうのって自分で決めるじゃないですか。

このデッキは単色統一にしようとかこっちは3色にしようとか。

ハイランダー構築も作ろうと思えば好きに作れるじゃないですか。

わざわざカードに指図されることじゃないし、こんなん異種バトルとは言わんでしょ。

精々ボクシングマウスピースゴム製かプラ製かくらいの違いしかないじゃないですか

そんな所細かく指定される必要ある??

煩わしい上に自由度下げるだけにしかなってないかなと思いました。

ルーラーについての話終わり。

 

次にルール説明がわかりにくい話。

いや、ルール自体は呆れかえるほど簡素ものなんです。

ルール説明がわざとやってんのかってくらいわかりにくいのです。

なんで公式サイトカードの並べ方、置き方すら書いてないのか。

一応無料体験デッキについてるQRコードの中の隅っこのほうには載ってたけど、

なんでそんな風に表記してんのか全くわからないです。

 

ルーラールール説明してるページも不親切でして、

先ほどのアプレティスとハイランダーで言えば、同一である

ゲームの準備】【ターン開始時】【ルール】までしか載ってません。

それより先のデッキ構築ルールさら個別の詳細ページを見ないとわかりません。

せめて「ここに書かれてないルールがあるのでチェックしてね!」

みたいな表記ルーラールールページにあれば

変に誤解を生むこともなかったと思うんですよね。

 

ドライブゾーンについてはマジでどこにも載ってないし、

どうやら坊主めくりルーラーがめくったカードを使うまで一時的に置いとく場所のことらしいけど、

公式から説明が無いからそれが正しいのかもわからない…。

 

公式ツイッターがなくて一番話をしてくれるのが某店長アカウントってのもおかしい。

いや、普通ならそれでいいんだけども、

あの人に今質問したら晒し首にされるしご機嫌損ねたらブロックされるし、

広報として成り立ってないじゃないですかそれ。

一般プレイヤーが質問エゴサして答えてる涙ぐましい姿みて、

売る気があるのか疑問に思うレベルですよ。

 

次にゲームルールの話。

坊主めくりルーラーがどうこうとは別に

普通コスト払ってプレイするほうでも基本的にめくりまくります

このゲームルーラーダメージ受けた時に

デッキトップからダメージ値分めくってダメージゾーンに置くんですが、

そのめくった時にCNT(カウンター)能力を持ったカードが出れば

1枚につき1点分のダメージキャンセルして効果つんですね。

 

で、今の所はCNT枚数割合上限が16/50のルーラーしかいないので大体1/3です。

ルーラー自身STRでも3ダメージ出るわけなので1体でも期待値1枚、

他のユニットと合わせて攻撃したら1度のバトルフェイズで2~3枚くらいめくれます

このゲームでターン開始時にデッキから得られる枚数は2枚なので、

大体、自分のターンにプレイする枚数とデッキトップめくれて出てくるCNT枚数が

同じかそれ以上になるんですよね。

 

半数以上をめくって解決するんだから嫌が応でも運ゲー合戦なんですよ。

坊主めくりルーラー使ってなくても結局坊主めくりみたいなもんなんですよ。

戦略もクソもねぇわめくれるかめくれないかのほうが比重が大きいじゃないか

かにデッキ構築を自分のやりたい内容に傾けることはできるものの、

実際に勝敗を分けるのはほぼほぼ運なんです。

デッキトップ操作するカードとかはあるし

セットしたカードをいつ使うとか誰を殴るかとかのお陰で

辛うじてTCGの体を成しているもの根本的に運運アンド運でした。

ここが本当にどうなのって思ったし面白くなった主要因です。

 

あとアプレティスのHP12ですが、

CNTがめくれるとダメージキャンセルできる関係上、

期待値通りにめくれてくれれば実質18はあるということですね。

2枚しかめくれなきゃ14だし、10枚めくれりゃ22です。

運によって自分HPすら保障されてないレベル運ゲー

 

最後ゲームの流れの話。

びっくりするくらい抑揚がないですね。

例えばデュエマだったら序盤に使えるカードは少ないし弱い、

それがターン経過で大きなコストが払えるようになっていき~って流れが、

遊戯王エクストラデッキから出す為に素材集めてどうたらこうたらってあるけど、

まーゲートルーラーにはそういう概念が極めて薄いのです。

序盤から終盤までやってること変わんないんですよ。

そりゃ坊主めくりルーラーは常時無限コストがあるんだから当たり前だし、

普通に払ってプレイするルーラーゲーム開始時からある3枚分のコスト

増減することは無いわけですからね。

アプレティス同士だとかなりアレな流れになって、

ターン開始時に2枚めくって使い、殴り、相手デッキトップをめくってCNT使われ、

今度は相手が同じことやって…。ずっとこれです。

 

自分プレイルール何か間違えてんのかと思って

いくつか対戦動画見てみたんですがやっぱり内容は同じなんですよ。

ひたすらお互いにめくりあって出たカード投げ合ってる感じ。

このゲームにおける強い弱いってのは

めくっていいもん引けることを強いっていうんだろうなと。

 

というわけで自分は全く面白いと思わなかったです。

まだ発売されてないのに無料体験で何語ってんだって思う人もいるかもだけど、

無料体験ってそのゲームの楽しさを体験させるためにあるものなんで。

無料体験ではこのゲームの楽しさはわからないんだぜってそれ売る気あるの?

ルーラーどうこうに関わらず運が介入する要素が多すぎるので、

運ゲーじゃねえかつまらんって思う人はやってもつまらんと思います

ダメージ判定でCNTがめくれないのが続いたらめちゃあっけなく負けるんで、

真面目に勝ち負け競いたいって人にも向いてないと思います

めくった結果に一喜一憂してウッキャアアアア!神引きィィィィィ!!

ってノリができないと面白くないと思います

少なくとも精神的に落ち着いた大人の方には合わないんじゃないでしょうか。

運に自信があって、魂のドロー!うおおおおおお!!!!!!!!!!!!!!

ってのが好きな人は楽しめるかも。パーティーゲームですわ。

要はプロモーションビデオのノリだよ。あれが楽しいなら楽しいよきっと。

2020-11-03

anond:20201102113231

こうですか?わかりません ><

function pair(psns) {
  var i = -1;
  var cnt = 0;
  var flg = psns[0] && psns[0].sex;
  // modified on 2018-12-31 by XXXX
  // var flg psns[0].sex;
  var j = -1;
  var tmp = null;
  // modified on 2020-12-31 by XXXX.
  // var k = -1;
  for(i = 0; i < psns.length; i++) {
    //console.log('■■■■■■■■■■■■■■■■■■■■ BEGIN ■■■■■■■■■■■■■■■■■■■■')
    //console.log(psns, 'i=' + i, 'cnt=' + cnt, 'flg=' + flg);
    if(psns[i].sex == flg) {
      //console.log('cnt: ' + cnt + '->' + (cnt+1));
      cnt++;
    } else {
      j = i - cnt + 1;
      // j = i - cnt;
      // j = i - cnt - 1;
      //console.log('swap ' + i + '<-->' + j);
      tmp = psns[j];
      psns[j] = psns[i];
      psns[i] = tmp;
      i = j - 1; // <- 理由は分からないが、i = jだと上手くいかない(by XXXX)。
      cnt = 0;
      // flg = !flg; // これはなぜか上手くいかない (by XXXX)
      flg = flg == MALE ? FEMALE : MALE;
      while(j > 1) {
        if(psns[j].height < psns[j-2].height) {
          //console.log('swap ' + j + '<-->' + (j-2));
          tmp = psns[j-2];
          psns[j-2] = psns[j];
          psns[j] = tmp;
        }
        j -= 2;
      }
      // modified on 2018-12-31 by XXXX.
      // 
      //for(k = 0; k + 2 < j;) {
      //  if(psns[k].height > psns[k+2].height) {
      //    tmp = psns[k+2];
      //    psns[k+2] = psns[k];
      //    psns[k] = tmp;
      //  }
      //  k += 2;
      //}
    }
    //console.log(psns, 'i=' + i, 'cnt=' + cnt, 'flg=' + flg);
    //console.log('■■■■■■■■■■■■■■■■■■■■ END ■■■■■■■■■■■■■■■■■■■■')
    //console.log('')
  }
  for(i = 0; i < psns.length; i++) {
    //console.log('■■■■■■■■■■■■■■■■■■■■ BEGIN ■■■■■■■■■■■■■■■■■■■■')
    //j = i / 2;
    j = Math.floor(i / 2);
    //console.log(psns, 'i=' + i, 'j=' + j);
    tmp = psns[i];
    if(!(i % 2)) {
      psns[j] = [null, null];
    }
    if(tmp.sex == MALE) {
      psns[j][0] = tmp;
      psns[j][1] = psns[i+1];
    } else {
      psns[j][0] = psns[i+1];
      psns[j][1] = tmp;
    }
    // modified on 2018-12-31 by XXXX.
    // 
    //psns[j][0] = tmp;
    //psns[j][1] = psns[i+1];
    i++;
    //console.log(psns, 'i=' + i, 'j=' + j);
    //console.log('■■■■■■■■■■■■■■■■■■■■ END ■■■■■■■■■■■■■■■■■■■■')
  }
  psns.splice(psns.length / 2, psns.length);
  // modified on 2020-12-31 by XXXX.
  // return psns.slice(0, psns.length / 2 + 1);
  // return psns.slice(0, psns.length / 2);
}

2020-10-30

お願いだからセンスの無い人はプログラマにならないで下さい

プログラミングセンスです。センスの無い人がプログラマになると、他のすべての人に迷惑がかかります。だからセンスの無い人は絶対プログラマにならないで下さい。

プログラミングセンスが無い人や、プログラミングをやったことの無い人は、知識を得たり経験を積んだりすれば、誰でも「良いプログラマ」になれると思っているようですが、無理です。

というのも、センスの無いプログラマ問題は、知識経験の不足ではないからです。センスの無いプログラマの救いようの無い問題は「頭がおかしいこと」なのです。

題材は何でもいいのですが、具体的なコードを見た方がイメージがつきやすいと思いますので、とりあえず以下の問題を考えます

問題

住民リストが与えられるので、背の低い順に男女ペアにしたリストを作って下さい。ただし、男女の数は同数であるします。

コード

ふつうの人は、難しく考えずに以下のようなコードを書きます

const makePair = (persons) => {
  const males = persons.filter(person => person.sex === MALE)
  const females = persons.filter(person => person.sex === FEMALE)
  const compareHeight = (a, b) => a.height - b.height
  males.sort(compareHeight)
  females.sort(compareHeight)
  return males.map((male, idx) => [male, females[idx]]) // 男女の数は同数
}

この例はJavaScriptなので高階関数を使っていますが、仮にそういう機能が無かったとしても、

というコード構成は大きく変わらないでしょう。

一方、センスの無いゴミプログラマは、以下のような名状しがたきコードを書いてきます

function pair(psns) {
  var i = -1;
  var cnt = 0;
  var flg = psns[0] && psns[0].sex;
  var j = -1;
  var tmp = null;
  for(i = 0; i < psns.length; i++) {
    //console.log('■■■■■■■■■■■■■■■■■■■■ BEGIN ■■■■■■■■■■■■■■■■■■■■')
    //console.log(psns, 'i=' + i, 'cnt=' + cnt, 'flg=' + flg);
    if(psns[i].sex == flg) {
      //console.log('cnt: ' + cnt + '->' + (cnt+1));
      cnt++;
    } else {
      j = i - cnt + 1;
      //console.log('swap ' + i + '<-->' + j);
      tmp = psns[j];
      psns[j] = psns[i];
      psns[i] = tmp;
      i = j - 1; // <- 理由は分からないが、i = jだと上手くいかない(by XXXX)。
      cnt = 0;
      flg = flg == MALE ? FEMALE : MALE;
      while(j > 1) {
        if(psns[j].height < psns[j-2].height) {
          //console.log('swap ' + j + '<-->' + (j-2));
          tmp = psns[j-2];
          psns[j-2] = psns[j];
          psns[j] = tmp;
        }
        j -= 2;
      }
    }
    //console.log(psns, 'i=' + i, 'cnt=' + cnt, 'flg=' + flg);
    //console.log('■■■■■■■■■■■■■■■■■■■■ END ■■■■■■■■■■■■■■■■■■■■')
    //console.log('')
  }
  for(i = 0; i < psns.length; i++) {
    //console.log('■■■■■■■■■■■■■■■■■■■■ BEGIN ■■■■■■■■■■■■■■■■■■■■')
    j = Math.floor(i / 2);
    //console.log(psns, 'i=' + i, 'j=' + j);
    tmp = psns[i];
    if(!(i % 2)) {
      psns[j] = [null, null];
    }
    if(tmp.sex == MALE) {
      psns[j][0] = tmp;
      psns[j][1] = psns[i+1];
    } else {
      psns[j][0] = psns[i+1];
      psns[j][1] = tmp;
    }
    i++;
    //console.log(psns, 'i=' + i, 'j=' + j);
    //console.log('■■■■■■■■■■■■■■■■■■■■ END ■■■■■■■■■■■■■■■■■■■■')
  }
  psns.splice(psns.length / 2, psns.length);
}

こんなコードメンテナンスは御免被りたいです。一見して配列の要素を入れ替えていることが分かるだけで、実装を全て読まなければ(いや読んでも)処理の意図が全く分かりません。また、たとえば「i = j - 1」が間違って「i = j」などと書かれていてバグを起こしたとしても、原因を突き止めるのは困難を極めます

さて、このコードは具体的に何がいけないのでしょうか。長すぎることがいけないのしょうか。変数名が分かりにくいのがいけないのでしょうか。引数破壊的に変更しているのがいけないのでしょうか。不要コメントが残っているのがいけないのでしょうか。よく見ると、ソート処理で車輪の再発明をしていたり、「j」や「tmp」などが場所によって意味が違うカメレオン変数になっていたりしますが、それがいけないのでしょうか。どれも正しいですが、それらを逐一直したところで、本質的解決にはならないでしょう。

後者コードはもはや「ここを直したら良くなる」とかいレベルを超えています。たしかに、問題を具体的に挙げることはできます。このコードの致命的な問題が、凝集度の低さと、単一責任原則(SRP)違反にあるのは間違いありません。しかし、後者コードを書いてくる人に、

住民リストを男女に分ける処理や、リストソートをする処理、2つのリストをまとめる処理は、この問題とは独立して意味のある操作から、別の関数として抽出しましょう。その方がコードの見通しがよくなるし、一部の処理を修正したときの影響も小さくなるし、単体テストも書きやすくなります

なんて言ったって聞く耳を持たないでしょう。

そもそも、こういうコードを書く人は、この処理自体を「pair」なんて関数抽出すらしません。まだこの問題では入出力のフォーマットが明確に定義されているので、他人が1から書き直せますが、実際のプロダクトでは、無数の副作用を起こす数千行のコード迷路を彼の脳内フォーマットデータが通るわけです。もちろん、テストコードなんてありません。

まり、指摘をしても絶対に直らないのです。いくら言語の優れた機能ベストプラクティスを紹介しても、馬の耳に念仏。それらの利点を理解できるだけの脳みそが足りていないのです。

どうして、同じ処理を実装するのに、ここまでの違いが生じるのでしょうか。

これは、プログラミング技術問題ではありません。既に述べた通り、ふつうの人なら、特定機能の有無とか知識の程度にかかわらず、ふつうコードを書くのです。なぜなら、ふつうの人にはそちらの方が楽だからです。つまり、前者のコード別に何か卓越した技術を身につけた結果書けるようになるものではなく、まともな感覚さえ持っていれば、プログラミング初心者にとっても前者のコードの方が書きやすいのです。

まり後者のようなコードを書いてくる奴というのは、現実世界の捉え方が常人とは著しくずれているのです。要するに、「頭がおかしい」のです。この病気はもう直りません。だからセンスの無い人は絶対プログラマにはならないで下さい。

2011-03-04

http://anond.hatelabo.jp/20110303225320

じゃぁ、問1をやってみた。


unsigned int f(unsigned int x) {
    x = x - 1;
    x = x | (x >> 1);
    x = x | (x >> 2);
    x = x | (x >> 4);
    x = x | (x >> 8);
    x = x | (x >>16);
    return x + 1;
}



int main(int argc, const char * argv[])
{

	int check = 1;
	int cnt=0;
	if(0!=f(0)){
		cnt++;
	}
	for(unsigned int i=1;i!=0;i++){
		if(check < i){
			check <<=1;
		}
		if(check != f(i)){
			cnt++;
		}
		if(i%0x10000==0){
			printf("%x\n",i);
		}
	}
	printf("cnt=%d\n",cnt);
	return 0;
}

iよりも等しいか大きい最小の2の乗数 

とunsigne int 全域において等しいプログラムcnt=0であることを確認するプログラム

2009-08-31

http://anond.hatelabo.jp/20090831113633

Cだとこんな感じか。

#include <stdio.h&gt;
int isLeap(int year) {
  return ((year%400 == 0) || (year%4 == 0) &amp;amp;&amp;amp; (year%100 != 0)) ? 1 : 0;
}

int todays(int year, int month, int day) {
  int MonthDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  int days = 0;
  int i = 0;
  days += ((month &gt; 2) &amp;amp;&amp;amp; isLeap(year)) ? 1 : 0;
  for (i = 0; i < month-1; i++) {
    days += MonthDays[i];
  }
  days += day;
  /* printf("leap %d days %d\n", isLeap(year), days); */
  return days;
}

int cntLeap(Syear, Eyear) {
  int i = 0;
  int cnt = 0;
  for (i = Syear; i < Eyear; i++) {
    cnt += isLeap(i);
  }
  return cnt;
}

int main() {
  int year = 2009;
  int month = 6;
  int day = 4;
  long days = 0;
  unsigned long long sec = 0;
  int DaysSec = 60 * 60 * 24;

  days += (year-1)*365 + cntLeap(0, year);
  days += todays(year, month, day);
  days -= 1;

  sec = days * DaysSec;
  printf("%d %d %d:days %d: sec %llu\n", year, month, day, days, sec);
  /* 2009 6 4:days 733566: sec 18446744072665144576 */

  return 0;
}

2008-01-03

もっとうまく書きたい

文字列から、その長さの分だけ、ランダムに1文字づつ拾ってきて、新たに文字列を作成する

ってのを、何となく思いついて書いてみたけど。。。

おれ、才能ないよなぁ。。

cnt = 10

cnt.times do |j|
	str = ["h","a","t","e","n","a"]
	length = str.length
	length.downto(1) do |i|
		idx = rand(i)
		print(str[idx])
		str.delete_at(idx)
	end
	print("\n")
end

2007-11-08

Re: オブジェクト指向におけるFizzBuzz問題

http://blogs.wankuma.com/episteme/archive/2007/11/08/106927.aspx

かなりテキトー。エラー処理とかしない。


package Animal;
sub new      { bless { cnt => 1 } , $_[0] }
sub Sound    { printf "%s\n", $_[0]->{voice} x $_[0]->{cnt}  }
sub SetCount { $_[0]->{cnt}   = $_[1]; $_[0] }
sub SetVoice { $_[0]->{voice} = $_[1]; $_[0] }

package Dog;
use base qw/Animal/;
sub new { $_[0]->SUPER::new->SetVoice('Wan') }

package Cat;
use base qw/Animal/;
sub new { $_[0]->SUPER::new->SetVoice('Nya-') }

my $animal;
$animal = Dog->new;
$animal->Sound;
$animal->SetCount(3);
$animal->Sound;
$animal = Cat->new;
$animal->Sound;

わん、にゃーが文字化けしたのでローマ字で。

 
ログイン ユーザー登録
ようこそ ゲスト さん