• 日本語
    • English (英語)
Avinton JapanAvinton JapanAvinton JapanAvinton Japan
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
      • 自動車ナンバープレート自動認識システム
    • プライベートクラウド
    • AIサービス開発
    • AIカメラ/画像解析無料体験版
    • 見てわかる観光庁オープンデータ
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
    • Academy with Platform
  • 採用情報
    • Avintonジャパン 採用ページ
    • 求人一覧
    • よくある質問
    • 新卒採用
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ

三目並べ – 5.先攻後攻を決めて、コンピュータ対戦にしよう(前編)

  • ルーティング
  • データベースの命名規則
  • 三目並べ – 2.〇×を交互にゲーム盤に入るようにしよう
  • 三目並べ – 3.勝敗がつくようにしよう
  • クリーンコード(Clean Code)
  • 三目並べ – 4.「スタート」「リセット」ボタンをつけよう
  • 三目並べ – 5.先攻後攻を決めて、コンピュータ対戦にしよう(前編)
  • インフラストラクチャー(サーバー、コンポーネント、RAID)
  • 機械学習入門者向け Support Vector Machine (SVM) に触れてみる
  • YOLOv8を用いた物体検出
  • 正規表現とパイプ
  • 機械学習エンジニアに必要なスキル
  • 軽量版Kubernetesディストリビューション – k0s クラスターの構築
  • ファイル操作コマンド
  • グループとユーザー
  • 困った時に使うコマンド
  • 一般グループのユーザーとグループ
  • プライバシーポリシー
  • 三目並べ – 6.先攻後攻を決めて、コンピュータ対戦にしよう(後編)
  • フロントエンド開発のための環境構築
  • ファイル検索コマンド
  • 質問
  • 仮想化環境のディスク容量を拡張する
  • ユーザー権限とアクセス権
  • データ分析基礎 – Part1
  • 三目並べ – 0.導入
  • テキスト処理
  • データベースへのデータロード
  • 機械学習概要1
  • 機械学習入門者向け Naive Bayes(単純ベイズ)アルゴリズムに触れてみる
  • ファイル管理
  • SSHを使用してホストOSからゲストOSに接続する
  • 機械学習入門者向け ChainerRLでブロック崩しの学習
  • 機械学習入門者向け ランダムフォレストによる Kaggle Titanic生存者予測
  • 機械学習概要2
  • データ分析基礎 – Part 2
  • 機械学習入門者向け 分類と回帰の違いをプログラムを書いて学ぼう
  • フロントエンドのWeb開発について
  • ダイナミックルーティング
  • 三目並べ – 1.ゲーム盤を作ろう
  • 【Python入門】Python Numpy チュートリアル
  • Amazon EC2 インスタンスの初期設定をしよう
  • AmazonEC2とVPCでネットワークとサーバーを構築しよう
  • Apache NiFi Exercise
  • Apache NiFi データパイプライン基礎
  • Apache NiFiの環境設定
  • Apache Spark 基礎
  • Apache SparkとApache Zeppelinの概要と環境構築
  • Apache Superset maptoolの使い方
  • Apache Superset 基礎
  • Apache Superset 概要と環境構築
  • Apache Zeppelin 基本機能
  • APIのデモンストレーション
  • Avinton Academy コンテンツガイド
  • AWS CLIをインストールしてコマンド操作しよう
  • AWS CLIを使ってEC2のファイルをS3へアップロードしよう
  • AWS Route 53を使って独自ドメインのWebページを表示させてみよう
  • AWSアカウントの作成と必ずやるべきセキュリティ対策
  • AWSのEC2インスタンスでWordPressブログを公開してみよう
  • AWS入門者向け 初心者が最初に理解すべきEC2とVPCの基本的な用語解説
  • CCNA
  • Certbotを使ってSSL証明書を発行し、HTTP通信を暗号化しよう
  • CISCO 1800ルータセットアップ
  • CSV import & export – Node.js, mySQL – 1
  • CSV import & export – Node.js, mySQL – 2
  • Docker Compose(Nginx + Flask + MySQL)演習
  • Docker Engineのubuntu上へのinstall
  • Docker 概要とセットアップ
  • Docker, Kubernetesの学び方について
  • Dockerコンテナイメージの最適化/ベストプラクティス
  • DockerとApacheを使ってWebサーバーを構築しよう
  • EC2からS3へ自動でぽいぽいアップロードするスクリプトの作成
  • ESP32-CAMのサンプルアプリケーションを実行する
  • 01 – Sparkfun Inventor’s Kit の準備
  • 02 – Sparkfun Inventor’s KitでLチカ
  • 03 ポテンショメータでLEDの点滅間隔をアナログ入力する
  • 04 フォトレジスタで明るさに反応するシステムをつくる
  • 05 LCDに文字列を表示する
  • 06 – BME280とLCDを組み合わせて温度計をつくる
  • ESP32とArduino IDE/PlatfromIOでHello Worldアプリケーションの実行
  • ESP32と超音波センサー HC-SR04 で物体の距離を計測する
  • ESXi – Switchの追加とVLAN
  • ESXi – VyOS
  • ESXi – 小規模ネットワーク 構築
  • Gitとは
  • VS CodeでGitHub Copilotを設定する
  • VSCode リモート開発環境
  • GNS3のセットアップ
  • Kubernetesクラスター上へのOpenVINOモデルサーバーを使用したサンプルアプリケーションのデプロイ
  • Linuxとは
  • NAT
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – Socket.IO編
  • NVIDIA Cumulus VX + GNS3でBGPネットワークのシミュレーション
  • OpenCVのテストプログラム
  • PacketTracerのセットアップ
  • Pandasによる構造化データ分析
  • PCからルータ、スイッチへのSSH接続設定
  • PostGIS exercise
  • PostgreSQL – Python – Apache – Bootstrap
  • MySQLとMySQL Workbench のセットアップ
  • PostgreSQL Setup
  • PostgreSQL – インデックスを利用したパフォーマンス改善方法
  • PostgreSQL – パーティショニングを利用したパフォーマンス改善方法
  • PostgreSQLによるデータ分析
  • postgreSQLへのshp fileのimport
  • Python2.7とOpenCVのインストール
  • Python3.8 と OpenCV のインストール (Ubuntu20.04LTS)
  • Pythonでデータベースを操作する
  • Pythonで画像を分類するプログラムを作成する
  • Pythonによるマルチスレッドプログラミング実践
  • Raspberry Pi 4B のセットアップ
  • Raspberry PiとBME280を使用して温度と湿度、気圧を読み取る
  • REDIS
  • Redux基礎 – 主要な概念と用語
  • Ruby on Rails を MySQLでセットアップ
  • Ruby on Railsによる簡単なウェブアプリケーション
  • SampleアプリケーションのKubernetes上へのデプロイ
  • Scala 基礎
  • scikit-learnとは
  • Spark SQL エクササイズ
  • SparkMLによるKaggle Titanic生存者予測
  • KNIME, AutoMLライブラリによる住宅価格予測
  • SparkMLによる住宅価格予測
  • SQL 便利な関数
  • Ubuntuの基本設定
  • uhubctlでUSBデバイスのオンオフをコントロール
  • Terraform入門 2 – Terraformのstate管理
  • Terraform入門 1 – TerraformでAWS上にEC2インスタンスを作成する
  • Virtualisation and Container (仮想化とコンテナ) – Ansible, Docker and Kubernetes
  • viエディタ
  • VLAN
  • VMware ESXi サーバー構築
  • Webアプリ開発に欠かせないGoogle Chrome DevToolsの基本
  • Windows Server 2012 R2 Hyper-V
  • Object Detection with YOLOv8
