pythonでオセロを頑張る 3

今週もオセロを進めます

  • atomのパッケージ

atomにはパッケージをインストールし、様々な機能を追加することができるそうです。

atomを開いたときに出るWelcome guideからInstall a Package->Open Installerを選択
検索窓が出ると思うので、そこにパッケージ名を打ち込んでpackageを押せば、検索結果が出ます。

以下、一先ずダウンロードしたものです

japanese-menu
日本語化対応。

Script
Pythonatomで実行できる。
(Ctrl+Shift+Bとかで実行)
※日本語が入っていると上手く行かないようなので、今回は使用を諦めます。

autocomplete-paths
プロジェクト内のファイルパスをオートコンプリートに追加。

highlight-selected
選択したテキストと同じテキストをハイライトする。

indent-guide-improved
インデントをわかりやすく表示。
縦線がスーッとでます。pythonはインデントで動きが変わるため、かなり助かります。


atomは色々機能が多そうですね...。

  • 複数ファイルの実行

import XXX (.pyは付けない)
としてファイルを読み込めば大丈夫です。

#オセロのボードを定義する
class Board:

    #初期化関数
    #ボードが作られたときに呼ばれる
    def __init__(self):

......

上記のBoard.pyをメインで動くgame.pyと一緒に動かす場合は、
game.pyに

import Board

#テストコード
test1=Board.Board()
test1.print_board()

.........

とimportして、python3 game.pyなどと実行すれば大丈夫です

atomからgit/githubへのコミットができます

(GitやGit Hubが立ち上がっていないなら)
パッケージ->Git Hub->Toggle GitとToggle Git Hub
からGitとGitHubのサブ画面を起動します

多分、プロジェクト内に.gitのフォルダがあれば、Gitが勝手に読み込んでくれます。
リポジトリを作成していない場合は、Create〜〜から作ります・・・

・Gitへのコミット
Staged Changesにコミットするファイルを入れて
Commit messageにコメントを入力して
Commit to XXXX でコミットOKです。

GitHubへのpush
GitHubのウィンドウでStepにしたがい、Tokenを取得して登録します。
URLにはリポジトリのURLを入れます。

右下の矢印を選択。
Pushを選択します。

エラーが出るときもあると思いますが、落ち着いて英語を読んで指示に従えば何とかなります。

多分、pythonでオセロを頑張る 2のgitやgithubの設定をコマンドラインでする必要があります。

  • 今回の成果

Ai(ランダム)同士のオセロ対戦ができるようになりました。

    #着手可能数の検索
    def putnum(self,player):
        num=0
        for y in range(1,9,1):
            for x in range(1,9,1):
                #一個でもひっくり返せるならカウントする
                if self.reverse(player,y,x,False)>=1:num+=1
        return num

    #石の数を数える
    def stonenum(self,player):
        num=0
        for y in range(1,9,1):
            for x in range(1,9,1):
                if self.stone[y][x]==player:num+=1
        return num

ボードクラスに、着手可能数と石の数を数える関数を追加
パス処理や、勝敗判定に使います。

またボードクラスのreverseメソッドにboolの引数を追加しました。
bool=falseの時はひっくり返さずに、ひっくり返せる石の数だけ返却します。
bool=trueの時はひっくり返します。

#手番を格納するクラスを作成
class player:
    #初期化
    def __init__(self):
        #手番の色に変数を定義
        tmpBoard=Board.Board()
        self.black=tmpBoard.black
        self.white=tmpBoard.white
        #初手は黒から
        self.turn=self.black

    #手番を変更する
    def change(self):
        if self.turn==self.black:self.turn=self.white
        else :self.turn=self.black

    #手番を出力する
    def print_player(self):
        if self.turn==self.black:print("Black")
        else :print("White")

新たにプレイヤークラスを作りました。
これらで手番を管理します。

ランダムAIは以下としました

    while 1:
        x=random.randint(1,8)
        y=random.randint(1,8)
        if test1.reverse(test2.turn,y,x,False)>0:break

randintは第一引数<=x<=第二引数のランダムな値を返します。

パス判定等を追加して実行したのが以下です。

........
........
........
...WB...
...BW...
........
........
........
turn->Black
x?3
y?4
reverse=2
........
........
........
..BBB...
...BW...
........
........
........
turn->White
x?3
y?3
reverse=2
........
........
..W.....
..BWB...
...BW...
........
........
........

〜〜〜〜〜〜〜〜

BBBBBBBB
BWWWWBBW
BBBBBWWW
BBBWBWWW
BBBBWWWW
WWBWBWWW
.WWWWBWB
WWWWB.B.
turn->White
x?8
y?8
reverse=2
BBBBBBBB
BWWWWBBW
BBBBBWWW
BBBWBWWW
BBBBWWWW
WWBWBWWW
.WWWWBWW
WWWWB.BW
turn->Black
x?6
y?8
reverse=3
BBBBBBBB
BWWWWBBW
BBBBBWWW
BBBWBWWW
BBBBWWWW
WWBBBWWW
.WWWBBWW
WWWWBBBW
PASS!!
turn->Black
x?1
y?7
reverse=6
BBBBBBBB
BWWWWBBW
BBBBBWWW
BBBWBWWW
BBBBWWWW
BBBBBWWW
BBBBBBWW
WWWWBBBW
PASS!!
PASS!!
B=38VS26=W
Win!! Black

ちゃんと動きました。
今は両方の手番でランダムAIを使っていますが、片方の手番をinput()で受け取るようにすれば
AI vs Playerの対戦が完成します!!

  • 次回の予定

