C言語で、簡単なゲーム作成をしているのですが、どこを直せばいいのかわかりません;;助けてください;;

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
MH

C言語で、簡単なゲーム作成をしているのですが、どこを直せばいいのかわかりません;;助けてください;;

#1

投稿記事 by MH » 14年前

以下のものを、乱数などを使って表を十分にスクランブルし、ゲームが始められるようにしたいです。
行と行、列と列を混ぜ、最後に多少、乱数で混ぜて調整し、なるべく早くよく表が混ざるようにしたいです。
偶数回混ぜるようにすればよいということは聞いたのですが、混ぜ方がいまいちよくわかりません;;
どこをどう直せばよいのか教えてくださるとうれしいです;;
よろしくお願いします;;


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


int Nummatrix(void);
int Check(int);
int Tableinit(int n);
int Start(int n);
int Table(int);
int Drawkoma(int x, int y, int n);
int Move(int n, char S);
int Select(int n);


int masu[11][11];


main( ){
int num, test, t;


clrscr();
do{
num = Nummatrix();
test = Check(num);
cprintf(" %d \n\r", num);
}while(test == 1);
clrscr();
Tableinit(num);
do{
t = Select(num);
}while(t != 0);
gotoxy(5,num+8);
cprintf(" 終了\n\n\n");
return 0;
}


int Nummatrix(){
char charn[2];
int n;
textcolor(10);
cprintf(" 大きさは?");
gets(charn);
n = atoi(charn);
return n;
}


int Check(int n){
int check;
if(n > 1 && n <= 10){
printf(" 正しい入力です ");
check = 0;
}
else{
printf(" 入力のまちがい ");
check = 1;
}
return check;
}


int Tableinit(int n){
int x, y;
textbackground(11);
clrscr();
printf("\n\n\n");
for(y=1;y<=n;y++){
for(x=1;x<=n;x++){
masu[x][y] = x + (y-1)*n ;
if(x==n && y==n) masu[x][y] = 0;
Drawkoma(x, y, n);
}
cprintf("\n\r");
}
return 0;
}


int Start(int n){
int i, k;
char choice;
srand((int)time(0));
for(i=0; i<=10; i++){
k = rand()/(1.+ RAND_MAX)*4;
switch(k){
case 0:
choice ='I';
break;
case 1:
choice ='J';
break;
case 2:
choice ='K';
break;
case 3:
choice ='M';
break;
default:
printf(" Random Number ??? \n");
break;
}
textcolor(10);
cprintf("%d %c",k, choice);
getchar();
Move(n, choice);
}
return 0;
}


int Table(int n){
int x, y;
textbackground(11);
clrscr();
printf("\n\n\n");
for(y=1;y<=n;y++){
for(x=1;x<=n;x++) Drawkoma(x ,y ,n);
cprintf("\n\r");
}
cprintf("\n\r");
return 0;
}


int Drawkoma(int x, int y, int n){
int col;
textbackground(15);
col = (masu[x][y] - 1)/n + 9;
if(col > 15) col = col+1;
textcolor(col);
if(masu[x][y] !=0) cprintf(" %2d",masu[x][y]);
else{
textcolor(15); cprintf(" *");
}
return 0;
}


int Select(int n){
int t;
char S[1];
t=1;
textbackground(11);
textcolor(14);
gotoxy(4*n+8,5); cprintf("駒を動かす       \n");
textcolor(15);
gotoxy(4*n+10,6); cprintf("I:上の駒を入れる \n");
gotoxy(4*n+10,7); cprintf("J:左の駒を入れる \n");
gotoxy(4*n+10,8); cprintf("K:右の駒を入れる \n");
gotoxy(4*n+10,9); cprintf("M:下の駒を入れる \n");
gotoxy(4*n+10,10); cprintf("0:終了      \n");
cscanf("%s",S);
if(S[0]=='0') t=0;
else Move(n,S[0]);
return t;
}


int Move(int n, char S){
int oldx, oldy, x, y;
for(x=1;x<=n;x++){
for(y=1;y<=n;y++){
if(masu[x][y] == 0){
oldx = x;
oldy = y;
}
}
}
switch(S){
case 'I' : case 'i':
if(oldy > 1 ){
masu[oldx][oldy]= masu[oldx][oldy-1];
masu[oldx][oldy-1] = 0;
Table(n);
}
break;
case 'J' : case 'j':
if(oldx > 1 ){
masu[oldx][oldy]= masu[oldx-1][oldy];
masu[oldx-1][oldy] = 0;
Table(n);
}
break;
case 'K' : case 'k':
if(oldx < n ){
masu[oldx][oldy]= masu[oldx+1][oldy];
masu[oldx+1][oldy] = 0;
Table(n);
}
break;
case 'M' : case 'm':
if(oldy < n ){
masu[oldx][oldy]= masu[oldx][oldy+1];
masu[oldx][oldy+1] = 0;
Table(n);
}
break;
default:
break;
}
return 0;
}

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

Re: C言語で、簡単なゲーム作成をしているのですが、どこを直せばいいのかわかりません;;助けてください;;

#2

投稿記事 by バグ » 14年前

「Fisher-Yates法」で検索するといいですよ。
最短手順でムラなくシャッフルできます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C言語で、簡単なゲーム作成をしているのですが、どこを直せばいいのかわかりません;;助けてください;;

#3

投稿記事 by softya(ソフト屋) » 14年前

フォーラムルール全体を一度読んでいただいて、テンプレートを使って質問していただて良いですか?
gotoxy()とか10年以上前に使われていたDOS時代の関数が普通に出てくるので、 相当古い環境をお使いなのだと思います。

それとMH2さんとMHさんは同一の方でしょうか?
フォーラムルールにありますとおり、名前の統一をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る