Home Avintonアカデミー 三目並べ – 5.先攻後攻を決めて、コンピュータ対戦にしよう(前編)
三目並べ

先攻後攻ボタンを追加しよう

まずは index.html を開き、先攻後攻ボタンを追加します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
 
<head>
  ︙
</head>
 
<body>
  <div class="buttons">
    <h1>〇×ゲーム</h1>
    <button id="atk_first" class="attack">先攻</button><button id="atk_after" class="attack">後攻</button><br>
    <button id="start">スタート</button>
  </div>
  <div id="game" style="display: none;">
    ︙
  </div>
  <script src="./js/index.js"></script>
</body>
 
</html>

javascriptで操作をするために、2つとものボタンに attack クラスを付与しています。また、各ボタンには違う名前のidを付与します。

続いて style.css を開き、先攻後攻ボタンを押した際に、ボタンが押し続けられた状態になるスタイル(色をグレーにし、文字色を反転)を追加します。

1
2
3
4
.pushed {
  background-color: gray;
  color: white;
}

配置を真ん中に、周囲の余白を20px確保するように設定します。

 

index.js に処理を追加します。

先攻後攻ボタンについて、押したボタンにより先攻後攻を判断し man_attack 変数に結果を格納します。

押したボタンに pushed クラスを付与し、押下した状態を保持し続けるようにします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$(function() {
  // 定数定義
  const FIRST = 0
  const LAST  = 1
  ︙
  let man_attack = FIRST  // 自分が先攻か後攻か
  ︙
  /**
   * 「スタート」ボタン押下
   */
  $("#start").click(function() {
    $("#game").css("display", "block")
  })
  ︙
  /**
   * 「先攻後攻」ボタン押下
   */
  $(".attack").click(function() {
    let id_name = $(this).attr("id")
    // 「先攻」ボタン押下時
    if (id_name == 'atk_first') { man_attack = FIRST }
    // 「後攻」ボタン押下時
    else { man_attack = LAST }
    $(this).addClass("pushed")
  })
})

 

COM入力処理とその制御をしよう

