お茶の間でのんびりといろいろ

お茶の間でのんびりといろいろ

3DCG、プログラミング、ゲーム、ソフト、日記など、多趣味なボムラがいろんなことを紹介するブログです。

Amebaでブログを始めよう!

珍しく、以前の記事から4ヶ月で戻ってきました。
今回、C言語でオセロを作ってみました。
ネットで作り方などは見ないで独力で作ったためもあり、面倒くさい&効率の悪い仕組みとなってしまいました。  

仕組み

ここでは、自分の石=黒、相手の石=白とします。
まず黒を置ける位置は、白をひっくり返せる場所のみとします。
黒を置くと、その周囲8マスに白が無いか調べます。

 


もし白があるならば、置いた黒から白の方向に進んでいきます。
その方向に進んでいき、やがて黒にぶつかったら・・・


今まで通ってきた白を黒に上塗りしながら後ろに戻っていきます。
もし黒にぶつからない(=空白にぶつかった)場合は、白を白のまま上塗りしながら後ろに戻っていきます。

これを実現するために、再帰をうまく使えないかと考えました。
というわけでできたソースコードは下になります。

 

ソースコード

#include<stdio.h>

int field[8][8]={0}; //盤
int flag=0; //ひっくり返すためのフラグ

//表示用関数
void show(){
  int i,j;
  printf("\n  0 1 2 3 4 5 6 7\n");
  for(i=0;i<8;i++){
    printf("%d",i);
    for(j=0;j<8;j++){
      switch(field[i][j]){
      case 0:
	printf("□");
	break;
      case 1:
	printf("●");
	break;
      case 2:
	printf("○");
	break;
      default:
	printf("NN");
      }
    }
    printf("\n");
  }
}

//石の状態を調べ、ひっくり返す関数
int check(int ro,int co,int i,int j,int turn){ 
  if(field[ro][co]==turn){ //自分の石と同じ色
    flag=1;
    return turn;
  }else if(field[ro][co]==0){ //空白
    return (turn==1 ? 2 : 1);
  }else{ //相手の石と同じ色
    field[ro][co]=check(ro+i,ro+j,i,j,turn); 
    if(flag=1)
      return turn;
    else
      return (turn==1 ? 2 : 1);
  }
  return -1;
}

//置いた石の周囲8マスを探索する関数
int search(int ro,int co,int turn){
  int i,j;
  int success=0;
  
  //(ro,co)の周囲8マスを調べる
    for(i=-1;i<=1;i++){
      for(j=-1;j<=1;j++){
	if(!(i==0 && j==0)   &&
	   //ro+i>=0 && ro+i<8 &&
	   //co+j>=0 && co+j<8 &&
	   ro+2*i>=0 && ro+2*i<8 &&
	   co+2*j>=0 && ro+2*i<8 &&
	   field[ro+i][co+j]!=0 && field[ro+i][co+j]!=turn)
	{
	  field[ro+i][co+j]=check(ro+2*i,co+2*j,i,j,turn);
	  if(flag==1 && success==0)
	    success=1;
	}
      }
    }
    return success;
}  

int main(){
  int turn=1; //1:○,2:●
  int ro,co;//行(row),列(column)
  int success; //探索に失敗したかどうかを判定するフラグ
  
  //初期化
  field[3][3]=1;
  field[3][4]=2;
  field[4][3]=2;
  field[4][4]=1;
  //-------
  
  while(1)
    show();
    do{
      printf("turn %s:",(turn==1 ? "●":"○"));
      scanf("%d %d",&ro,&co);
    }while(field[ro][co]!=0);
    field[ro][co]=turn;
    success=search(ro,co,turn);
    if(success==0){ //探索したが、ひっくり返せる場所が無かった場合
      printf("cannot put.\n");
      field[ro][co]=0;
      continue;
    }
    success=0;
    turn=(turn==1 ? 2 : 1);
  }

  return 0;
}
補足

 

search関数中のif文の条件中に


//ro+i>=0 && ro+i<8 &&
//co+j>=0 && co+j<8 &&
ro+2*i>=0 && ro+2*i<8 &&
co+2*j>=0 && ro+2*i<8 &&

という記述があります。 この条件によって、端っこのマスを調べたときに配列の範囲外の読み書きをしてしまうことを防ぎます。 

 

 

初めの2行がコメントアウトされているのは、後の2行でその条件が満たされるからです。 

なぜ2*i,2*jなのかは、if文のブロック内で

    check(ro+2*i , co+2*j , i , j ,turn); 

を呼び出していることが理由です。

if文ブロック内の処理を示した図を下に示します。全体として、「周囲8マスに相手の石があったら、さらにその先のマスを調べろ」という命令になっています。

 

 

コンパイル・実行方法

 

ソースコードをエディタにコピペして、適当な名前のCファイルで保存する。それをコンパイルして実行してください。

