シェルスクリプトマガジン

test

香川大学SLPからお届け!(Vol.85掲載)

投稿日:2023.07.25 | カテゴリー: コード

著者:谷 知紘

 今回は、C言語を用いて作成した、コンピュータと対戦できるリバーシを紹介します。あまり強くはありませんが、きちんとコンピュータが相手をしてくれます。C99以降の規格に対応するCコンパイラと標準Cライブラリがあれば、環境を問わずに動作するプログラムになっていますので、皆さんもコンパイルして楽しんでください。

シェルスクリプトマガジン Vol.85は以下のリンク先でご購入できます。

図5 盤面の生成用コード

//盤面 空白(0) 黒(-1) 白(1) 番兵(2)
int board[10][10] = {0};
//スコアを格納する配列
int weightdata[10][10] = {
  {0,  0,  0,  0,  0,  0,  0,  0,  0,  0},
  {0, 30,-12,  0, -1, -1,  0,-12, 30,  0},
  {0,-12,-15, -3, -3, -3, -3,-15,-12,  0},
  {0,  0, -3,  0, -1, -1,  0, -3,  0,  0},
  {0, -1, -3, -1, -1, -1, -1, -3, -1,  0},
  {0, -1, -3, -1, -1, -1, -1, -3, -1,  0},
  {0,  0, -3,  0, -1, -1,  0, -3,  0,  0},
  {0,-12,-15, -3, -3, -3, -3,-15,-12,  0},
  {0, 30,-12,  0, -1, -1,  0,-12, 30,  0},
  {0,  0,  0,  0,  0,  0,  0,  0,  0,  0}
};
//盤面の生成
void make_board(){
  //番兵
  for(int i = 0; i < 10; i++){
    board[0][i] = 2;
    board[9][i] = 2;
    board[i][0] = 2;
    board[i][9] = 2;
  }
  //初期配置する石
  board[4][4] = 1;
  board[5][5] = 1;
  board[4][5] = -1;
  board[5][4] = -1;
}

図6 check_plc()関数のコード

//指定したマスに石を置けるかどうかを判定する関数
bool check_plc(int i, int j, int now_board[10][10]){
  //マスが空かどうか
  if(board[i][j] == 0){
    //全方向を探索
    for(int dir_i = -1; dir_i < 2; dir_i++){
      for(int dir_j = -1; dir_j < 2; dir_j++){
        if(check_dir(i,j,dir_i,dir_j,now_board)){
          //配置可能であればtrueを返す
          return true;
        }
      }
    }
  }
  return false;
}

図8 check_dir()関数のコード

//指定方向に何個の石を挟めるかを調べる関数
int check_dir(int i, int j,
              int dir_i, int dir_j,
              int now_board[10][10]){
  //指定方向に相手の石がある場合は次のマスを探索
  int times = 1;
  while(now_board[i+dir_i*times][j+dir_j*times] == player*-1){
    times++;
  }
  //指定方向の最後に自分の石がある場合
  if(now_board[i+dir_i*times][j+dir_j*times] == player){
    //指定方向に相手の石が何個あるかを返す
    return times-1;
  }
  //指定方向の最後に自分の石がなければ0を返す
  return 0;
}

図9 place_stn()関数のコード

//指定したマスに石を配置して、挟んだ石を自分の石にする関数
void place_stn(int i, int j, int now_board[10][10]){
  //全方向を調査
  for(int dir_i = -1; dir_i < 2; dir_i++){
    for(int dir_j = -1; dir_j < 2; dir_j++){
      //挟んだ石の数
      int change_num = check_dir(i,j,dir_i,dir_j,now_board);
      //挟んだ石の数だけ自分の石に変更
      for(int k = 1; k < change_num+1; k++){
        now_board[i+dir_i*k][j+dir_j*k] = player;
      }
    }
  }
  //指定したマスに自分の石を配置
  now_board[i][j] = player;
}

図10 think()関数のコード

