C++は、テトリスのソースコードを実現します。
本論文の例では、C++を共有して、テトリスの具体的なコードを実現します。参考にしてください。具体的な内容は以下の通りです。
まず効果図です
メインメニュー:
ゲーム:
設定:
エラー処理:
コード:
まず効果図です
メインメニュー:
ゲーム:
設定:
エラー処理:
コード:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <fstream.h>
#include <time.h>
#include <cstring>
#pragma comment( lib,"winmm.lib" )
//
//
#define NO 0
#define SQR 1
//
#define OK 0
#define CANTMOVE 1
//
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
//
#define no_enough_memory 0
#define set_no_found 1
#define dat_no_found 2
#define error_argument 3
//
//
void play();//
void sets();//
void highscores();//
void copyright();//
//
void mapsetup();//
bool newsqr();// ,
int move(int direction);// ,
void movetomap();//
int wholeline();// , ,-1
void deleteline(int which);//
void endup();// ,
//
void show();//
void showmenu(char* menu);//
//
void loadset();//
void saveset();//
void loadhs();//
bool addscores(int score,char name[50]);// ,
void savehs();//
//
int get(int x,int y);
void set(int x,int y,int date);
//
//
struct{
int xs,ys;//
int speed;//
char sqr[3],no[3],frame[3];// 、 、
}gameset;
//
struct{
char name[50];
int score;
}rating[10];
//
//
int* map=NULL;//
bool now[4][4];//
int xnow,ynow;//
int guide;//
//
const bool shap[7][4][4]={//
{\
0,0,0,0,\
0,0,0,0,\
1,1,1,1,\
0,0,0,0,\
},\
{\
0,0,0,0,\
0,1,1,0,\
0,1,1,0,\
0,0,0,0,\
},\
{\
0,0,0,0,\
0,1,1,1,\
0,0,1,0,\
0,0,0,0,\
},\
{\
0,0,0,0,\
1,0,0,0,\
1,1,1,0,\
0,0,0,0,\
},\
{\
0,0,0,0,\
0,0,0,1,\
0,1,1,1,\
0,0,0,0,\
},\
{\
0,1,0,0,\
0,1,1,0,\
0,0,1,0,\
0,0,0,0,\
},\
{\
0,0,1,0,\
0,1,1,0,\
0,1,0,0,\
0,0,0,0,\
}\
};
const char errword[4][50]={" "," set.ini"," highscore.dat"," "};
//
HANDLE hout;//
COORD curpos={0,0};//
//
int main()
{
start1:
try
{
hout = GetStdHandle(STD_OUTPUT_HANDLE);// ,
srand(time(0));//
loadset();//
loadhs();
start2:
while(1)
{
showmenu("
:
1.
2.
3.
4.
5.
");
switch(getch())
{
case '1':
system("cls");//play ,
play();
break;
case '2':
sets();
break;
case '3':
highscores();
break;
case '4':
copyright();
break;
case '5':
savehs();//
saveset();
return 0;
}
}
}
catch(int errnum)//
{
system("cls");
printf("o(>n<)o !
, :%d(%s)
。
",errnum,errword[errnum]);
printf("
:
1.
2.
3.
4.
");
switch(getch())
{
case '1':
goto start1;
case '2':
gameset.xs=20;
gameset.ys=20;
gameset.speed=100;
strcpy(gameset.sqr,"[]");//
strcpy(gameset.no," ");
strcpy(gameset.frame,"::");
int i;
for(i=0;i<10;i++)
strcpy(rating[i].name," "),rating[i].score=0;
goto start2;
case '3':
{
ofstream fout;
fout.open("set.ini");
fout<<"20
20
100[]
::
";
fout.close();
fout.clear();
fout.open("highscore.dat");
int j;
for(j=0;j<10;j++)
fout<<"
0
";
goto start1;
}
default:
return -1;//
}
}
return 0;
}
void play()
{
mapsetup();//
/*for(int i=0;i<20;i++)
set(i,19,SQR);*/
while(newsqr())// , NO
{
while(move(DOWN)!=CANTMOVE)// ,
{
guide+=1;// 1
show();//
while(kbhit())// ,
{
switch(getch())//
{
case 'w':
move(UP);
break;
case 's':
move(DOWN);
break;
case 'a':
move(LEFT);
break;
case 'd':
move(RIGHT);
break;
}
}
Sleep(gameset.speed);//
}
movetomap();// ,
int line;
while((line=wholeline())!=-1);// ,
deleteline(line);//
}
endup();// ,
return;//
}
//
void mapsetup()
{
map=new int[gameset.xs*gameset.ys];//
if(!map)// 0
throw no_enough_memory;//
//
int i,j;
for(i=0;i<gameset.xs;i++)
{
for(j=0;j<gameset.ys;j++)
{
set(i,j,NO);
}
}
guide=0;//
return;
}
int get(int x,int y)
{
if(y<0)//
return NO;
if(x>=0&&x<gameset.xs&&y>=0&&y<gameset.ys)//
return *(map+y*gameset.xs+x);//
else
return SQR;//
}
void set(int x,int y,int date)
{
if(x>=0&&x<gameset.xs&&y>=0&&y<gameset.ys)//if(x>0&&x<gameset.xs&&y>0&&y<gameset.ys)//
*(map+y*gameset.xs+x)=date;//
return;
}
bool newsqr(){
int i,j;
for(i=0;i<4;i++)//
if(get(gameset.xs/2+i,0)==SQR)
return false;// ,
int which=rand()%7;//
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
now[i][j]=shap[which][i][j];//
}
}
for(i=rand()%4;i>0;i--)// 0-3
move(UP);
xnow=gameset.xs/2;//
ynow=-4;
return true;
}
int move(int direction){
int x,y;//
int i,j;
switch(direction)
{
case UP://
bool newshap[4][4];//
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
newshap[i][j]=now[j][3-i];//
}
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(newshap[i][j]==true&&get(xnow+i,ynow+j)==SQR)//
return CANTMOVE;//
}
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
now[i][j]=newshap[i][j];// ,
}
}
return OK;
case DOWN:// ,
x=0,y=1;
break;
case LEFT:
x=-1;y=0;
break;
case RIGHT:
x=1,y=0;
break;
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(now[i][j]==true&&get(i+x+xnow,j+y+ynow)==SQR)// ( get SQR, )//if(get(i+x,j+y)==SQR)//if(now[i+x][j+y]==SQR)
{
return CANTMOVE;//
}
}
}
xnow+=x;// ,
ynow+=y;
return OK;
}
void movetomap(){
guide+=10;// , 10
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(now[i][j]==true)
set(xnow+i,ynow+j,SQR);//
}
}
return;
}
int wholeline(){
int i,j;
bool whole;//
for(j=0;j<gameset.ys;j++)//for(i=0;i<gameset.ys;i++)
{
whole=true;//
for(i=0;i<gameset.xs;i++)//for(j=0;j<gameset.xs;j++)
{
if(get(i,j)==NO)
whole=false;// ,
}
if(whole)
return j;// ,
}
return -1;// ,
}
void deleteline(int which){
int i,j;
guide+=1000;// ,
for(i=which;i>=0;i--)
{
for(j=0;j<gameset.xs;j++)
{
set(j,i,get(j,i-1));// , 。 ,
}
}
return;
}
void endup(){
delete map;//
system("cls");
while(kbhit())//
getchar();
showmenu(" , :");
char name[50]="noname";
scanf("%s",&name[0]);//
char word[1000];//
sprintf(&word[0]," !
(%s) :%d
%s
・・・
",name,guide,((addscores(guide,name))?" ":" "));
showmenu(&word[0]);
getch();
highscores();//
savehs();//
return;
}
void show(){
int i,j;
SetConsoleCursorPosition(hout,curpos);//system("cls");// ,
printf(" :%d
",guide);
for(i=0;i<gameset.xs+2;i++)//
printf(gameset.frame);
printf("
");
for(j=0;j<gameset.ys;j++)
{
printf(gameset.frame);//
for(i=0;i<gameset.xs;i++)
{
if(i>=xnow&&i<(xnow+4)&&j>=ynow&&j<(ynow+4))//if(i>=xnow&&i<(xnow+1)&&j>=ynow&&j<(ynow+1))//
{
if(now[i-xnow][j-ynow]==true)//
printf(gameset.sqr);
else if(get(i,j)==SQR)//
printf(gameset.sqr);
else// ,
printf(gameset.no);
}
else// ,
{
if(get(i,j)==SQR)//
printf(gameset.sqr);
else// ,
printf(gameset.no);
}
}
printf("::
");//
}
for(i=0;i<gameset.xs+2;i++)//
printf(gameset.frame);
printf("
");
return;
}
void showmenu(char* menu)
{
int i,j;
char output[100];//
system("cls");
for(i=0;i<gameset.xs;i++)
printf(gameset.frame);//
printf("
");
i=0,j=0;
while(*menu!='\0')
{
printf(gameset.frame);//
for(i=0,j=0;*(menu+i)!='
'&&*(menu+i)!='\0';i++,j++)//
{
if(*(menu+i)=='\t')// , 6
{
for(;j%6!=5;j++)
output[j]=gameset.no[0];
j--;
}
else
output[j]=*(menu+i);//
}
menu=menu+i+1;//
for(;j<gameset.xs*2-6;j++)//
output[j]=gameset.no[0];
output[j]='\0';//
printf(gameset.no);// ,
printf(output);//
printf(gameset.frame);//
printf("
");//
Sleep(100);// ,
}
for(i=0;i<gameset.xs;i++)
printf(gameset.frame);//
printf("
");
return;
}
void sets()
{
char word[1000];//
while(1)
{// '\'
sprintf(&word[0],"\
\
:
\
:
\
\t1. :%d
\
\t2. :%d
\
:
\
\t3. :%d
\
:
\
\t4. :\"%s\"
\
\t5. :\"%s\"
\
\t6. :\"%s\"
\
7.
\
",gameset.xs,gameset.ys,gameset.speed,gameset.sqr,gameset.no,gameset.frame);
showmenu(&word[0]);
char choice=getch();
showmenu(" :");//
switch(choice)//
{
case '1':
scanf("%d",&gameset.xs);
if(gameset.xs<15||gameset.xs>70)
throw error_argument;
break;
case '2':
scanf("%d",&gameset.ys);
if(gameset.ys<15||gameset.ys>70)
throw error_argument;
break;
case '3':
scanf("%d",&gameset.speed);
if(gameset.speed<0)
throw error_argument;
break;
case '4':
cin.getline(&gameset.sqr[0],3);//scanf("%s",&gameset.sqr[0]);
cout<<endl;
//gameset.sqr[3]='\0';
break;
case '5':
cin.getline(&gameset.no[0],3);//scanf("%s",&gameset.no[0]);
cout<<endl;
//gameset.no[3]='\0';
break;
case '6':
cin.getline(&gameset.frame[0],3);//scanf("%s",&gameset.frame[0]);
cout<<endl;
//gameset.frame[3]='\0';
break;
case '7':
saveset();//
return;
}
}
}
void highscores()
{
int i;
char word[1000]="
\t \t
\0";//
for(i=0;i<10;i++)
{
sprintf(&word[0],"%s%d\t%s\t%d
",&word[0],i+1,rating[i].name,rating[i].score);//
}
sprintf(&word[0],"%s ・・・
",&word[0]);//
showmenu(&word[0]);
getch();//
return;
}
void copyright()
{
showmenu("\
a,s,d,w ,
\
a,s,d
\
,
\
w
\
\
\
\
・・・
\
");
getch();
return;
}
void loadset()
{
ifstream fin;
fin.open("set.ini",ios::in|ios::nocreate);//
if(!fin)
throw set_no_found;
fin>>gameset.xs>>gameset.ys>>gameset.speed;
fin.getline(gameset.sqr,4);// ,
fin.getline(gameset.no,4);
fin.getline(gameset.frame,4);
return;
}
void saveset()
{
ofstream fout;//
fout.open("set.ini",ifstream::out|ios::nocreate);
if(!fout)
throw set_no_found;
fout<<gameset.xs<<'
'<<gameset.ys<<'
'<<gameset.speed<<gameset.sqr<<'
'<<gameset.no<<'
'<<gameset.frame<<'
';
return;
}
void loadhs()
{
int i;
ifstream fin;
fin.open("highscore.dat",ifstream::in|ios::nocreate);// ,
if(!fin)//
throw dat_no_found;
for(i=0;i<10;i++)//
fin>>rating[i].name>>rating[i].score;
return;
}
bool addscores(int score,char name[50])
{
int i,j;
for(i=0;i<10;i++)//
{
if(rating[i].score<score)//
{
for(j=9;j>i;j--)//
{
for(int k=0;k<50;k++)
rating[j].name[k]=rating[j-1].name[k];
rating[j].score=rating[j-1].score;
}
rating[i].score=score;//
strcpy(rating[i].name,name);
return true;//
}
}
return false;//
}
void savehs()
{
int i;
ofstream fout;
fout.open("highscore.dat",ifstream::out|ios::nocreate);
if(!fout)
throw dat_no_found;
for(i=0;i<10;i++)
fout<<rating[i].name<<'
'<<rating[i].score<<'
';
return;
}
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。