特攻隊

RPGツクール、パズル、プログラミング等々。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
改行が反映されるやり方がわからないので、このまま載せます^^;
最初の2行(#includeがある行)だけ改行すれば、多分コンパイルできます。
Cで作った○×ゲームです。一応、完全オリジナル。(処女作)
色々酷いところアリ。鼻で笑ってくれると嬉しい。

操作方法はキー

q w e
a s d
z x c

(キーボードの左端3列)を押すと、対応するマスに○か×が打てます。


次こそテトリスだなー。。

(12/25追記)関数turnchange()を削除し、main関数に文:turn = 1 - turn;を追加。

↓以下、ソースコード



#include <conio.h>
#include <stdio.h>

/* グローバル変数 */
int gameover;/* 1ならば終了 */
int board[3][3];/* フィールド描画用 */
int turn;/* 0ならば○の番 1ならば×の番 */
int count;/* 9になったらゲーム終了 */

/* 関数プロトタイプ宣言 */
void initialize(void);
void createboard(void);
void pushbutton(void);
void check(void);


int main(void)
{
initialize();
while(!gameover) {
pushbutton();
count++;
turn = 1 - turn;
createboard();
check();
}
return 0;
}

void initialize()
{
int i, j;/* forループ用変数 */

count = 0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
board[i][j] = 10;

}
}
createboard();

}

void createboard()
{
int i, j;/* forループ用変数 */

system("cls");
if(!turn)
printf("○の番です\n\n");
else
printf("×の番です\n\n");
for (i = 0; i < 3; i++) {
for(j = 0; j < 3; j++) {
switch(board[i][j]) {
case 10:
printf("□");
break;
case 0:
printf("○");
break;
case 1:
printf("×");
}
}
printf("\n");
}
}

void pushbutton()
{
int i, j;
int endcheck = 0;/* キー入力成功なら1 */

do {
switch(getch()) {
case 'q':
i = 0;
j = 0;
break;
case 'w':
i = 0;
j = 1;
break;
case 'e':
i = 0;
j = 2;
break;
case 'a':
i = 1;
j = 0;
break;
case 's':
i = 1;
j = 1;
break;
case 'd':
i = 1;
j = 2;
break;
case 'z':
i = 2;
j = 0;
break;
case 'x':
i = 2;
j = 1;
break;
case 'c':
i = 2;
j = 2;
break;
default:
i = -1;
}
if(i != -1) {
if(board[i][j] == 10) {
board[i][j] = turn;
endcheck = 1;
}
}
} while (!endcheck);
}

void check()
{
if ((board[0][0] == 0 && board[0][1] == 0 && board[0][2] == 0)
||
(board[1][0] == 0 && board[1][1] == 0 && board[1][2] == 0)
||
(board[2][0] == 0 && board[2][1] == 0 && board[2][2] == 0)
||
(board[0][0] == 0 && board[1][0] == 0 && board[2][0] == 0)
||
(board[0][1] == 0 && board[1][1] == 0 && board[2][1] == 0)
||
(board[0][2] == 0 && board[1][2] == 0 && board[2][2] == 0)
||
(board[0][0] == 0 && board[1][1] == 0 && board[2][2] == 0)
||
(board[0][2] == 0 && board[1][1] == 0 && board[2][0] == 0)) {
printf("\n\n\n\n\n○の勝ち\n\n");
gameover = 1;
}
else
if ((board[0][0] == 1 && board[0][1] == 1 && board[0][2] == 1)
||
(board[1][0] == 1 && board[1][1] == 1 && board[1][2] == 1)
||
(board[2][0] == 1 && board[2][1] == 1 && board[2][2] == 1)
||
(board[0][0] == 1 && board[1][0] == 1 && board[2][0] == 1)
||
(board[0][1] == 1 && board[1][1] == 1 && board[2][1] == 1)
||
(board[0][2] == 1 && board[1][2] == 1 && board[2][2] == 1)
||
(board[0][0] == 1 && board[1][1] == 1 && board[2][2] == 1)
||
(board[0][2] == 1 && board[1][1] == 1 && board[2][0] == 1)) {
printf("\n\n\n\n\n×の勝ち\n\n");
gameover = 1;
}
else if(count == 9) {
printf("\n\n\n\n\n引き分け\n\n");
gameover = 1;
}
}
コメント
この記事へのコメント
No title
どうも、おめでとうございます!
先ほど動かしてみました!ちゃんと動作しましたよ!

