相づちを打つ
あいそがつきる
あいた口がふさがらない
あげ足をとる
あごが落ちる
あごがはずれる
あごで使う
足が地につく
足が出る
足もとに火がつく
足もとにつけこむ
足もとにもおよばない
足もとを見る
足を洗う
足を引っぱる
足が棒になる
汗水たらす
頭が上がらない
頭が古い
頭を下げる
あと味が悪い
あとを引く
穴があったら入りたい
穴があくほど見つめる
油がのる
油をうる
油をしぼる
網の目をくぐる
ありのはい出るすきもない
合わせる顔がない
あわをくう
あわをふかせる
家を傾かせる
息が合う
息がかかる
息の根を止める
息を入れる
息を殺す
息をのむ
息をふき返す
威儀をただす
異彩を放つ
痛くもかゆくもない
痛くもない腹をさぐられる
板につく
いたれりつくせり
一言もない一も二もなく
一線を画す
いっぱい食わす
糸を引く
いばらの道
色めがねで見る
色を失う
色をつける
因果をふくめる
浮き足立つ
後ろ髪を引かれる
後ろ指を指される
後ろを見せる
うだつが上がらない
うつつを抜かす
打てばひびく
腕が上がる
腕が鳴る
腕に覚えがある
腕によりをかける
腕をふるう
腕をみがく
馬が合う
裏をかく
うまい汁を吸う
えりを正す
煙幕を張る
大きな顔をする
大目に見る
奥歯にものがはさまったよう
押しが強い
押しも押されもせぬ
お茶をにごす
男を上げる
男がすたる
同じ釜の飯を食う
お鉢が回る
尾ひれをつける
重荷を下ろす
折り紙つき
音頭を取る
恩に着せる
恩を売る
顔色をうかがう
顔がきく
顔が立つ
顔が広い
顔から火が出る
顔に泥をぬる
顔を売る
顔をつなぐ
顔をつぶす
影がうすい
肩で風を切る
肩の荷が下りる
肩身がせまい
肩を並べる
肩を持つ
角がとれる
株が上がる
かぶとをぬぐ
壁につきあたる
かまをかける
気がおけない
機が熟す
気がきく
気がひける
気が短い
きびすを返す
肝に銘ずる
肝をつぶす
灸をすえる
気を回す
くぎをさす
口裏を合わせる
口が重い
口がかたい
口がすっぱくなる
口がすべる
口車にのる
くちばしが黄色い
口火をきる
口をぬぐう
口を割る
首が回らない
首をつっこむ
蜘蛛の子を散らす
軍配をあげる
口が軽い
芸が細かい
げたを預ける
煙にまく
けりをつける
心がさわぐ
心にかかる
心をつくす
心を許す
腰をすえる
腰を抜かす
小耳にはさむ
さじを投げる
さまになる
三拍子そろう
舌が回る
舌を出す
舌をまく
しっぽを出す
しっぽをつかむ
しのぎをけずる
自腹を切る
私腹を肥やす
終止符を打つ
食指が動く
しらを切る
尻が重い
尻が軽い
尻に火がつく
尻をぬぐう
白い目で見る
心血を注ぐ
辛酸をなめる
水泡に帰す
すずめの涙
図に乗る
すねにきず持つ
すねをかじる
図星をさされる
すみに置けない
精が出る
せきを切る
席をける
世間知らず
世間を狭くする
背中を向ける
前後を忘れる
先手を打つ
底が浅い
底をつく
底を割る
袖をしぼる
袖を引く
そりが合わない
そろばんが合う
太鼓判を押す
たががゆるむ
高をくくる
竹を割る
だしに使う
立つ瀬がない
盾に取る
盾つく
棚に上げる
玉をころがす
血がのぼる
血がさわぐ
血も涙もない
血を分けた
力を入れる
力を落とす
力を貸す
つぼにはまる
つぶしがきく
つむじを曲げる
面の皮が厚い
手足を伸ばす
手が空く
手がかかる
手が切れる
手がつけられない
手が出ない
手が届く
手がない
手が離れる
手塩にかける
手玉に取る
手に汗を握る
手に負えない
手にかける
手に乗る
手も足も出ない
手を打つ
手を貸す
手を切る
手を染める
手を尽くす
手ならす
手を抜く
手を広げる
手を焼く
手をわずらわす
天狗になる
頭角をあらわす
峠を越す
堂にいる
とりつく島がない
長い目で見る
鳴かず飛ばず
泣きを見る
なぞをかける
煮え湯を飲まされる
二の足を踏む
二の句がつげない
二の舞を演ずる
にらみがきく
熱がさめる
熱にうかされる
根にもつ
根ほり葉ほり
根も葉もない
音を上げる
のどが鳴る
のどから
手が出る
のるかそるか
歯が浮く
歯が立たない
白紙にもどす
拍車をかける
旗色が悪い
鼻が高い
鼻であしらう
鼻にかける
鼻につく
鼻をあかす
鼻を折る
花を持たす
羽を伸ばす
羽目をはずす
歯を食いしばる
腹がすわる
腹が立つ
腹が太い
腹にすえかねる
腹をかかえる
腹をさぐる
腹を割る
はれものにさわるよう
引けを取らない
ひざをつき合わせる
ひざを乗り出す
ひざを交える
ひじを張る
額を集める
一泡吹かせる
一旗あげる
一肌ぬぐ
人目につく
人目をしのぶ
人を食う
火に油を注ぐ
火の消えたよう
火の車
日の目を見る
火花を散らす
ふたを開ける
筆が立つ
筆を置く
懐が寒い
懐を肥やす
腑に落ちない
弁が立つ
棒にふる
ほぞを固める
ほぞをかむ
骨がある
骨が折れる
骨を惜しむ
本腰を入れる
本音をはく
魔がさす
枕を高くする
眉につばをぬる
丸くおさめる
水に流す
水を打ったよう
水をさす
身につまされる
耳が痛い
耳が早い
耳にたこができる
耳をすます
脈がない
身を粉にする
胸がさわぐ
胸がすく
胸をなで下ろす
目が利く
目がくらむ
目がさめる
目が回る
目がない
目に余る
弓を引く
横車を押す
らちがあかない
路頭に迷う
わなにかかる
輪をかける
view source