//コンピュータの手番で呼び出される関数
void think(){
  //ハイスコアの初期化
  int hightscore = -1000;
  int px, py;
  for(int y = 0; y < 10; y++){
    for(int x = 0; x < 10; x++){
      //石を置けない場合はスキップ
      if(!check_plc(y, x, board)){
        continue;
      }
      int tmpdata[10][10] = {0};
      //盤面データをコピーした仮の盤面を作成
      copydata(tmpdata);
      //仮の盤面に石を置く
      place_stn(y, x, tmpdata);
      //総スコアを計算する
      int score = calcweight(tmpdata);
      //ハイスコアよりも総スコアが良ければ更新する
      if(score > hightscore){
        hightscore = score;
        px = x; py = y;
      }
    }
  }
  //総スコアが最大のマスに石を置く
  place_stn(py, px, board);
  printf("PCは(x , y) = (%d , %d)に置きました\n",
         px, py); 
}

図11 copydata()関数のコード

//盤面データをコピーする関数
void copydata(int tmpdata[10][10]){
  for(int y = 0; y < 10; y++){
    for(int x = 0; x < 10; x++){
      tmpdata[y][x] = board[y][x];
    }
  }
}

図12 calcweight()関数のコード

//総スコアを計算する関数
int calcweight(int tmpdata[10][10]){
  int score = 0;
  for(int y = 0; y < 10; y++){
    for(int x = 0; x < 10; x++){
      //番兵はスキップ
      if(tmpdata[y][x] == 2){
        continue;
      }
      //自分の石がある場所のスコアを足す
      if(tmpdata[y][x] == 1){
        score += weightdata[y][x];
      }
    }
  }
  return score;
}

Raspberry Pi Pico W/WHで始める電子工作(Vol.85掲載)

投稿日:2023.07.25 | カテゴリー: コード

著者:米田 聡

本連載では、人気のマイコンボード「Raspberry Pi Pico W/WH」を活用していきます。同ボードは、無線LANやBluetoothの通信機能を搭載し、入手しやすく、価格も手頃なので、IoT機器を自作するのに最適なハードウエアです。第1回は、プログラムの開発環境を構築します。

シェルスクリプトマガジン Vol.85は以下のリンク先でご購入できます。

図17 初期化プログラム(boot.py)

import sys
import time
import network
import ntptime
from machine import RTC

SSID='your_ssid'
PASS='your_passphrase'

IFCONFIG=('192.168.1.80', '255.255.255.0', '192.168.1.1', '192.168.1.1')

def wifi_connect(ssid, passkey, timeout=20):
    conn = network.WLAN(network.STA_IF)
    if conn.isconnected():
        return conn
    
    conn.active(True)
    conn.connect(ssid, passkey)

    while not conn.isconnected() and timeout > 0:
        time.sleep(1)
        timeout -= 1
    if conn.isconnected():
        return conn
    else:
        return None

conn = wifi_connect(SSID, PASS)
if conn is None:
    print('Can not connect to ' + SSID)
else:
    conn.ifconfig(IFCONFIG)
    print('Connect to ' + SSID)
    # 日時設定
    rtc = RTC()
    ntptime.host = 'ntp.nict.jp'
    now = time.localtime(ntptime.time() + 9 * 60 * 60)
    rtc.datetime((now[0], now[1], now[2], now[6], now[3], now[4], now[5], 0))
    now = rtc.datetime()
    print("%04d-%02d-%02d %02d:%02d:%02d" %(now[0], now[1], now[2], now[4], now[5], now[6]))

図18 簡易ネットワークサーバー(main.py)

import usocket as socket
import network
import time

html = '''
<html>
    <head><title>Pico W</title></head>
    <body>
        <h1>Welcome to Pico W</h1>
    </body>
</html>
'''

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 80))
sock.listen(4)

while True:
    conn, addr = sock.accept()
    print('Connect from %s'  %(str(addr)));
    req = conn.recv(1024).decode()
    
    if not req.startswith('GET / HTTP/1.1'):
        conn.send('HTTP/1.1 404 Not Found\r\n')
        conn.close()
    else:
        conn.send('HTTP/1.1 200 OK\r\n')
        conn.send('Content-Type: text/html\r\n')
        conn.send('Connection: close\r\n\r\n')
        conn.sendall(html)
        conn.close()

シェルスクリプトマガジンvol.85 Web掲載記事まとめ

投稿日:2023.07.25 | カテゴリー: コード