今回、Windows上のgccで動作確認をしました。具体的な方法を以下に示します。

(1)メモ帳を開いて上のソースコードをコピペ

(2)適当なディレクトリに適当な名前のCファイルで保存。

ここではC:\othello\ に作るものとし、名前はothello.cで保存。

(3)コマンドプロンプトを開いて、(2)で作ったCファイルのあるディレクトリに移動する。

ここでは以下のコマンドを実行してC:\othello\に移動する。

    cd C:\othello\

(4)gccでコンパイルすると、a.exeが同じディレクトリに作られるので、実行する。

ここでは以下の2つのコマンドを実行する

    gcc othello.c

    a.exe

 

遊び方

起動すると、まず●のターンから始まります。

置く位置は入力状態になったとき、

    行の数字 列の数字

のように入力します。

例えば下図の例では、5行3列に石を置きたいので、

    5 3

と入力しています。

0以上7以下でない数字や、ひっくり返せないような位置を入力すると、入力のやり直しになるように作りました。

勝敗判定はつけていませんので、終了はCtrl+Cで強制終了するしかないです。

 

 

以上です。

初めにも述べましたが、今回のオセロはプログラムとしては効率は悪いと思います。再帰がうまくできたら面白いかなと思って作りました。あくまで「こんなプログラムもあるんだな」程度に思ってください。他の人のオセロのソースコードを見比べてみるのも面白いですね。

 

※8/12追記:パスのルールをつけ忘れていました…。なのでどちらかが置けなくなったらゲームが進まなくなるというひどい仕様になっています。気が向いたら付け足します。

 

 

 

 

気に入っていただけた方はクリックお願いします。
ブログランキング・にほんブログ村へ

ブログ書かないで3年も経ってしまいました。

しかも一つ前の記事がエイプリルフール。内容は「ブログ閉鎖」

その記事

 

『確かに更新はカメの速度ですが、出来る限り頑張っていきますよ!
半年に一回のペースでな(これは本当)!

 

と書いてます。もはや半年どころではありません。

さすがに3年も経つと、ほんとにブログ閉鎖したんじゃないのかって思いたくなりますよね。

とりあえず生きていることをここに報告したいと思います。

 

さて、なぜ3年も経ってしまったのか。

もちろんただの怠け、が大きな理由なのですが…。

実生活が忙しかったというのもあります。

そこで今回は、ブログを書いていない間に何をやっていたのかを、概略で書こうと思います。

 

・2014年春~2015年春…海外研修とその準備

海外研修で1週間ほどアメリカに行ってきました。

メインは、アメリカの某高校で科学の研究発表をするという内容です。

1年弱かけて研究を進め、英語の能力を上げ、プレゼンの力をつけました。

一番大変だったのは英語でのコミュニケーションですね。

普段の学校の授業の英語は読み書きがメインだったので、聞く、話すことには不慣れでした。

濃密な1年でした。ここで得られたものは大きいです。

 

・2015年春~最近まで…受験勉強

2016年に後期の国立大学に合格したのですが、

どうしても第一志望の大学を目指したくて一浪しました。

結局次の年も駄目だったのですが…。

 

第一志望合格、という本来の目的を達成することはできませんでしたが、

一浪してみて、副次的に得られたものはあります。

まず、自分が現役生のとき、いかに勉強していなかったのか、ということを痛感しました。

得意だと思っていた英語でさえどうやら発展途上だったらしく、

2度目のセンター試験のとき、ようやく「読める!読めるぞ!!」という状態に達しました。

 

もう一つ、一浪して学問が面白く感じるようになりました。

特に、物理にすごく魅力を感じて、一時は理学部に行こうかとさえ思いました。

受験も終わり暇な時間があるので、とりあえず大学の数学の予習をしています。

 

というわけで現在に至ります。

今後のブログの更新頻度ですが、3年に一回のペース…にはしないようにします。

受験の2年間はほとんどPCに触れていませんでした。

PCに限らず趣味で色々やりたいことはあるので、それをこのブログで紹介できたらなと思います。

それではまた。

 

 

 

 

気に入っていただけた方はクリックお願いします。
ブログランキング・にほんブログ村へ

長年やってまいりました「お茶の間でのんびりといろいろ」ですが、
この記事をもって終了することにしました。
なぜか。
主な理由として、学校生活にあります。
進学をしてから非常に忙しく、もうブログを書いている暇なんてありません。
僕としても非常に惜しいですが、こんなろくに更新もできないブログなんて、いっそ閉鎖してしまったほうがいいのです。

このブログが始まったのは、2008年5月9日
なんと6,7年前です。思えば遠くへ来たものです。
当時はまだ幼く、文章もなかなかの下手さでした。
…まあ、今もどうだかわからないけどね!

実はそのころのブログタイトルは「お茶の間で3DCGやらいろいろ」でした。
当時は3D景観ソフトに非常にはまっており、

・Terragen
・Vue(体験版)
・VistaPro(体験版)