JavaScript

document.title = '慣用句の組み合わせ';



let clearCount = 0;

$.get('/csv/word-kanyoku.txt', function(data){
  let aryOrg = data.split('\n');
  //console.log(aryOrg);
  let aryOrg2 = [];
  let joshiAry = ['を','に','が','で'];
  aryOrg.forEach(function(v){
    joshiAry.some(function(m,j){
      if(v.indexOf(m) !== -1){
        let bunsetsuAry = v.split(m);
        bunsetsuAry[0] += m;
        if(bunsetsuAry.length === 2){
          aryOrg2.push(bunsetsuAry);
        }
        return true;
      }
    });
  });
  //console.log(aryOrg2);

  $div = $('<div>',{id:'kanyoku'});
  $c = $('<h1>').text('正しい慣用句の組み合わせは?線でつなげて!');
  $after = $('<div>',{id:'after'});
  $btns = $('<div>',{id:'btns'});
  $links = $('<div>',{id:'links'});
  $canvas = $('<canvas>');
  $ul1 = $('<ul>',{id:'a1'});
  $ul2 = $('<ul>',{id:'a2'});
  $('#demo').append($div);
  $div.append($ul1);
  $div.append($ul2);
  $div.append($canvas);

  $div.after($after);
  $after.append($btns);
  $after.append($c);
  $after.append($links);

  let max = 5;
  let ctx = $canvas[0].getContext('2d');
  ctx.lineWidth = 4;

  let ary = [];
  let isSelect1 = false;
  let isSelect2 = false;
  let p1 = {x:0,y:0};
  let p2 = {x:0,y:0};
  let ele1;
  let ele2;
  let text1 = '';
  let text2 = '';
  let c = 0;
  let colors = [
    '#ff0000',
    '#00ff00',
    '#0000ff',
    '#aaaa00',
    '#00aaaa',
  ];
/*
  aryOrg2.forEach(function(v){
    $li = $('<li>');
    $a1 = $('<a>').text(v[0]);
    $a2 = $('<a>').text(v[1]);
    $li.append($a1).append($a2);
    $ul.append($li);
  });
*/

  function changePanel(a,b){
    let c = $('<li>');
    a.before(c);
    a.removeClass('select');
    b.after(a);
    c.after(b);
    c.remove();
    selectPanels = [];
  }
  function shufflePanel(){
    for(i=0;i<7;i++){
      r = Math.floor(Math.random()*max);
      r2 = Math.floor(Math.random()*max);
      r3 = Math.floor(Math.random()*max);
      r4 = Math.floor(Math.random()*max);
      changePanel($('.a1').eq(r),$('.a1').eq(r2));
      changePanel($('.a2').eq(r3),$('.a2').eq(r4));
    }
  }


  function setStage(){
    $ul1.empty();
    $ul2.empty();
    $links.empty();
    c = 0;
    ctx.clearRect(0,0,999,999);
    ary = _.shuffle(aryOrg2);
    ary = ary.splice(1,max);
    ary.forEach(function(v){
      $li = $('<li>');
      $a1 = $('<a>').text(v[0]).addClass('a1');
      $a2 = $('<a>').text(v[1]).addClass('a2');
      if(v[0].length>5){
        $a1.css({fontSize:'14px'});
      }
      if(v[1].length>5){
        $a2.css({fontSize:'14px'});
      }

      $($a1).add($a2).on('click', function(event){
        checkResult(this);
      });
      $ul1.append($a1);
      $ul2.append($a2);
    });
    $canvas[0].width = $div.width();
    $canvas[0].height = $div.height();

    shufflePanel();
  }
  setStage();

  function checkResult(ele_){
    let ele = ele_;
    if($(ele).hasClass('select')){
      return;
    }
    if($(ele).hasClass('a1')){
      if(isSelect1){return;}
      $(ele).addClass('select');
      isSelect1 = true;
      ele1 = $(ele);
      text1 = $(ele).text();
    }
    if($(ele).hasClass('a2')){
      if(isSelect2){return;}
      $(ele).addClass('select');
      isSelect2 = true;
      ele2 = $(ele);
      text2 = $(ele).text();
    }
    let position = $(ele).parent().parent().position();
    let posX = position.left;
    let posY = position.top;

  	//var clickX = event.pageX ;
  	//var clickY = event.pageY ;

  	var clientRect = ele.getBoundingClientRect() ;
  	var positionX = clientRect.left + window.pageXOffset;
  	var positionY = clientRect.top + window.pageYOffset;
    let clientW = clientRect.width
    if($(ele).hasClass('a2')){
      clientW = 0;
    }
  	//x = clickX - positionX ;
  	//y = clickY - positionY ;
  	x = positionX - posX + clientW;
  	y = positionY - posY + clientRect.height/2;
    if($(ele).hasClass('a1')){
      p1 = {x:x,y:y};
    }
    if($(ele).hasClass('a2')){
      p2 = {x:x,y:y};
    }
    ctx.beginPath();
    ctx.arc(x, y, 4, 0, 2 * Math.PI);
    ctx.fill();
    if(isSelect1 && isSelect2){
      var isMatch = false;
      isSelect1 = false;
      isSelect2 = false;
      var text = text1 + text2;
      console.log(text);
      ary.some(function(v){
        console.log( v[0]+v[1]);
        if(text === v[0]+v[1]){
          isMatch = true;
          return true;
        }
      });
      if(!isMatch){
        $(ele1).addClass('ng');
        $(ele2).addClass('ng');
        $('.a1').addClass('select');
        $('.a2').addClass('select');
        if(clearCount>2){
          clearCount--;
        }
        setNext();

        return;
      }
      $(ele1).addClass('ok');
      $(ele2).addClass('ok');
      ctx.strokeStyle = colors[c];
      ctx.beginPath();
      ctx.moveTo(p1['x'], p1['y']);
      ctx.lineTo(p2['x'], p2['y']);
      ctx.stroke();
      c++;
      if(c>=max){
        clearCount++;
        setNext();
      }
    }
  }

  function setLinks(){
    let h2 = $('<h2>').text('言葉の意味を調べる');
    $links.append(h2);
    ary.some(function(v){
      let t = v[0]+v[1];
      let h = '//www.google.com/search?q='+t;
      let a = $('<a>',{target:'_blank',href:h}).text(t);
      $links.append(a);
    });
  }

  function setNext(){
    getHint(clearCount);
    $btn = $('<button>').text('次の問題へ');
    $btn.on('click', function(){
      setStage();
      $c.text(clearCount);
      $(this).remove();
    });
    $btns.append($btn);
    setLinks();
  }
});