・Min-MaxによるAIの導入

pythonでオセロを頑張る 2

  • 普通のオセロを作る

まず、オセロのルールを整理します。
・プレイヤーは二人
・ボードの大きさは8*8で、(y4,x4)と(y5,x5)の位置に白駒、(y4,x5)と(y5,x4)の位置に黒駒がある
・先手番は黒で、交互に石を置く
・石は自分のすでに置かれている駒とで、相手の駒を挟める位置における
 ->挟んだ駒は自分の色に変化する
・挟める位置がない場合、相手手番になる
・どちらも挟める位置がない場合は、ゲーム終了。駒数の多いほうが勝ちとなる

こんな感じでしょうか。これらを作っていきます。

class Board:
  def __init__(self):
    self.none='.'
    self.white='W'
    self.black='B'
    self.stone=[[self.none for i in range(10)] for j in range(10)]
    self.stone[4][4]=self.white
    self.stone[5][5]=self.white
    self.stone[4][5]=self.black
    self.stone[5][4]=self.black

こんな感じのボードクラスを作成します。
8*8盤面に対し10*10作っているのは、後々の処理を簡単にするためです。

ボードの中身の出力等、ボードに関わることはここに記載します。


以下、オセロ実装時に調べたことです

pythonC++でいう二次配列を作るには

self.stone=[[初期値 for i in range(数)] for j in range(数)]

のような書き方をしなければいけないようです。

print(self.stone[i][j],end="")

改行なしの出力はend=""とオプション指定すればいいようです。

y=input()

値の取得はinput
ただし、文字列として受け取るため数字として使いたければint()等の変換が必要です

上記の調べごとで、Boardクラスの中身がある程度作れそうだったので
class Boardに以下のメソッドを追加しました。

  def print_board(self):
    for i in range(1,9,1):
      for j in range(1,8,1):
        print(self.stone[i][j],end="")
      print(self.stone[i][8])

  def reverse(self,player,y,x):
    num=0
    enemy=""
    if self.stone[y][x]!=self.none:return 0
    if player==self.black:enemy=self.white  
    else: enemy=self.black
    for yt in range(-1,2,1):
      for xt in range(-1,2,1):
        if self.stone[y+yt][x+xt]==enemy:
          for i in range(1,20,1):
            if self.stone[y+yt*i][x+xt*i]==self.none:break
            if self.stone[y+yt*i][x+xt*i]==player:
              self.stone[y][x]=player
              for j in range(1,20,1):
                if self.stone[y+yt*j][x+xt*j]==player: break
                self.stone[y+yt*j][x+xt*j]=player
                num+=1
    return num

一先ず、ひっくる返せるようになったのが上のソースです。
パス等が実装できていないですが、一応形にはなってきましたね

test=Board()
test.print_board()
player=test.black
while 1:
  print("x?")
  x=input()
  x=int(x)
  print("y?")
  y=input()
  y=int(y)
  n=test.reverse(player,y,x)
  if n>0:
    if player==test.black:player=test.white
    else :player=test.black
    test.print_board()

  else:
    print("No put!!")

こんな感じのテストコードを仕込んで、試してみます。

実行結果

........
........
........
...WB...
...BW...
........
........
........
x?
4
y?
3
........
........
...B....
...BB...
...BW...
........
........
........
x?
3
y?
5
........
........
...B....
...BB...
..WWW...
........
........
........
x?
5
y?
6
........
........
...B....
...BB...
..WWB...
....B...
........
........
x?
4
y?
2
........
...W....
...W....
...WB...
..WWB...
....B...
........
........
x?
3
y?
4
........
...W....
...W....
..BBB...
..WBB...
....B...
........
........
x?
1
y?
1
No put!!
x?
4
y?
1
No put!!
x?
3
y?
3
........
...W....
..WW....
..WBB...
..WBB...
....B...
........
........

オセロっぽいですね。

  • 来週までにやること

・パス判定
・勝敗判定
・乱択AIの作成

pythonでオセロを頑張る 1

機械学習したい
->pythonがいいらしい
->勉強しよう

ということで、機械学習の意味もあまり知りませんが、ややミーハーな感じでpythonでオセロの機械学習をしようかと思います。

  • 環境構築
sudo apt-get install python3

APTにpythonコンパイラが幾つかあります。
よく分からないのでpython3をとりあえず選びます。

エディターは今回Atomを使ってみます。

sudo add-apt-repository ppa:webupd8team/atom

でAPTのリポジトリを追加します。

sudo apt-get update

でパッケージの更新を行い

sudo apt-get install atom

でダウンロードができます。

今回githubを試験的に使いたいために連携の設定をします。
今回gitはダウンロードされていたので、それを使います。

git config --global user.name XXX
git config --global user.email XXX@YYY

でユーザ設定します。

ssh-keygen -t rsa -b 4096 -C XXX@YYY

で公開鍵を作ります。途中で作成する場所と、パスワードを聞かれるので入力します。

githubのページから
setting->SSH and GPG keys->New SSH key
からTitleに適当な文字列を、bodyにid_rsa.pubの中身を貼っつけます。
Add SSH keyを押せば登録されると思います。

ssh -T git@github.com

yes->パスワード
で、いい感じのメッセージが出てると完了です。

リポジトリにするフォルダに移動し

git init 

で、リポジトリの作成

適当にファイルを作成し

git add *

で追加対象にします。

git commit -m 'Test Commit'

でコメントを付けてコミットします。