などなど…、いろいろなものに手を出していました。

『Terragenを使い始めた初期に作ったシーン』
2008年7月29日の記事より。
「× 桃源郷 ×」というサイトのチュートリアルをみながら作っていた覚えがあります。
非常にいいサイトだったのですが、今はリンク切れが多く、よくわからなくなっています。

そのうち、3D景観以外にも、

・六角大王
・Metasequoia
・SketchUp
・Blender

などの3DCGモデリングソフトにも手を出し始めます(現在はBlenderを主に使っています)。
Pov-Rayなどのレイトレーシングにも挑戦しましたが、
当時の学習能力では無理でした。

『Pov-Rayで作ったシーン』
2008年8月1日の記事より。
よく当時でここまでできたものだ…。

そのうちゲームの記事や、面白いソフトの記事も上げ始めます。
その何年かは、3DCG系の記事を全く上げなくなっていたので、ブログタイトルを変更することになりました。
お茶の間で3DCGやらいろいろ
お茶の間でソフト紹介やらいろいろ
お茶の間で3DCGやらソフト紹介やらいろいろ
と、度重なる変化を経て、いよいよ現在の、
お茶の間でのんびりといろいろ」という題で落ちつきました。

そして、僕の興味は「シミュレーション」へと移行していきます。
なんでかわからないのですが、物理演算だとか、生き物系のシミュレーションだとかが大好きになってきました。

物理演算は

・Phun
・あそぶつり
・粉遊び
・RigidChips

などのソフトで遊びました。
SketchUpやBlenderの物理演算機能に挑戦したり、
ODEなどの物理エンジンでプログラミングしてみようと頑張った時期もありましたが、
難しくて挫折しました。
というのも、こういう系統のソフトは英語の解説がほとんどで、
当時の僕は英語なんて「何それおいしいの?」状態だったんです。

あと、物理演算なのかはわかりませんが、Modulobeっていうソフトもなかなか面白かった。
適当に関節をつないで、周期的にそれを動かすことで生物みたいな動きができるんです。
生き物を作れるってすっげーーー!と、当時は非常に興奮しました。
それにつながるものとして、Sodaplayなんかも面白かったですね。

2010年2月28日の記事より。
筋肉の収縮の周期みたいなの(?)を調節して、生き物を動かすようなソフトでした。
もちろん上2つのソフト、当時は作るコツなどがよく分からず、
結局挫折しました

シミュレーションへの興味は、「SPORE」というゲームから始まりました。
さすが、「シムシティ」シリーズで有名なウィルライトの作ったゲームなだけあって、
飽きっぽい僕でも1,2年続きました。
それからさまざまなシミュレーションについて、インターネットで調べ始めるようになります。

・ライフゲーム
・Anlife
・Tierra
・芝が生えるゲーム

などなど…。


『コンソールで作ったライフゲーム(C言語)』
2013年5月16日の記事より。


『WinAPIで作ったライフゲーム(C言語)』
これは去年の年末に作ったものです。ブログには上げていないと思います。

AnlifeやTierraから、人工知能や人工生命などにも興味を持ち始めます。
暇なので人工生命を作ってみた
遺伝的アルゴリズムでブランコの漕ぎ方を学習させた。
スーパーマリオブラザーズを学習させてみた(1-1)
などの動画(ニコニコ動画)を見て、非常に興奮しました。
自分もいつか、こんなのをやってみたいです。

その後もさまざまなものに興味が遷移していき、現在も迷走中のこの頃です。
多趣味は悪いことじゃないと思うんですけど、どれも中途半端なんですよね。
今中心なのは、やはりプログラミングでしょうか…。
なんだかんだ言って、もうプログラミング歴も5,6年です。
思えば遠くへ(ry

進学してから、部活は情報系の部活なので、電子回路やプログラミングなど、結構楽しいことをしています。
部活でなんと3Dプリンターを使わせてくれるので、3DCGのモデリングも久々にしました。
そんな素晴らしいリアルの生活を、これからは大切にしていきたいと思います。


さて最後になりますが、いままで読んでくださった皆さん、
本当にありがとうございました。
それではみなさん、またどこかで会いましょう!





気に入っていただけた方はクリックお願いします。

…あれ、クリック出来ませんか?
おかしいですねえ。じゃあ、まだ記事は終わっていないんじゃないですか?







































あ、そういえば今日、何の日か知っていますか?
そう、みんな大好きなあの日です。








































4月1日だよ!
え?ブログ閉鎖?
え?ブログ更新停止?
ないないない、あるわけない。
上にいっぱい書いたブログの歴史は事実ですが、閉鎖は嘘です。エイプリルフールネタです。
確かに更新はカメの速度ですが、出来る限り頑張っていきますよ!
半年に一回のペースでな(これは本当)!



気に入っていただけた方はクリックお願いします。
ブログランキング・にほんブログ村へ