このページでは、空いているマス目からランダムに選択し、入力する処理を作成します。index.js に処理を追記します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
$(function() {
  // 定数定義
  let last_cells_count = 9
  let finished_com = true // COMによる自動入力が完了したかどうか
  ︙
  $("td").click(function() {
    // 入力済みのセルをタップした場合
    if ($(this).html()) {
      alert("入力できません")
    // 勝敗がついたあとに空のセルをタップした場合
    } else if (got_match) {
      alert("リセットボタンを押してください")
    } else {
      ︙
      // 決着がついていない場合、COMの操作を継続
      if (! got_match) {
        input_by_com()
      }
    }
  })
  ︙
  /**
   * COMによる自動入力
   */
  function input_by_com() {
    finished_com = false // 自動入力開始
    setTimeout(function() {
      let com_result_symbol = do_input_by_com()
      now_attack = !now_attack // 先攻後攻入れ替え
      last_cells_count--
 
      // 勝敗判定
      if (check_complete()) {
        got_match = !got_match
        alert(com_result_symbol + "の勝ち!")
      }
 
      // 引き分け判定
      if (! last_cells_count) {
        alert("引き分け!")
        return
      }
      finished_com = true // 自動入力完了
    }, 500)
  }
 
  /**
   * COMによる自動入力実行
   */
  function do_input_by_com() {
    // 現在の入力情報を取得
    let results = $("td").get()
    // COMのマーク
    let com_result_symbol = now_attack ? BATSU : MARU
    
    let empty_cells = [] // 未入力セル情報
    // ゲーム盤情報確認
    for (let cnt = 0; cnt < results.length; cnt++) {
      // 未入力の場合
      if (! $(results[cnt]).html()) {
        empty_cells.push(results[cnt])
      }
    }
 
    // 未入力セルがある場合
    if (empty_cells.length) {
      logic(empty_cells, com_result_symbol)
    }
 
    return com_result_symbol
  }
 
  /**
   * ロジック
   */
  function logic(empty_cells, com_result_symbol) {
    let target
    
    // ランダムに1つ取得
    target = empty_cells[Math.floor(Math.random() * empty_cells.length)]
    // 結果を入れる
    $(target).html(com_result_symbol)
  }
})

 

実際に表示してみよう

index.html ファイルを再度読み直してください。コンピュータ対戦ができていれば問題ありません。

 

演習

1. 先攻 or 後攻を押下後にもう一方を選択すると、下図のように2つとも選択される表示となります。

先攻と後攻の両方が選択されることは望ましくなく、どちらか一方のみの選択状態としたいです。

このような場合に、もう一方の選択状態を解除するようにしてください。

【ヒント】pushed クラスをjQueryで付与する前後で、片方のボタンに付与されている pushed クラスを削除する。

 

2.先攻・後攻を選択していなくても「スタート」を押せばゲームが始まってしまいます。ボタンを押していない場合、下図のように「先攻・後攻を選択してください。」というアラートを出し、ゲームを開始させないでください。

【ヒント】「スタート」ボタン押下時に、.attack クラスが付与されたボタンに .pushed クラスがついている要素があるかどうかを判定する。

 

3.COMが入力完了するまで、プレイヤーが入力できないように制御してください。現在、プレイヤーが入力完了してから0.5秒後に入力をするように制御していますが、0.5秒たたないうちにプレイヤーが入力可能な状態であり、競合する可能性があります。

【ヒント】冒頭にある、マス目をクリックした際の入力可否、画面リロードorリセットを促すアラートを出す箇所にて、COMが入力中である場合はアラートを出すように制御してください。

 

4. 「リセット」ボタンを押下した際に、先攻後攻の選択状態が解除されるように、実装を修正してください。

 

5.「後攻」を選択した場合、COMが先に入力するように制御してください。

【ヒント】「スタート」ボタン押下時に、先攻後攻フラグを確認し、後攻である場合にCOMによる自動入力を開始する。

 

採用情報

採用情報

Categories

  • 相互学習
  • 採用
  • 社員インタビュー
  • 学習&資格取得
  • 技術解説
  • イベント告知
  • 学内説明会&講義
  • 産学連携
  • 就職活動
  • イベントレポート
  • その他
  • 技術ブログ&インタビュー
  • mainpage
  • New Graduates Interviews
  • 中途エンジニア
  • カテゴリーなし
  • ニュースリリース&イベント

Avinton SDGs

SDGsへの貢献

Search

タグ

AIカメラ AI時代の経営 AI活用事例 AvintonAcademy on Campus AWS Big Data ccna Digital Transformation Docker DQN Edge AI FINOLAB James Cauchi LPIC-2 Raspberry Pi Scratch SSD エリクソン オープンイノベーション キャリア クラウトネイティブ コンテナ技術 コーディング ディープラーニング データベース データ分析 データ生成 ファンダフルリレーマラソン モブワーク リスキリング 中瀬幸子 交流会 企業説明会 医療 大学&専門学校 就職活動 強化学習、機械学習 技術ブログ 未経験 田中 研之輔 知識蒸留 社員紹介 第一級陸上特殊無線技士 統計検定 観光データ
© 2023 Avinton | All Rights Reserved | プライバシーポリシー
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
      • 自動車ナンバープレート自動認識システム
    • プライベートクラウド
    • AIサービス開発
    • AIカメラ/画像解析無料体験版
    • 見てわかる観光庁オープンデータ
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
    • Academy with Platform
  • 採用情報
    • Avintonジャパン 採用ページ
    • 求人一覧
    • よくある質問
    • 新卒採用
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ
  • 日本語
    • English (英語)
Avinton Japan