githubのページで
Your repositories->New
からリポジトリを作成します。

git remote add origin XXX

XXXにはgithubで作成したレポジトリのURLを入れます。
これでgitにURLが登録されます。

git remote -v

で何かいい感じの表示が出たら登録成功です

git push origin master

githubにコミット完了です。
originはレポジトリの名前(デフォルト)
masterはbranchの名前です。

for a in range(1,100):
 if a%15==0 :print("FIZZ BUZZ")
 elif a%3==0 :print("FIZZ")
 elif a%5==0 :print("BUZZ")
 else :print (a)

試しにFizz Buzzを書いたので、これを実行します。
pythonインタプリタなため

python3 XXX.py

とかって書くだけでコンパイル無しで実行できます。
ただ

python -m compileall XXX.py

と打つとコンパイルが行われ、XXX.pycとかってファイルができます。

chmod 777 XXX.pyc
./XXX.pyc

で実行できます。

  • 次やること

基本、週1以上を目指して更新するよていです。
次回はAI(ランダム) VS PLAYERが遊べるオセロを作るところまですすめる予定です。

Qt勉強会@名古屋 #27 参加したので

qt-users.jp


Qt勉強会@名古屋に参加して、ふむふむした内容を雑にまとめます。

ubuntu 18.04.2でやっています。

・環境構築

www.qt.io


こちらqt.ioから

Download. Try. Buy. -> go open source -> download

を選択。

Downloadディレクトリにqt〜〜.runファイルがあるので

chmod +x qt〜〜.run

で実行権を与え

sudo qt〜〜.run

とかってやると、インストーラが起動するので従います。
これで、qtのいろいろがDLされます。

・Qt
QtCreatorと呼ばれる、Qtに特化してる(と思う)統合開発環境を使います。
QtCreator、Qt使わなくてもいけちゃうので普段遣いにも良さそうです。かなり動きが軽くサクサク動く印象があります。

左の「ようこそ」 -> +新しいプロジェクト
でプロジェクト作成画面へ。

今回、ウィジェットの説明を勉強会中に聞いたので「Qtウィジェットアプリケーション」を選択。
後は適当に選びます。

Formsフォルダに「.ui」ファイルが入っていますが、これを選んで左の「デザイン」を選ぶとGUIでグリグリとパーツ配置ができます。

ソースが自動生成されているかと思いますが、

ui->setupUi(this);

みたいなソースがあるので、この辺りのコードで何かいい感じに読み込んでくれるのでしょう。


・今回作ったものと知見

これをC++/Qtで作ってました。


Widgetへの画像表示
.uiのデザイン画面で、Graphic Viewがあるので、それを適当に貼り付けます。
右上から貼ったGraphic Viewを選び、右下でobject nameをわかりやすい感じに変更します。

.proに

RESOURCES += \
        画像ディレクトリ

とかって追加すると、左のプロジェクト一覧に画像が追加されていい感じになります。

自動生成したソースだと、MainWindowクラス(名前は違うかも)のインスタンスを作り、showメソッドを実行しているかと思います。
このMainWindowにゴリゴリ書いていきます。

    ui->setupUi(this);
    ui->forwardview->setScene(&forwardScene);
    ziki = new QImage();
    ziki->load(ファイルパス);
    Qziki=QPixmap::fromImage(*ziki);
    forwardScene.addPixmap(Qziki);

※
forwardviewはGraphic Viewの名前
forwardSceneはQGraphicsSceneの名前
zikiはQImage*の名前
QzikiはQPixmapの名前

これで画像表示ができるはずです。
QPixmapに一度変換するのがミソでしょうか。

・画像加工
QImage自体は、(多分)ただの画素データの集合なので、直接弄ったり、用意されているメソッドで加工できます。

・大きさ変更

*ziki=ziki->scaled(ZIKI_SIZE_W,ZIKI_SIZE_H,Qt::KeepAspectRatio);

※
ZIKI_SIZE_W、ZIKI_SIZE_Hは#define定数

・反転
こちらはメソッドがないぽかったので、作りました。

QImage MainWindow::reverseQImage(QImage Qi){

    QImage *retQImage;
    *etQImage=Qi;

    for(int i=0;i<ZIKI_SIZE_H;i++){
        for(int j=0;j<ZIKI_SIZE_W;j++){
            QRgb tmpRGB=Qi.pixel(ZIKI_SIZE_W-j-1,i);
            retQImage->setPixel(j,i,tmpRGB);
        }
    }

    return *retQImage;
}

こんな感じで、pixelで取得してsetPixcelで設定すれば加工できます。
QImageのサイズには注意です。
QImage::pixel: coordinate (50,90) out of range
って怒られます。

・キー取得
eventFilter使いました。

protected:
    bool eventFilter(QObject* widget, QEvent* event);

と宣言します(protectedでないとダメらしい)

bool MainWindow::eventFilter(QObject * obj, QEvent * event)
{
    QKeyEvent * keyEvent;

    //キーが押されている時のイベントの処理
    if(event->type() == QEvent::KeyPress){
        処理内容
    }
}

とかって書き、MainWindowのコンストラクタらへんに

    installEventFilter(this);

と書くと、キー入力を受け取れるようになります。

・画像の移動
Graphic Viewの好きなとこにQPixmapを貼りたかったのですが失敗。
中央寄せ、左寄せ...など、上下左右中央に寄せて表示しかできなかったです。
なので、

①Graphic View自体を動かす
②でかいQImageの背景を作り、そこにゴリゴリ書いていく