004 レポート Wasm向けPOSIX互換ライブラリ「WASIX」
005 レポート 手のひらネットワーク機器
006 製品レビュー ロボット「NICOBO(ニコボ)」
007 NEWS FLASH
008 特集1 ゆっくりMovieMaker4で映像制作 準備編/ふる(FuruyamD)
015 Hello Nogyo!
016 特集2 ZabbixのAWS監視機能を使ってみよう/寺島広大、渡邊隼人、水谷和弘、狩俣樹
026 特集3 ChatGPTで注目の対話型AI/三沢友治
034 特別企画 成功するアジャイル開発/奥村剛史
044 Raspberry Pi Pico W/WHで始める電子工作/米田聡 コード掲載
054 Pythonあれこれ/飯尾淳
060 行動経済学と心理学で円滑に業務を遂行/請園正敏
064 中小企業手作りIT化奮戦記/菅雄一
068 SEO/桑原滝弥、イケヤシロウ
070 タイ語から分かる現地生活/つじみき
076 法林浩之のFIGHTING TALKS/法林浩之
078 香川大学SLPからお届け!/谷知紘 コード掲載
084 Linux定番エディタ入門/大津真
091 ユニケージ通信/田渕智也、高橋未来哉
096 Techパズル/gori.sh
097 コラム「ユニケージはデータ移行も得意」/シェル魔人

Vol.85

投稿日:2023.07.25 | カテゴリー: バックナンバー

 動画投稿・共有サイト「YouTube」には、「ゆっくりしていってね!!!」というフレーズで始まる、「ゆっくり実況」や「ゆっくり解説」と呼ばれる動画が数多くあります。同動画は、憎たらしくもかわいい2人のキャラクタが会話をしながらゲーム実況や各種解説をする人気のコンテンツです。
 特集1では、無料の動画編集ソフト「ゆっくりMovieMaker4」と、キャラクタ素材「ゆっくり立ち絵」を用いて「ゆっくり実況」や「ゆっくり解説」の動画を作成する方法を数回の分けて紹介します。今回はその準備編です。
 特集2では、ネットワークやサーバーを監視するためのオープンソース監視ソフト「Zabbix」を解説します。最新版ではオンプレミス環境だけでなく、クラウド環境での監視も可能です。よって、特集1の後半では、人気のクラウドサービス「Amazon Web Services」(AWS)上でZabbixを稼働・監視する方法を紹介します。
 特集3では、話題のAIチャット「ChatGPT」が用いている大規模言語モデル「GPT」を使いこなすための「プロンプトエンジニアリング」を解説します。プロンプトエンジニアリングによりどうやったら期待する応答が得られるのかを、Bing Chatで試しながら紹介します。
 特別企画では、ソフトウエアやシステムの開発手法である「アジャイル開発」に焦点を当てました。アジャイル開発を導入しても成功していない企業は多数あります。失敗の原因は何か、どうすれば成功するのかを「アジャイルソフトウエア開発宣言」から解説していきます。
 このほか、新連載として「Raspberry Pi Pico W/WHで始める電子工作」が始まりました。安価で入手しやすいラズパイを使ってIoT(モノのインターネット)機器などを製作していきます。
 今回も読み応え十分のシェルスクリプトマガジン Vol.85。お見逃しなく!

※記事掲載のコードはこちら。記事の補足情報はこちら

※読者アンケートはこちら

Vol.85 補足情報

投稿日:2023.07.20 | カテゴリー: コード

特集1 ゆっくりMovieMaker4で映像制作 準備編

p.12の表1の一番下の行にある「00d.png」は「00e.png」の誤りです。お詫びして訂正いたします。

特集2 ZabbixのAWS監視機能を使ってみよう

 p.18に記した「後述するAWS用のテンプレートの利用を含め、すべてAWSの無料利用枠で試せる」という情報は誤りでした。正しくは、AWS用のテンプレート利用時には、CloudWatchからGetMetricData APIでメトリクスを取得する料金がかかります。料金は、メトリクス1000件当たり0.01ドルです。お詫びして訂正いたします。なお、Kindle版とPDF版(定期購読特典)は修正済みです。

情報は随時更新致します。

  • shell-mag ブログの 2023年7月 のアーカイブを表示しています。

  • -->