CSS

#demo{
  display:grid;
  justify-items: center;
  align-items: center; 
}

footer,
#code,
pre{
  display:none;
}

h1{
  font-weight:bold;
}

#kanyoku{
  display:flex;
  justify-content: space-between;
  margin:0 auto;
  width:320px;
  max-width:100%;
  position:relative;
  left:0;
  top:0;
}
#kanyoku ul{
  position:relative;
  left:0;
  top:0;
  z-index:3;
}

#kanyoku canvas{
  position:absolute;
  left:0;
  top:0;
  width:100%;
  height:100%;
}

#kanyoku a{
  display:block;
  padding:12px;
  margin:4px 0;
  line-height:40px;
  border:2px solid #000;
  font-size:20px;
}

#kanyoku a:hover{
  background-color:#ccc;
  cursor:pointer;
}
#kanyoku a.select{
  background-color:#aaa;
}
#kanyoku a.ng{
  background-color:#faa;
}
#kanyoku a.ok{
  background-color:#afa;
}
#after{
  text-align:center;
}
#links{
  height:40px;
  padding:4px;
}
#links a{
  padding:8px;
}

#btns{
  height:80px;
}
button{
  display:block;
  margin:8px auto;
  padding:24px;
}

HTML

ページのソースを表示 : Ctrl+U , DevTools : F12

view-source:https://hi0a.com/demo/-js/js-game-text-kanyoku/

ABOUT

hi0a.com 「ひまアプリ」は無料で遊べるミニゲームや便利ツールを公開しています。

プログラミング言語の動作デモやWEBデザイン、ソースコード、フロントエンド等の開発者のための技術を公開しています。

必要な機能の関数をコピペ利用したり勉強に活用できます。

プログラムの動作サンプル結果は画面上部に出力表示されています。

環境:最新のブラウザ GoogleChrome / Windows / Android / iPhone 等の端末で動作確認しています。

画像素材や音素材は半分自作でフリー素材配布サイトも利用しています。LINK参照。

動く便利なものが好きなだけで技術自体に興味はないのでコードは汚いです。

途中放置や実験状態、仕様変更、API廃止等で動かないページもあります。