とても上手くシンプルにまとめてありますね。
それにソースコードも見やすくて凄い!
自分のはどうしてもごちゃごちゃしていたり、
ソースに無駄が多いので見習いたいですw

で、気になった点が2つ。
①initialize()
この関数の途中でcreateboard()を呼び出していますが、
このままでは3回も同じ関数を呼び出す事になっているので、
1行下に書いたほうがいいと思います。
つまり、initialize()は…
void initialize(){
int i, j;/* forループ用変数 */
count = 0;
puts("");
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
board[i][j] = 10;
}
}
createboard();/*←ここに書く*/
}

②system("cls")
この関数ですが、put("")に変えるといいと思います。
理由は2つあります。
1つはsystem("cls")はDOSじゃないと動かない事、
もう1つは、put("")にすることで対戦の軌跡が見れるからです。
ただ、これはかなり個人的な意見である事と、
画面をすっきりさせるのには向かないと言う悪い面があります。
ですので、聞き流してくださってもかまいません。

以上です。
自分も初心者なので専門的な事は分からないですが、
動作に問題もなく、かつ見やすい構成をしていて、
初めてとは思えないコードの書き方が特に凄いと思います。
というか、少なくとも自分よりは優秀ですw
○×ゲームが出来たのなら、それを応用しながら
他のパズルゲームも余裕で作れちゃいそうですね!

もずくさんのゲームをやったりソースコードを見ていると、
自分も久々に「ゲームを作りたい病」が再発しそうですw
大学の課題で作ったjavaゲーをjavascript用に改良して
ブログに貼り付けてみようかな?
(ただの陣取りゲームAI付きですが…)

とにかく、これからもゲームの作成楽しみにしています!
ありがとうございました!
2010/11/16(火) 13:53:20 | パルソニック | #D2xI14F.[ 編集]
No title
>パルソニックさん
詳細に、ありがとうございます!
早速createboard()の位置、直しました。
systen("cls")に関しては、テトリスのコードに使われていたもので、
便利だったのでこの○×も使ったのですが、これはDOSでないと動かないのですか…
かなり便利な関数なのに、もったいない。put()の方でも動作試してみますね。

>大学の課題で作ったjavaゲーをjavascript用に改良して
ブログに貼り付けてみようかな?

是非やってみてはどうでしょう?自分は見てみたい。。
2010/11/17(水) 19:33:16 | もずく | #-[ 編集]
No title
>是非やってみてはどうでしょう?自分は見てみたい。。
javascript用にコードを変えていたら、
fc2でpakageを使用する方法が思いつかなかったので
ブログに貼るのは諦めました…

その代わり、exeファイルに出力しました。
あまり見栄えのよいものではないので、
受け取り確認次第、または数日間で消します。
よろしければどうぞ。
http://www1.axfc.net/uploader/Sc/so/176143
パスワードは「sonic」です。
2010/11/22(月) 23:01:33 | パルソニック | #D2xI14F.[ 編集]
No title
>パルソニックさん
本当にアップしてくれるとは!ありがとうございます。
「ゴブレット」というゲームは初めてやりましたが、なかなか奥が深いゲームですね。
チュートリアルを見て、ルールはすんなりと覚えられましたが、
レベル4あたりからCPUが強くて勝てません…

高度なシステムは当然ながら、
丁寧なチュートリアルやレベル別にCPUまで作っていて、かなり手が込んでる!
CPUに関しては、素人では作り方が想像もつかないので、純粋に凄い!と思いました。

というか、他のjavaゲーと全く遜色ないクオリティにびっくりしました。脱帽です!
自分も次のプログラミングゲームを作るのに俄然やる気が出てきました。
ありがとうございました!
2010/11/24(水) 00:05:57 | もずく | #-[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://mozuku88.blog134.fc2.com/tb.php/151-67655f1d
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。