2014年9月21日日曜日

FC2ブログでjavascriptを動かす方法

FC2ブログでjavascriptで書いたプログラムを張っても
うまく動きません。

そこで、動くようにやったことを書いていきます。

作ったjavascriptをjsファイルで保存する。
jsファイルの中身は
function calculate(){
・・・・・・・・・・・・
}
にしておく。

jsファイルをFC2ブログにアップロードする。

そして、アップロードされたファイルのURLをコピペして、
(ここでは、http://blog-imgs-67.fc2.com/m/o/k/mokusan/moku.js)
ブログの編集画面に、
<script type="text/javascript" src="http://blog-imgs-67.fc2.com/m/o/k/mokusan/moku.js"></script>
と打ち込みます。

-----------
sponsored link
-----------


これで、FC2ブログにてjavascriptでプログラムを動かすことができます。
自分がこれをやってみて少し問題が発生しました。
日本語で書いたwindow.alertの警告文が文字化けすることです。
解決法はわかりません。


2014年9月18日木曜日

C++でHitBlow数当てゲーム

HitBlow数当てゲームに関して先行が有利か後行が有利か
C++でプログラムを作って確かめてみよう。

そもそも、HitBlow数当てゲームとは、パソコンがランダムに与えた3桁の数字を当てる
ゲームである。ただし、この3桁の数字は0から始まってることがあり、(たとえば、023はありうる)
また、同じ数字が2回以上使われていない。(たとえば、223や454はありえない)

ルールは、
・3桁の数字を考えてパソコンに尋ねる
・パソコンは1Hit1BlowのようにHitがいくつか、Blowがいくつかで答える。
・Hitは自分が尋ねた3桁の数と値も位置も同じである桁の数
・Blowは自分が尋ねた3桁の数と位置は異なってるが、他の桁にある数
・そして帰ってきた答えから、パソコンの考えてる3桁の数を推測して
またパソコンに尋ねるを繰り返す

(例:パソコンが考えた数字は024だったとする。そしてこちらから3桁の数字は920ですか?と尋ねると、2は値も桁も一致しているからHit、0はパソコンが考えた数字に含まれるが位置が違うからBlowなので、パソコンは1Hit1Blowと返す)

このゲームはパソコンに尋ねる回数が少なければ少ないほど勝ちであるというゲームらしいが、
今回は、数字を答える人が2人いて、その2人が先行と後行に分かれて
当てた人が勝ちというルールにする。

ということで、慣れないC++でHitBlow数当てゲームに関して先行が有利か後行が有利かの
プログラムを書いてみる。
(プログラム言語はfortranぐらいしか知らないが、あえてここは、練習としてC++で書いてみる)
-----------
sponsored link

-----------

まず、どのようなプログラムにするかを考える。

パソコンがランダムに3桁の数を考えるというプログラムを書く。
この時点で答える人は10*9*8通りの質問が出せる。
質問する3桁の数字をを前もって全部用意する(この時点で720通り)プログラムを書く。
そして、前もって用意した3桁の数字の中から、1つランダムに取り出して、
パソコンに尋ねるプログラム・・・・。
パソコンは、HitBlowの形で答える。
そして前もって用意した720通りの3桁の数字の中から、
パソコンが言ったHitBlowと合わない3桁の数字を消していく。
さらに、パソコンが言ったHitBlowと合う3桁の数字の中からランダムで選び、
パソコンに尋ねるを繰り返すプログラムを書く。
最終的に、パソコンの考えた数字を当てたら、当てるまでの回数を記録しておく。
その回数が奇数なら先行の勝ち、偶数なら後行の勝ちである。

これを100万回試行して先行が何回勝つか、後行が何回勝つかを見る。

結果、先行が490328回、後行が509672回勝った。
(もう一回やってみたら先行が489787回、後行が510213回)

先行の勝つ確率と後行の勝つ確率に差があるのは、
何回目に聞くかによって当たる確率が変わるからであろう。


-----------
sponsored link

-----------

書いたプログラムは下に載せておく。
-------------------------------------------------------------
//hitblow.cpp

#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;

int main(){
//乱数関数に時間を代入
srand((unsigned int)time(NULL));

//答えの可能性がある3つの数字の順番をko1,ko2,ko3とする
//720通りが考えられる
int ko1[720];
int ko2[720];
int ko3[720];

//senko:先行が勝つ koko:後項が勝つ
int senko = 0;
int koko = 0;

int i;
for (i = 0; i < 1000000; i++){
//ko1,ko2,ko3の数字として考えられるものをすべて考える
int a, b, c;
int kazoe = 0;
for (a = 0; a < 10; a++){
for (b = 0; b < 10; b++){
for (c = 0; c < 10; c++){
if (a != b){
if (a != c){
if (b != c){
kazoe = kazoe + 1;
ko1[kazoe] = a;
ko2[kazoe] = b;
ko3[kazoe] = c;
//cout <<kazoe<<"ka"<< ko1[kazoe] << ko2[kazoe] << ko3[kazoe] << endl;
}
}
}
}
}
}

//rand関数で乱数を使って、数当てゲームの答えを作る
int atari1;
int atari2;
int atari3;
int kkk = 0;

DAME:
atari1 = (int)(rand() *10.0 / (1.0 + RAND_MAX));
atari2 = (int)(rand() *10.0 / (1.0 + RAND_MAX));
atari3 = (int)(rand() *10.0 / (1.0 + RAND_MAX));
if (atari1 == atari2){
goto DAME;
}
if (atari2 == atari3){
goto DAME;
}
if (atari1 == atari3){
goto DAME;
}
//cout << atari1 << atari2 << atari3 << endl;

//kouho: 候補となる数
int kouho = 720;
//kaime: 当たるまでの試行回数
int kaime = 0;

//hit:数字の場所があってる数
//blow: 数字の場所はあってないが、他の場所にいる場合
int hit=0 ;
int blow=0 ;

while (hit!=3 || blow!=0){
//候補の中から組み合わせを選択
int selectkouho;
selectkouho = 1 + (int)(rand() *kouho / (1.0 + RAND_MAX));
//cout <<"selectkouho"<< selectkouho << endl;
//cout << "hit" << hit << endl;
//cout << "blow" << blow << endl;

//hit,blowの数を調べる
hit = 0;
blow = 0;
if (ko1[selectkouho] == atari1){
hit = hit + 1;
}
if (ko2[selectkouho] == atari2){
hit = hit + 1;
}
if (ko3[selectkouho] == atari3){
hit = hit + 1;
}

if (ko1[selectkouho] == atari2){
blow = blow + 1;
}
if (ko1[selectkouho] == atari3){
blow = blow + 1;
}
if (ko2[selectkouho] == atari1){
blow = blow + 1;
}
if (ko2[selectkouho] == atari3){
blow = blow + 1;
}
if (ko3[selectkouho] == atari1){
blow = blow + 1;
}
if (ko3[selectkouho] == atari2){
blow = blow + 1;
}

//ko1[selectkouho],ko2,ko3を別の変数に置き換え
int oki1;
int oki2;
int oki3;
oki1 = ko1[selectkouho];
oki2 = ko2[selectkouho];
oki3 = ko3[selectkouho];

int kouhosagasi;
int kouhomae;
kouhomae = kouho;
kouho = 0;
int hit_a;
int blow_a;
for (kouhosagasi = 1; kouhosagasi <= kouhomae; kouhosagasi++){
hit_a = 0;
blow_a = 0;
if (ko1[kouhosagasi] == oki1){
hit_a = hit_a + 1;
}
if (ko2[kouhosagasi] == oki2){
hit_a = hit_a + 1;
}
if (ko3[kouhosagasi] == oki3){
hit_a = hit_a + 1;
}
if (ko1[kouhosagasi] == oki2){
blow_a = blow_a + 1;
}
if (ko1[kouhosagasi] == oki3){
blow_a = blow_a + 1;
}
if (ko2[kouhosagasi] == oki1){
blow_a = blow_a + 1;
}
if (ko2[kouhosagasi] == oki3){
blow_a = blow_a + 1;
}
if (ko3[kouhosagasi] == oki1){
blow_a = blow_a + 1;
}
if (ko3[kouhosagasi] == oki2){
blow_a = blow_a + 1;
}
if (hit_a == hit && blow_a == blow){
kouho = kouho + 1;
ko1[kouho] = ko1[kouhosagasi];
ko2[kouho] = ko2[kouhosagasi];
ko3[kouho] = ko3[kouhosagasi];
}
}
//cout << kouho << endl;

kaime = kaime + 1;

}
if (kaime % 2 == 1){
senko = senko + 1;
}
if (kaime % 2 == 0){
koko = koko + 1;
}
//cout << kaime << "回目" << endl;
cout <<kaime<<endl;
cout << "先行" << senko << " 後行" << koko << endl;
}


}
-------------------------------------------------------------

このhitblow数当てゲームを取り上げたのは、90年代にSMAP
が出ていたテレビ番組でこのゲームをやっていたのをふと思い出したからである。

なんだったけなあのテレビ番組。