の2つを考え②を採用しました。

・詳細

QImage MainWindow::reverseQImage(QImage Qi){

    QImage *retQImage;
    retQImage=new QImage(QSize(1000,1000),QImage::Format_RGBA8888);

    for(int i=0;i<ZIKI_SIZE_H;i++){
        for(int j=0;j<ZIKI_SIZE_W;j++){
            QRgb tmpRGB=Qi.pixel(ZIKI_SIZE_W-j-1,i);
            retQImage->setPixel(j+zikiX,i+zikiY,tmpRGB);
        }
    }

    return *retQImage;
}

さっきの反転プログラムを変えました。
QImageを作る際にQSize(1000,1000)を指定して、大きいサイズのQImageを作ります。
Format_RGBA8888はよくわかってないです(宿題)。
zikiXとzikiYに座標情報を入れ、さっきのeventFilter実行時に値を変えてやります。

・定期的な実行
ここでQtのsignal、slotを使います。

    cycleTimer->setInterval(100);
    cycleTimer->setSingleShot(false);
    connect(cycleTimer,SIGNAL(timeout()),
            this,SLOT(slotCycleEvent()));
    cycleTimer->start();

※
cycleTimerはTimerの名前

setIntervalとすることで、Nミリ秒ごとにtimeoutシグナルを発行するようになります。
setSingleShotをtrueにすると一回のみになります。
このTimerクラスのtimeoutシグナルと、描画処理のあるスロットをconnectして、タイマーを走らせば定期処理の完成です。

とても簡単でいいですね!!

あとは描画処理に

    for(int i=0;i<1000;i++){
        for(int j=0;j<1000;j++){
            Dziki->setPixel(j,i,0);
        }
    }
    *Dziki=reverseQImage(*ziki);
    Qziki=QPixmap::fromImage(*Dziki);
    forwardScene.clear();
    forwardScene.addPixmap(Qziki);

※
DzikiはQImage*の名前

と書きます。
zikiには、読み込んだ画像データが入っています。
それを0埋めした*Dzikiに入れ、QPixmapに変換します。
forwardScene.clear()でwidgetの描画を消し、addPixmapで描画します。


以上で、動く船の完成です。


・やり残し
・もっと簡単な方法がありそう
QImage::pixel: coordinate (N,N) out of range
のお怒りが毎ミリ秒ごとに流れてるので、どこか直す
・押したキーの種類を受け取って、戦艦を上下左右に動かす。


・最後に
www.irasutoya.com

今回、イラスト屋の素材を借りました。
統一感を出すため、イラスト屋オンリーのシューティングゲームを作るのが目標です。

