C言語で、簡単なゲーム作成をしているのですが、どこを直せばいいのかわかりません;;助けてください;;
Posted: 2010年12月15日(水) 15:20
以下のものを、乱数などを使って表を十分にスクランブルし、ゲームが始められるようにしたいです。
行と行、列と列を混ぜ、最後に多少、乱数で混ぜて調整し、なるべく早くよく表が混ざるようにしたいです。
偶数回混ぜるようにすればよいということは聞いたのですが、混ぜ方がいまいちよくわかりません;;
どこをどう直せばよいのか教えてくださるとうれしいです;;
よろしくお願いします;;
#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;
}
行と行、列と列を混ぜ、最後に多少、乱数で混ぜて調整し、なるべく早くよく表が混ざるようにしたいです。
偶数回混ぜるようにすればよいということは聞いたのですが、混ぜ方がいまいちよくわかりません;;
どこをどう直せばよいのか教えてくださるとうれしいです;;
よろしくお願いします;;
#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;
}