来週の勉強会では、少しでもQtのスキルアップがしたいですね。(わからないことがあれば、#qtjpに投げるので、よろしくお願いします。)

steamゲームメモ2018年版

せかるるです。

 

最近、steamで崩すゲームやオススメするゲームを迷う時が多々あるので、僕が買ったsteamゲームの中からオススメのゲームをメモがわりに書いておきます。

 

順番はsteamゲームリストでの50音順に並べています。

 

.hack//G.U. Last Record

Steam:.hack//G.U. Last Recode

 

70時間ほどプレイ。

ps2.hack//GUの3部作+αが収録されている超ボリュームなソフトです。

vol.2クリアまで遊んで70時間なので、クリアまでにかなり時間がかかります、、、

 

ストーリーは、MMOゲームの中でPKした人間をリアル世界で意識不明にする『トライエッジ』を巡る物語になっています。

某MMO小説みたいな話ですが、こっちの方が出は早いはずです。

 

アイテム収集やミニゲーム等MMOっぽいやり込みが多くあり(MMOみたいに0.01%で落ちるとかはないので辛い思いもしなくていい)、色々とやると忙しく楽しいです。

ストーリーも主人公が、精神的に成長し敵に立ち向かう割と王道ものです。舞台がゲーム世界なので、少し難解な部分もありますが分かりやすくのめり込めるストーリとなっています。

全体的にps2のソフトなので古い感じがありますがおススメです。

 

(主題歌?のやさしい両手がとてもいい曲です)

 

20XX

Steam:20XX

7.9時間ほどプレイ。

ロックマン+ローグライクなゲーム。

完全に最初からのローグライクではなく、ネクロダンサーみたいに初期ステupやアイテムアンロックの要素はある。

 

割と難易度が高いです。ボスが強いというより、ステージのギミックが難しい。

マルチでクリアしましたが、ソロクリアがまだなので頑張りたい…。

 

みんなのA列車で行こうPC

Steam:A-Train PC Classic / みんなのA列車で行こうPC

3dsa列車で行こう3dをpc向けに移植した作品です。

元が3dsのソフトということもあり、グラフィックはかなりショボいですが、代わりに経営ゲームの面が強化されているらしいです。

(a列車のほかシリーズをやってないので、間違ってるかもです)

 

ステージクリア型で、『鉄道利益20万突破しろ』『人口を4万人以上にしろ』など、それぞれ何かしら問題を抱えた街の目標を鉄道の力で解決するものとなっています。

損益計算表や融資など、お金に関する難しい言葉等が出るので少し賢くなった気がします。

 

複雑なダイヤ(電車の運行計画)を無事に引けたり、自分の思い描いた通りに街や会社が発展するとかなり気持ちいいゲームです。

 

Baldurs Gate

Steam:Baldur's Gate: Enhanced Edition

 

28時間ほどプレイ。

 

かなり昔のゲームなのか、あまり見たことないシステムで慣れるまでに時間がかかりましたが、慣れると楽しいです。

マイユニット+npc5人の6人パーティで冒険をします。戦闘はRTSみたいな感じです。(いつでも一時停止ができて、その間に指示も出せるのでそこまで忙しくない)

良くも悪くも高難易度ですが、セーブ&ロードがいつでもできるのでストレスはあまり感じません。

 

仲間のnpcがまるで生きてるかのように動きます。『〜〜まで付いてきてくれ』と仲間になった後に放置して別のクエストをやっていると。

『チンタラするなら帰るぜ』とどっかいってしまいます。

悪い人と良い人を同じパーティにすると『こんなやつとパーティ組むなよ』と怒ってきます。

 

ある意味、最近のゲームよりリアルなゲームでつい世界に入ってしまいます。

続編の2も買ったので早くクリアしないとなぁ…。

 

cave story+

Steam:Cave Story+

7.9時間ほどプレイ

 

洞窟物語ってやつです。

2dのアクションシューティングで、様々な武器があり難易度も中々手応えがあり楽しかったです。

 

バルログってキャラが可愛くて好きです。

 

cogmind

Cogmind on Steam

 

0.7時間ほどプレイ

ロボットローグライクゲームです。

 

他のローグライクと違い、@がロボットで拾ったパーツを付け替えて強くなっていきます。

それぞれのパーツに特徴があるようで、足なら『早いけど積載量が少ない』『遅いけど積載量が多い』があり、拾った他のパーツや自分のプレイスタイルで色々ロボットを改造していくのが楽しそうなゲームです。

 

英語読むのがしんどいので、少し放置しています。

 

Contraption Maker

Steam:Contraption Maker

 

15.5時間ほどプレイ。

 

未完成のピタゴラスイッチがあるので、指定されたパーツを用いてピタゴラスイッチを完成させるゲームです。

パズルが完成した時の見た目の楽しさは中々のものだと思います。

物理演算?っぽいパズルゲームなので、作者想定外の方法で解くこともできて、解いた後に想定解法と比べると笑えてまた楽しいです。

 

16時間ほどやっても解けきれない程問題があり、またユーザー作成の問題もダウンロードして遊べるのでハマれば無限に遊べてしまいます。

 

Creeper World 3: Arc Eternal

Steam:Creeper World 3: Arc Eternal

 

9.7時間ほどプレイ。

 

RTS(多分タワーディフェンス)で、敵の侵攻から自拠点を守りながら敵拠点を守るゲームです。

このゲームが他のゲームと違うところは、敵が流動的な水であること。際限なく敵拠点から水が流れてきて触れるとダメージを受けます。

なので、それに対抗するために砲台や資源回収施設を建てて対抗します。

 

流動的な水なので、高低差に影響されやすく、また際限なく攻めてくるので隙を見て自分の領地を広げるのが難しく楽しいです。

 

地道にコツコツと領地を広げていくので、クリア後の達成感はすごいものです。

 

CrossCode

Steam:CrossCode

 

3.9時間ほどプレイ。

 

 

最近始めたばかりですが、アクションの触り心地がとても気持ちいいです。

スキルツリーや、素材収集などやり込み要素も多く、かなり楽しめそうなゲームです。

 

やぁ!

 

Everyday Genius

Steam:Everyday Genius: SquareLogic

 

8時間ほどプレイ。

数独ベースのパズルで『賢くなるパズル』なんて呼ばれています。

 

驚くべきは問題数で2万問くらいあるそうです。パズルのバリエーションも豊かで、とりあえずパズルが解きたい!って人にオススメです。

 

僕はこのゲームの問題を全て解くのが密かな夢です。

 

Factorio

Steam:Factorio

 

51時間ほどプレイ。

 

かなり有名なゲームだと思います。

鉄鉱石や銅鉱石から、歯車や弾薬などを自動生成するラインを作るゲームです。

綺麗に早いラインを作れた時はすごく気持ちいいですね…。

 

マルチでロケット打ち上げたので、ソロでも打ち上げたみたいです。

 

Gremlins, Inc.

Steam:Gremlins, Inc.

 

69時間ほどプレイ。

最高のクソゲー

 

手持ちのカードを使って、スコアを規定数貯めるボードゲーム

このゲームのヤバいとこは、カードの大半が妨害系カードで一位から最下位の転落が普通に起こり得ることです。

他のプレイヤーの妨害を受けないよう、密かにスコアを獲得する手立てや準備を進めていくゲームとなっていて、運の要素が多いもの考えることが多く楽しいです。

 

友達と二人でやると作戦もクソもなくお互いに妨害が飛ぶのでカオスになります。

牢屋(一定ターン数行動不可)にゲームプレイの半分くらいいることもあり、この勝負中何してたっけ?となることがよくあります。

 

Out of the Park Baseball 19

Out of the Park Baseball 19 on Steam

 

39時間ほどプレイ。

ootpなんて呼ばれてる野球ゲームです。

アクション要素はなく、球団のマネジメント(選手のトレード、打順など)を行って球団を優勝へと導きます。

かなりデータ量が多く、かなり昔の各球団の各選手のデータが収録されています。MLBのゲームですが、NPBのデータもあります!

選手の故障に悩みながら、トレードした選手が賞を獲得したり、自分のチームが優勝すると誰かに自慢したくなるほど嬉しいです。

 

Overdungeon

Overdungeon on Steam

 

1.1時間ほどプレイ。

 

slay the spireにタワーディフェンスを足したゲーム。発売されたばかりのゲームなので、色々壊れカードがあったり荒い印象ですが、逆にそれがいい味になっています。

後半、いいカードが引けると画面がよく分からなくなって見てるだけで楽しいです。

 

実績や統計に後々対応するらしいので、対応されたらじっくり遊びたいです。

 

SpaceChem

Steam:SpaceChem

44時間ほどプレイ。

 

Zachtronicsのパズルゲーム。ここのパズルゲームはどれも楽しいのですが、特に好きなのはこのspace chem。

入力値としてhとoが与えられるので、結合や移動を行いh2oを出力。など、入力から出力を作るゲームです。

スペースや、ライン数の制約が厳しく、いかに要領良く作るかが求められます。かなり難しい。

ただ、解けたときの快感は格別で完成したラインをついついずっと眺めてしまいます。

 

Tales of Maj'Eyal

Steam:Tales of Maj'Eyal

630時間ほどプレイ。

多分、人生の中で一番遊んでるゲームです。

 

ローグライクゲームなのですが、アイテムや満腹度と相談して最小限の力で…という戦略が必要のないゲームです。

満腹度はなく、消費アイテムもありません。(ステータスアップの消費アイテムはあるが、回復系のアイテムなどは無い)

そのかわり、回復はクールダウンのあるスキルになっており、回復すると一定ターン数使えませんが一定ターン待てば何回でも使えます。

 

こういったゲーム性なので、面倒なアイテム管理の必要がなく遊びやすいです。

また、スキルには攻撃スキル等もあり高火力の攻撃を出せるのが気持ちいい。敵も、高火力の攻撃を行ってくるので良くも悪くもかなり大味な印象です。

 

種族や職業が多くあり、それらに異なる個性的なスキルがあり、まだまだ飽きそうにないです。

 

The Crew 2

Steam:The Crew™ 2

 

アメリドライブゲーム

縮小こそされていますが、アメリカ全土をドライブできるゲームです。

ナイアガラの滝、ラスベガス、グランドキャニオンなど、実際にドライブ観光ができて楽しいです。

しかも、レースとかいう大ボリュームなオマケもある。

 

不思議の幻想郷TODR

Touhou Genso Wanderer -Reloaded- / 不可思议的幻想乡TOD -RELOADED- / 不思議の幻想郷TOD -RELOADED- on Steam

26時間ほどプレイ。

 

東方の二次創作ゲーム。

内容はほぼ風来のシレン

東方オリジナルの要素として『にとフュージョン』があり、ダンジョン内で拾うポイントこそ必要だが、未識別アイテムを鑑定できたりとかなり遊びやすい。

ダンジョン数も多く、全て遊びつくすとなるとかなり時間がかかりそう。

 

Ultimate Chicken Horse

Steam:Ultimate Chicken Horse

11.8時間ほどプレイ。

 

オンラインのパーティモードが楽しい。

 

これは文字の説明より、トレイラー等を見た方が分かりやすいかもしれません。

普通のアクションゲームですが、各プレイヤーが障害物を置けるためステージが中々カオスなものとなっていきます。時にはクリアー不可なステージとなりますが、それも面白い…かもです。

毎回、障害物配置が変わるので飽きずに何度も遊べます…。

 

Undertale

Steam:Undertale

7時間ほどプレイ。

 

トレイラーに惹かれたなら、何も調べず何も見ずにこのゲームをやってほしい。

僕から言えることは、Napstablookは可愛いということだけです。

 

WORLD OF FINAL FANTASY

WORLD OF FINAL FANTASY® on Steam

 

34時間ほどプレイ。

 

ffキャラが2頭身にデフォルメされたお祭りゲームです。ひたすらに可愛い。

トンベリとか、チョコボとかひたすらに可愛い。

 

ゲームとしても、ノセノセによるスキルの組み合わせなど編成が楽しいです。

 

トレイラーを見て、可愛いと思えたならオススメです。

 

 

 

さいごに

一応、人にオススメする文章のはずがあまりオススメできてないですね…。

2019年はsteamでゲームを買わずに積んでいたものを崩していきたいです。

 

 

 

 

 

 

 

 

Linux-不要デーモンの停止-

最近起動が遅い(1分3秒)なので、何か対策をば
不要デーモンの停止をすれば早くなるとの噂を聞き、試してみました



デーモンはLinuxで常駐しているプロセスのことです。
システムの要求に応じて、各デーモンが様々な機能を自動で実行します。

これ、初期でどのデーモンが立ち上がるかはあらかじめ設定されています。

systemctl list-unit-files -t service

なんて打つと、デーモンの起動状態が表示されます。
(ubuntu14だか15だかでsystemdが採用されてこうなったそうです。
昔はchkconfigとかだったとか)

止めたいデーモンを知りたいので、grep enabledとかしかけておきます。
以下、結果です

tk@celeron2:~$ systemctl list-unit-files -t service|grep enabled
accounts-daemon.service                    enabled        
anacron.service                            enabled        
apparmor.service                           enabled        
autovt@.service                            enabled        
avahi-daemon.service                       enabled        
bluetooth.service                          enabled        
clamav-freshclam.service                   enabled        
console-setup.service                      enabled        
cron.service                               enabled        
cups.service                               enabled        
dbus-fi.w1.wpa_supplicant1.service         enabled        
dbus-org.bluez.service                     enabled        
dbus-org.freedesktop.Avahi.service         enabled        
dbus-org.freedesktop.ModemManager1.service enabled        
dbus-org.freedesktop.nm-dispatcher.service enabled        
dbus-org.freedesktop.resolve1.service      enabled        
friendly-recovery.service                  enabled        
getty@.service                             enabled        
irqbalance.service                         enabled        
kerneloops.service                         enabled        
keyboard-setup.service                     enabled        
ModemManager.service                       enabled        
network-manager.service                    enabled        
networkd-dispatcher.service                enabled        
NetworkManager-dispatcher.service          enabled        
NetworkManager-wait-online.service         enabled        
NetworkManager.service                     enabled        
ondemand.service                           enabled        
postfix.service                            enabled        
pppd-dns.service                           enabled        
rsync.service                              enabled        
rsyslog.service                            enabled        
setvtrgb.service                           enabled        
smartd.service                             enabled        
smartmontools.service                      enabled        
snapd.autoimport.service                   enabled        
snapd.core-fixup.service                   enabled        
snapd.seeded.service                       enabled        
snapd.service                              enabled        
snapd.system-shutdown.service              enabled        
syslog.service                             enabled        
systemd-fsck-root.service                  enabled-runtime
systemd-resolved.service                   enabled        
systemd-timesyncd.service                  enabled        
udisks2.service                            enabled        
ufw.service                                enabled        
ureadahead.service                         enabled        
whoopsie.service                           enabled        
wpa_supplicant.service                     enabled    

ここから不要なサービスを停止すれば良いわけです

例えば、bluetooth.serviceなんかは、名前の通りbluetoothに必要なデーモンなので
bluetoothを使わないならいらないでしょう。

sudo su-

なんかでルート権限になり

systemctl disable bluetooth.service 

でサービスの自動起動をOFFにします
(自動起動をOFFにするだけで、サービスがすぐ止まるわけじゃありません。
すぐ止めるならstopを)

サービスの自動起動を再びONにするなら

systemctl enable bluetooth.service 

すぐに開始するならstartします。


下手に止めると面倒なので、確実に止めて大丈夫そうなのだけ止めていきます
ここから下、かなり適当です。

accounts-daemon.service
謎なので放置

anacron.service
cron(定期実行)関連っぽい。重要そうなので放置

apparmor.service
各プログラムに制限をかけるセキュリティプログラムっぽい。重要そうなので放置

autovt@.service
Alt+ファンクションキーでバーチャルターミナルを起動させるデーモン。GUI固まったときにお世話になるので放置

avahi-daemon.service
ローカルネットのプリンタやファイルを即時に探すデーモンらしいです。
ネットで見ると、こいつが原因で◯◯が動かない!!が多いみたいなので止めておきます

bluetooth.service
bluetooth関連(多分)。
使わないので止めておきます

clamav-freshclam.service
アンチウィルスのプログラム。こいつは初期ではなく、後でサービス追加したものですね。放置

console-setup.service
cron.service
コンソールもクーロンも大事そうなので放置

cups.service
印刷関連(多分)。印刷する気ないので停止

dbus-fi.w1.wpa_supplicant1.service
dbus-org.bluez.service
dbus-org.freedesktop.Avahi.service
dbus-org.freedesktop.ModemManager1.service
dbus-org.freedesktop.nm-dispatcher.service
dbus-org.freedesktop.resolve1.service
dbusはシステム内のプロセス間メッセージ配信のデーモンらしい
なんか大切そうだ。放置

friendly-recovery.service
謎。放置

getty@.service
ユーザ認証のユーザ名入力とかを行ってくれるやつっぽい。
必須だ。放置

irqbalance.service
ハードウェアの割り込み処理を別CPUに分散させる
CeleronN3450はクァッドなので役立ってそうです。放置

kerneloops.service
kerneloops自体は、カーネルがエラーログを生成する、正常な状態からの逸脱状態のことらしいです。
必要そうなので放置。

keyboard-setup.service
キーボードは大切そうなので放置。

ModemManager.service
モデムとか使うときに必要らしい。(多分使ってない)ので停止

network-manager.service
networkd-dispatcher.service
NetworkManager-dispatcher.service
NetworkManager-wait-online.service
NetworkManager.service
変に止めて、ネット繋がらなくなると嫌なので一旦放置

ondemand.service
謎。放置

postfix.service
メールサーバー。使わないので停止する

pppd-dns.service
PPP接続時のなんか。
多分使ってないので停止。

rsync.service
ディレクトリ同期とかに使う
必要な未来が見えないため停止

rsyslog.service
ログ管理サービス
必要な未来が見えないため停止

rsyslogやrsyncは、業務上で使いそうなので
勉強という意味で使ってみるのはありですね、、、

2019/8/2 追記
OSが落ちた時とかに原因が特定できなくなるため、必須です。

setvtrgb.service
謎。放置。

smartd.service
smartmontools.service
HDD(SSD)の状態を調べるやつ(多分)
使っているので放置

snapd.autoimport.service
snapd.core-fixup.service
snapd.seeded.service
snapd.service
snapd.system-shutdown.service
パッケージ管理ソフト
apt-getだけで十分な気はしなくもないが、やたらネットで勧められているので放置。
後で使ってみる

syslog.service
rsyslog切ったせいで、ついでに切れている(はず)
2019/8/2 追記
rsyslog同様、切ってはダメ。

systemd-fsck-root.service
systemd-resolved.service
systemd-timesyncd.service
systemdの名前がついたものを触るのは怖い。放置

udisks2.service
ストレージデバイスに問い合わせたり制御を行うために使われるD-Busがうんぬんかんぬん
ArchWikiの記述がわかんね。放置

ufw.service
ファイヤーウォール
必要なので放置

ureadahead.service
謎。大事っぽさそう。放置

whoopsie.service
whoopsieは日本語で"うんち"。クラッシュレポート関連なんだけど、名前他にあっただろうに
重要そうなので放置。

wpa_supplicant.service
無線ランに必要っぽい?放置。



最終的にこうなりました

root@celeron2:~# systemctl list-unit-files -t service|grep enabled
accounts-daemon.service                    enabled        
anacron.service                            enabled        
apparmor.service                           enabled        
autovt@.service                            enabled        
clamav-freshclam.service                   enabled        
console-setup.service                      enabled        
cron.service                               enabled        
dbus-fi.w1.wpa_supplicant1.service         enabled        
dbus-org.freedesktop.nm-dispatcher.service enabled        
dbus-org.freedesktop.resolve1.service      enabled        
friendly-recovery.service                  enabled        
getty@.service                             enabled        
irqbalance.service                         enabled        
kerneloops.service                         enabled        
keyboard-setup.service                     enabled        
network-manager.service                    enabled        
networkd-dispatcher.service                enabled        
NetworkManager-dispatcher.service          enabled        
NetworkManager-wait-online.service         enabled        
NetworkManager.service                     enabled        
ondemand.service                           enabled        
setvtrgb.service                           enabled        
smartd.service                             enabled        
smartmontools.service                      enabled        
snapd.autoimport.service                   enabled        
snapd.core-fixup.service                   enabled        
snapd.seeded.service                       enabled        
snapd.service                              enabled        
snapd.system-shutdown.service              enabled        
systemd-fsck-root.service                  enabled-runtime
systemd-resolved.service                   enabled        
systemd-timesyncd.service                  enabled        
udisks2.service                            enabled        
ufw.service                                enabled        
ureadahead.service                         enabled        
whoopsie.service                           enabled        
wpa_supplicant.service                     enabled    

※2019/8/2 追記
現在、syslog系が追加されています。

メモリ使用率は

root@celeron2:~# free
              total        used        free      shared  buff/cache   available
Mem:        7997272     1600540     5104592       62612     1292140     6763584
Swap:       2097148           0     2097148

から

tk@celeron2:~$ free
              total        used        free      shared  buff/cache   available
Mem:        7997272     1046348     6248244       50500      702680     7007792
Swap:       2097148           0     2097148

に。幾らか空きましたね。
起動時間は変わらずですが、、、




・最後に
systemdの理解がしたい。
止めたサービスの中で必要なものが絶対にあるので、もっと精査したい
(ブログネタとして、chkconfigでの変更方法を調べてたのに、バージョンアップで廃止されてて悲しい)
systemdはデーモンじゃなくてサービスに呼び方変わったっぽい

起動時間の高速化に関しては、他を探りたい。

Linux-音が出ない-

Linuxが急に音を出さなくなりました!!

大変です。

 

ubuntuを18.XXにアップグレードしてからなので、

何かアップグレードで変わったのかと思いながら解決したので

道筋を残しておきます

 

 

0.linux 音が出ない で検索

いろんなブログが出てくると思います。

 

1.ハード的な確認

lspci -v | grep Audio

lsmod | grep snd

とか打つ。

サウンドカードがカーネルに認識されて入ればlspciに何か出力され

ドライバが入っていればlsmodで何か出る

 

何も出てこないなら、ハード的不備やドライバの確認をする

 

僕は今回、これは大丈夫だった

 

2.ALSAのミュート

Advanced Linux Sound Architectureの略で、Linuxの音関連のライブラリといえばこれらしいです。

mickey-happygolucky.hatenablog.comここにざっくり書かれています。

このALSA自体にミュートがかかっていることがあるらしいです。

しかも困ったことに、バーにある音量設定から弄れない!!!!

Linuxこういうとこだよ

 

alsamixer
を端末で叩けば、alsaのミュートや音量設定ができます。

左右でチャンネルを変更、チャンネル下部がMMになっているものはミュートになっているのでMキーを押せば解除されます

 

※これで1週間治りました

 

3.JACKのインストール

僕の初期では

アプリ->PulseAudio->ALSA

となっていました。

PulseAudioは、形式やビットレートがバラバラなアプリ音をある程度揃えるソフトらしいです

 この辺りが詳しいです。

https://pyocopon.sakura.ne.jp/linuxdtm/?p=83

ただ、PulseAudioよりJACKのほうが使いやすいみたいなツイートを見たので変わりに導入。

JACKも役割的にはPulseAudioと同じらしいです。JACKの方が細かく設定できるとか(プロ向け?)

 

poor-user.blogspot.com

この辺りを参考に。

基本、

sudo apt-get install qjackctl

でインストール。

qjackctl

で起動です。

後はJACKの設定

・リアルタイムのチェックボックスを有効

・インターフェースを明示的に指定する(デフォルトにしない)

・※JACKオーディオサーバの自動起動は有効にしないこと

 

これで、音を出すソフトを起動前にJACKを動かせば音が鳴るようになりました!!

(ソフト起動中に動かしても音が鳴らないのが難点)

 

<<JACK起動させたら何で音鳴ったんだろう...?

    PulseAudioの設定がおかしくて、JACKにすり替えたから鳴った????>>

 

ひとまずOKということで

 

・最後に

windowsではこんなこと起きなかったので、さすがシェアトップなだけあって使いやすいOSなんだと感じます(それでも普段遣いでwindowsは使いませんが...)