//声明
#include<stdioh>

#include<stdlibh>
#include<timeh>
#include<conioh>
#include<windowsh>
#define SIZE 4
static int score=0;
void putn(int n[][SIZE]);
void getn(int n[][SIZE]);
int isempty(int n[][SIZE]);
int isfull(int n[][SIZE]);
void math(int n[][SIZE],char c);
void tow(int n[][SIZE]);
void toa(int n[][SIZE]);
void tos(int n[][SIZE]);
void tod(int n[][SIZE]);
//主函数
int main()
{
int i,j;
int n[SIZE][SIZE];
char c=' ';
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
n[i][j]=0;
}
}
printf( "n"
" 2048(%dX%d) n"
" control:W/A/S/D n"
"press any key to begin n"
"n",SIZE,SIZE);
getch();
system("cls");
//n[0][1]=2048;
//n[0][3]=2048;
while(1)
{
if(isempty(n))
getn(n);
putn(n);
if(!isempty(n)&&isfull(n))
break;
sleep(200);
c=getch();
while(c!='w'&&c!='a'&&c!='s'&&c!='d')
c=getch();
math(n,c);
system("cls");
}
printf(" Game Over!n",score);
return 0;
}
//函数
void putn(int n[][SIZE])
{
int i,j;
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
printf("| ");
printf("|n");
for(j=0;j<SIZE;j++)
{
if(n[i][j]==0)
printf("| ");
else
printf("|%4d ",n[i][j]);
}
printf("|n");
for(j=0;j<SIZE;j++)
printf("|_____");
printf("|n");
}
printf("score: %d",score);
}
void getn(int n[][SIZE])
{
int a,b;
a=rand()%SIZE;
b=rand()%SIZE;
while(n[a][b]!=0)
{
a=rand()%SIZE;
b=rand()%SIZE;
}
n[a][b]=2;
}
int isempty(int n[][SIZE])
{
int i,j,count=0;
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
if(n[i][j]==0)
count++;
return count;
}
int isfull(int n[][SIZE])
{
int i,j,count=0;
for(i=0;i<SIZE;i++)
{
for(j=1;j<SIZE-1;j++)
{
if(n[i][j]==n[i][j+1]||n[i][j]==n[i][j-1])
count++;
}
}
for(j=0;j<SIZE;j++)
{
for(i=1;i<SIZE-1;i++)
{
if(n[i][j]==n[i+1][j]||n[i][j]==n[i-1][j])
count++;
}
}
return count>00:1;
}
void math(int n[][SIZE],char c)
{
switch(c)
{
case 'w':tow(n);break;
case 'a':toa(n);break;
case 's':tos(n);break;
case 'd':tod(n);break;
default :;
}
}
void tow(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(j=0;j<SIZE;j++)
{
for(a=0;a<SIZE;a++)
{
for(i=0;i<SIZE-1;i++)
{
if(n[i][j]==0)
{
n[i][j]=n[i+1][j];
n[i+1][j]=0;
}
}
}
}
for(j=0;j<SIZE;j++)
{
for(a=0,i=0;i<SIZE;i++)
{
if(n[i][j]!=n[i+1][j]&&n[i][j]!=0||n[i][j]==2048)
{
m[a++]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i+1][j])
{
m[a++]=n[i][j]+n[i+1][j];
score+=m[a-1];
n[i][j]=0,n[i+1][j]=0;
}
}
for(i=0;i<SIZE;i++)
{
n[i][j]=m[i];
m[i]=0;
}
}
}
void toa(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(i=0;i<SIZE;i++)
{
for(a=0;a<SIZE;a++)
{
for(j=0;j<SIZE-1;j++)
{
if(n[i][j]==0)
{
n[i][j]=n[i][j+1];
n[i][j+1]=0;
}
}
}
}
for(i=0;i<SIZE;i++)
{
for(a=0,j=0;j<SIZE;j++)
{
if(n[i][j]!=n[i][j+1]&&n[i][j]!=0||n[i][j]==2048)
{
m[a++]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i][j+1])
{
m[a++]=n[i][j]+n[i][j+1];
score+=m[a-1];
n[i][j]=0,n[i][j+1]=0;
}
}
for(j=0;j<SIZE;j++)
{
n[i][j]=m[j];
m[j]=0;
}
}
}
void tos(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(j=SIZE-1;j>=0;j--)
{
for(a=SIZE-1;a>=0;a--)
{
for(i=SIZE-1;i>0;i--)
{
if(n[i][j]==0)
{
n[i][j]=n[i-1][j];
n[i-1][j]=0;
}
}
}
}
for(j=SIZE-1;j>=0;j--)
{
for(a=SIZE-1,i=SIZE-1;i>=0;i--)
{
if(n[i][j]!=n[i-1][j]&&n[i][j]!=0||n[i][j]==2048)
{
m[a--]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i-1][j])
{
m[a--]=n[i][j]+n[i-1][j];
score+=m[a+1];
n[i][j]=0,n[i-1][j]=0;
}
}
for(i=SIZE-1;i>=0;i--)
{
n[i][j]=m[i];
m[i]=0;
}
}
}
void tod(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(i=SIZE-1;i>=0;i--)
{
for(a=SIZE-1;a>=0;a--)
{
for(j=SIZE-1;j>0;j--)
{
if(n[i][j]==0)
{
n[i][j]=n[i][j-1];
n[i][j-1]=0;
}
}
}
}
for(i=SIZE-1;i>=0;i--)
{
for(a=SIZE-1,j=SIZE-1;j>=0;j--)
{
if(n[i][j]!=n[i][j-1]&&n[i][j]!=0||n[i][j]==2048)
{
m[a--]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i][j-1])
{
m[a--]=n[i][j]+n[i][j-1];
score+=m[a+1];
n[i][j]=0,n[i][j-1]=0;
}
}
for(j=SIZE-1;j>=0;j--)
{
n[i][j]=m[j];
m[j]=0;
}
}
}
需要注意的是:
srand((unsigned) time(0);rand();是固定形式,不要更改任何一个字符!
如果不能编译,请把sleep(200);注释掉,如果提示不能找到system("cls");请把system("cls")更换为clrscr()。
c语言中没有类,只有结构,也可以像类一样编写,用结构,但其成员都是公开访问的,C++才有真正的类。
用C语言编写贪吃蛇游戏的程序
我不是个做游戏的,但我是个玩游戏的。
C语言能用来做游戏吗 -> 能
我在网上看到了C语言的游戏源代码复制到VC++里执行都会报错不知道是怎么回事 -> 要具体问题具体分析,你可以看看都报什么错,针对性修改即可。
目前编程语言繁多,精通的话,绝大多数都能用来做游戏。推荐你先学好C,再根据之后的兴趣、发展、机会等等确定一门专攻语言。学会C,触类旁通,学其他语言就不是很费力了。
个人认为,编程语言只是一个次要方面(可能30%都不到),整个游戏的设计理念才是重点。你可能要用到文学、物理学、数学很多方面的知识,绝对不要死抠语言。比如一个游戏的人工智能,就是个很大的挑战。你可以自己看书,不必跟着老师走(只是跟着老师走会很惨),觉得要用什么就学什么,多用baidu、google。
可以用C语言编写游戏吗?
回答:Mremily
大师
6月3日 16:45 #define N 200
#include<graphicsh>
#include<stdlibh>
#include<dosh>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define Esc 0x011b
int i,key;
int score=0;
int gamespeed=50000;
struct Food
{int x;
int y;
int yes;
}food;
struct Snake
{int x[N];
int y[N];
int node;
int direction;
int life;
}snake;
void Init();
void Close();
void DrawK();
void GamePlay();
void GameOver();
void PrScore();
void main()
{ Init();
DrawK();
GamePlay();
Close();
}
void Init()
{int gd=DETECT,gm;
initgraph(&gd,&gm,"F:tuoboc2");/此处为turboc的路径,读者可以根据自己的电脑而改/
cleardevice();
}
void DrawK()
{setbkcolor(LIGHTGREEN);
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
for(i=50;i<=600;i+=10)
{rectangle(i,40,i+10,49);
rectangle(i,451,i+10,460);
}
for(i=40;i<=450;i+=10)
{rectangle(50,i,59,i+10);
rectangle(601,i,610,i+10);
}
}
void GamePlay()
{randomize();
foodyes=1;
snakelife=0;
snakedirection=1;
snakex[0]=100;snakey[0]=100;
snakex[1]=110;snakey[1]=100 ;
snakenode=2;
PrScore();
while(1)
{while(!kbhit())
{ if(foodyes==1)
{foodx=rand()%400+60;
foody=rand()%350+60;
while(foodx%10!=0)
foodx++;
while(foody%10!=0)
foody++;
foodyes=0;
}
if(foodyes==0)
{setcolor(GREEN);
rectangle(foodx,foody,foodx+10,foody-10);
}
for(i=snakenode-1;i>0;i--)
{snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}
switch(snakedirection)
{case 1:
snakex[0]+=10;break;
case 2:
snakex[0]-=10;break;
case 3:
snakey[0]-=10;break;
case 4:
snakey[0]+=10;break;
}
for(i=3;i<snakenode;i++)
{
if(snakex[i]==snakex[0]&&snakey[i]==snakey[0])
{ GameOver();
snakelife=1;
break;
}
}
if(snakex[0]<55||snakex[0]>595||snakey[0]<55||snakey[0]>455)
{GameOver();
snakelife=1;
}
if(snakelife==1)
break;
if(snakex[0]==foodx&&snakey[0]==foody)
{setcolor(0);
rectangle(foodx,foody,foodx+10,foody-10);
snakex[snakenode]=-20;
snakey[snakenode]=-20;
snakenode++;
foodyes=1;
score+=10;
PrScore();
}
setcolor(4);
for(i=0;i<snakenode;i++)
rectangle(snakex[i],snakey[i],snakex[i]+10,snakey[i]-10);
delay(gamespeed);
setcolor(0);
rectangle(snakex[snakenode-1],snakey[snakenode-1],snakex[snakenode-1]+10,snakey[snakenode-1]-10);
}
if(snakelife==1)
break;
key=bioskey(0);
if(key==Esc)
break;
else if(key==UP&&snakedirection!=4)
snakedirection=3;
else if(key==RIGHT&&snakedirection!=2)
snakedirection=1;
else if(key==LEFT&&snakedirection!=1)
snakedirection=2;
else if(key==DOWN&&snakedirection!=3)
snakedirection=4;
}
}
void GameOver()
{
cleardevice();
PrScore();

setcolor(RED);
settextstyle(3,0,4);
outtextxy(100,100,"Mengmeng,i love you!");
getch();
}
void PrScore()
{char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
void Close()
{ getch();
closegraph();
}
Mremily
用C语言编写的小游戏代码是什么?
可以用C语言编写游戏的。
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
用C语言编一个小游戏,注明编码,(简单易懂的游戏,不要复杂)
/也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++60、turbo)上都能运行,你还可以进一步改进。这是一个类似贪吃蛇的小游戏。祝你好运/x0d/贪吃蛇/x0d#includex0d#includex0d#includex0d#includex0dint head=3 ,tail=0;x0dint main()x0d{x0dint i,j,k=0;x0dint zuobiao[2][80];x0dlong start;x0dint direction=77;x0dint gamespeed;x0dint timeover;x0dint change(char qipan[20][80],int zuobiao[2][80],char direction);x0dzuobiao[0][tail]=1;zuobiao[1][tail]=1;zuobiao[0][1]=1;zuobiao[1][1]=2;zuobiao[0][2]=1;zuobiao[1][2]=3;zuobiao[0][head]=1;zuobiao[1][head]=4;x0d/处理棋盘/x0dchar qipan[20][80];//定义棋盘x0dfor(i=0;i for(j=0;jqipan[i][j]=' ';//初始化棋盘x0dfor(i=0;iqipan[0][i]='_';x0dfor(i=0;iqipan[i][0]='|';x0dfor(i=0;iqipan[i][79]='|';x0dfor(i=0;iqipan[19][i]='_';x0dqipan[1][1]=qipan[1][2]=qipan[1][3]='';//初始化蛇的位置x0dqipan[1][4]='#';x0dprintf("This is a game of a SNAKEnGOOD LUCK TO YOU !n");x0dprintf("Input your game speed,please(eg300)n");x0dscanf("%d",&gamespeed);x0dx0dwhile(direction!='q')x0d{x0dsystem("cls");x0dfor(i=0;ifor(j=0;jprintf("%c",qipan[i][j]);x0dtimeover=1;x0dstart=clock();x0dwhile(!kbhit()&&(timeover=clock()-startif(timeover)x0d{x0dgetch();x0ddirection=getch();x0d}x0delsex0ddirection=direction;x0dif(!(direction==72||direction==80||direction==75||direction==77))x0d{x0dreturn 0;x0dsystem("cls");x0dprintf("GAME OVER!n");x0d}x0dif(!change(qipan,zuobiao,direction))x0d{x0ddirection='q';x0dsystem("cls");x0dprintf("GAME OVER!n");x0d}x0d}x0dreturn 0;x0d}x0dint change(char qipan[20][80],int zuobiao[2][80],char direction)x0d{x0dint x,y;x0dif(direction==72)x0dx=zuobiao[0][head]-1;y=zuobiao[1][head];x0dif(direction==80)x0dx=zuobiao[0][head]+1;y=zuobiao[1][head];x0dif(direction==75)x0dx=zuobiao[0][head];y=zuobiao[0][head]-1;x0dif(direction==77)x0dx=zuobiao[0][head];y=zuobiao[1][head]+1;x0dif(x==0||x==18||y==78||y==0)x0dreturn 0;x0dif(qipan[x][y]!=' ')x0dreturn 0;x0dqipan[zuobiao[0][tail]][zuobiao[1][tail]]=' ';x0dtail=(tail+1)%80;x0dqipan[zuobiao[0][head]][zuobiao[1][head]]='';x0dhead=(head+1)%80;x0dzuobiao[0][head]=x;x0dzuobiao[1][head]=y;x0dqipan[zuobiao[0][head]][zuobiao[1][head]]='#';x0dreturn 1;x0d}
教你如何使用C语言编写简单小游戏
//C语言写的,一个玩石头、剪刀、布的小游戏。下面是源码。
#include<stdioh>
#include<stdlibh>
int main()
{
char cq[][10]={"石头","剪刀","布"};
int guess=-1,r,youwin=0,mewin=0,daping=0,total=0;
srand(time(NULL));
while(1)
{
r=(int)((rand()/(RAND_MAX+10))3);
printf("0、石头n1、剪刀n2、布n3、退出n我已出,请你出:");
scanf("%d",&guess);
if(3==guess)
{
break;
}
else
{
total++;
printf("这一次你出的是%s,我出的是%s,所以",cq[guess],cq[r]);
if(0==guess&&1==r || 1==guess&&2==r || 2==guess&&0==r)
{
youwin++;
printf("你赢了!n");
}
else if(guess==r)
{
daping++;
printf("我们打平了!n");
}
else
{
mewin++;
printf("我赢了!n");
}
}
}
printf("总共玩了%d次,你赢了%d次,我赢了%d次,打平%d次!n",total,youwin,mewin,daping);
system("PAUSE");
return EXIT_SUCCESS;
}
求一个用C语言编写的小游戏代码
爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础 学科一般来说,是比较枯燥的那么,我们能不能通过编一些小游戏来提高它的趣味性呢这样学习程序设计,就不会是一件艰苦 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣 1, 总是从Hello,world开始 学习编程的第一个程序,一般就是打印一个亲切的词语——"Hell o,world!"让我们来看看这个最简单的C程序:#incolude /把输入输出函数的头文件包含进来/int main(){printf("Hello, world!");/在屏幕上输出字符串"Hello,world!"/return 0;/退出main函数,并返回0/} 下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过 2,每执行这个程序一次都能看见上次运行留下的字符3,我们 还希望屏幕输出一个笑脸来欢迎我们 让我们来改进一下这个程序吧!1,在return语句的前面加一句:getch ();,表示按任意键结束2,在printf语句前用clrscr函数清屏,要使用这个函数和getch函数,需要在程序开头再包含头文件conioh3,ASCII码也有 许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可 以用printf("%c", 2)来输出一个笑脸 现在我们把Hello,world程序改成一个更好看的Hello,world了下面让我们开始做游戏吧! 2, 心动的开始,一个运动中的笑脸 大家小时侯喜欢看动画片吗哈哈,我猜你们都喜欢吧!下面就让我们来做一个小动画吧在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来先在程序定义一个在屏幕中运动的点的结构:struct move_point{ int x, y;/该点的位置,包括x坐标和y坐标/ int xv, yv;/该点在x轴,y轴的速度/};运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体让我们看到以下代码:gotoxy(manx, many);/把光标移到指定的坐标/printf(" ");/输出一个空格,把先前的字符擦去/然后我们让物体按其速度运动:manx += manxv;/水平方向按x轴的速度运动/many += manyv;/垂直方向按y轴的速度运动/运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让 它下一刻的速度等于现在的速度的相反数最后打印出这个笑脸:gotoxy(manx, many);printf("%cb", 2); /输出ASCII码值为2的"笑脸"字符/怎么样是不是很有趣呢不过这个笑脸一直是自己运动,能不能 让我们来控制它运动呢不过这个程序没有什么目的,也没有什么判断胜负的条件下面我们就利用这个能控制它移动的笑脸来做一个更有趣的游戏吧! 4, 在迷宫中探索 小时侯,我常在一些小人书和杂志上看见一些迷宫的游戏,非常喜欢玩,还常到一些书上找迷宫玩呢好的,现在我们用C语言来编个迷宫的游戏,重温一下童年的乐趣 首先,我们定义一个二维数组map,用它来保存迷宫的地图,其中map[x][y] == '#'表示在(x,y)坐标上的点是墙壁DrawMap函数在屏幕上输出迷宫的地图和一些欢迎信息在main函数里,我们定义了"小人"man的坐标和"目的地"des的 坐标在游戏循环中,我们增加了一些用来判断胜负的语句:if (manx == desx && many == desy) /如果人的坐标等于目的地的坐标/{ gotoxy(35, 3); printf("Ok! You win!"); /输出胜利信息/…}在判断按键时,如果玩家按的是方向键,我们还要先判断前面是不是有"墙壁",如果有的话,就不能往前移动了好的,我们在判断按键的switch语句的各个分支加上了判断语句,如下:if (map[…][…] == '#') break;/如果前面是墙壁,就不执行下去/哇噻!真棒,我们做出了一个完整的游戏了当然你还可以通过修改二维数组map来修改迷宫的地图,让它更有挑战性不过,我们要设计一个更好玩的游戏—— 5, 聪明的搬运工 大家一定玩过"搬运工"的游戏吧!这是在电脑和电子字典上较流行的益智游戏,让我们动手做一个属于自己的"搬运工"吧!程序依然用数组map来保存地图,数组元素如果为空格则表示什么也没有,'b'表示箱子,'#'表示墙壁,''表示目的地,'i'表示箱子在目的地我们以后每推一下箱子,不但要改变屏幕的显示,也要改变map相应元素的值游戏的主循环依然是接受按键当接收一个方向键,需要判断小人前面一格的状态,如果是空地或目的地,则人物可以直接移动;如果是墙壁,则不可移动;如果是箱子或目的地上的箱子,则需要继续判断箱子前面一格的状态:如果前一格是空地或目的地,则人推箱子前进,否则不可移动好的,我们在switch中增加了这些判断语句程序还有一个重要的功能就是判断胜利数组Des用来记录全部目的地的坐标,我们每执行一步操作后,程序就要通过Des数组判断这些目的地上是否都有箱子了真棒啊!我们可以做游戏了而且是一个老少皆宜,趣味十足的游戏呢!当然,我们可以通过修改map数组来制作不同的游戏地图,我们还可以相互分享好的游戏地图呢 尾声: 在C++等高级语言还没出来的时候,很多应用程序也是C语言开发的C语言在与硬件联系紧密的编程中,也占有重要地位其实我觉得学习编程,可以通过一些小游戏,实用的例子来学习象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的曲子而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就有成就感,让你很快就能卖弄出来在别人面前表现自己了通过编游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方法 好了,编游戏就这么简单,希望大家也尝试用C语言或其他的语言来做几个自己喜欢的小游戏
#include <graphicsh>
#include <conioh>
#include <timeh>
/////////////////////////////////////////////
// 定义常量、枚举量、结构体、全局变量
/////////////////////////////////////////////
#define WIDTH 10 // 游戏区宽度
#define HEIGHT 22 // 游戏区高度
#define SIZE 20 // 每个游戏区单位的实际像素
// 定义操作类型
enum CMD
{
CMD_ROTATE, // 方块旋转
CMD_LEFT, CMD_RIGHT, CMD_DOWN, // 方块左、右、下移动
CMD_SINK, // 方块沉底
CMD_QUIT // 退出游戏
};
// 定义绘制方块的方法
enum DRAW
{
SHOW, // 显示方块
HIDE, // 隐藏方块
FIX // 固定方块
};
// 定义七种俄罗斯方块
struct BLOCK
{
WORD dir[4]; // 方块的四个旋转状态
COLORREF color; // 方块的颜色
} g_Blocks[7] = { {0x0F00, 0x4444, 0x0F00, 0x4444, RED}, // I
{0x0660, 0x0660, 0x0660, 0x0660, BLUE}, // 口
{0x4460, 0x02E0, 0x0622, 0x0740, MAGENTA}, // L
{0x2260, 0x0E20, 0x0644, 0x0470, YELLOW}, // 反L
{0x0C60, 0x2640, 0x0C60, 0x2640, CYAN}, // Z
{0x0360, 0x4620, 0x0360, 0x4620, GREEN}, // 反Z
{0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN}}; // T
// 定义当前方块、下一个方块的信息
struct BLOCKINFO
{
byte id; // 方块 ID
char x, y; // 方块在游戏区中的坐标
byte dir:2; // 方向
} g_CurBlock, g_NextBlock;
// 定义游戏区
BYTE g_World[WIDTH][HEIGHT] = {0};
/////////////////////////////////////////////
// 函数声明
/////////////////////////////////////////////
void Init(); // 初始化游戏
void Quit(); // 退出游戏
void NewGame(); // 开始新游戏
void GameOver(); // 结束游戏
CMD GetCmd(); // 获取控制命令
void DispatchCmd(CMD _cmd); // 分发控制命令
void NewBlock(); // 生成新的方块
bool CheckBlock(BLOCKINFO _block); // 检测指定方块是否可以放下
void DrawBlock(BLOCKINFO _block, DRAW _draw = SHOW); // 画方块
void onRotate(); // 旋转方块
void OnLeft(); // 左移方块
void OnRight(); // 右移方块
void onDown(); // 下移方块
void onSink(); // 沉底方块
/////////////////////////////////////////////
// 函数定义
/////////////////////////////////////////////
// 主函数
void main()
{
Init();
CMD c;
while(true)
{
c = GetCmd();
DispatchCmd(c);
// 按退出时,显示对话框咨询用户是否退出
if (c == CMD_QUIT)
{
HWND wnd = GetHWnd();
if (MessageBox(wnd, _T("您要退出游戏吗?"), _T("提醒"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
Quit();
}
}
}
// 初始化游戏
void Init()
{
initgraph(640, 480);
srand((unsigned)time(NULL));
// 显示操作说明
setfont(14, 0, _T("宋体"));
outtextxy(20, 330, _T("操作说明"));
outtextxy(20, 350, _T("上:旋转"));
outtextxy(20, 370, _T("左:左移"));
outtextxy(20, 390, _T("右:右移"));
outtextxy(20, 410, _T("下:下移"));
outtextxy(20, 430, _T("空格:沉底"));
outtextxy(20, 450, _T("ESC:退出"));
// 设置坐标原点
setorigin(220, 20);
// 绘制游戏区边界
rectangle(-1, -1, WIDTH SIZE, HEIGHT SIZE);
rectangle((WIDTH + 1) SIZE - 1, -1, (WIDTH + 5) SIZE, 4 SIZE);
// 开始新游戏
NewGame();
}
// 退出游戏
void Quit()
{
closegraph();
exit(0);
}
// 开始新游戏
void NewGame()
{
// 清空游戏区
setfillstyle(BLACK);
bar(0, 0, WIDTH SIZE - 1, HEIGHT SIZE - 1);
ZeroMemory(g_World, WIDTH HEIGHT);
// 生成下一个方块
g_NextBlockid = rand() % 7;
g_NextBlockdir = rand() % 4;
g_NextBlockx = WIDTH + 1;
g_NextBlocky = HEIGHT - 1;
// 获取新方块
NewBlock();
}
// 结束游戏
void GameOver()
{
HWND wnd = GetHWnd();
if (MessageBox(wnd, _T("游戏结束。n您想重新来一局吗?"), _T("游戏结束"), MB_YESNO | MB_ICONQUESTION) == IDYES)
NewGame();
else
Quit();
}
// 获取控制命令
DWORD m_oldtime;
CMD GetCmd()
{
// 获取控制值
while(true)
{
// 如果超时,自动下落一格
DWORD newtime = GetTickCount();
if (newtime - m_oldtime >= 500)
{
m_oldtime = newtime;
return CMD_DOWN;
}
// 如果有按键,返回按键对应的功能
if (kbhit())
{
switch(getch())
{
case 'w':
case 'W': return CMD_ROTATE;
case 'a':
case 'A': return CMD_LEFT;
case 'd':
case 'D': return CMD_RIGHT;
case 's':
case 'S': return CMD_DOWN;
case 27: return CMD_QUIT;
case ' ': return CMD_SINK;
case 0:
case 0xE0:
switch(getch())
{
case 72: return CMD_ROTATE;
case 75: return CMD_LEFT;
case 77: return CMD_RIGHT;
case 80: return CMD_DOWN;
}
}
}
// 延时 (降低 CPU 占用率)
Sleep(20);
}
}
// 分发控制命令
void DispatchCmd(CMD _cmd)
{
switch(_cmd)
{
case CMD_ROTATE: onRotate(); break;
case CMD_LEFT: OnLeft(); break;
case CMD_RIGHT: OnRight(); break;
case CMD_DOWN: onDown(); break;
case CMD_SINK: onSink(); break;
case CMD_QUIT: break;
}
}
// 生成新的方块
void NewBlock()
{
g_CurBlockid = g_NextBlockid, g_NextBlockid = rand() % 7;
g_CurBlockdir = g_NextBlockdir, g_NextBlockdir = rand() % 4;
g_CurBlockx = (WIDTH - 4) / 2;
g_CurBlocky = HEIGHT + 2;
// 下移新方块直到有局部显示
WORD c = g_Blocks[g_CurBlockid]dir[g_CurBlockdir];
while((c & 0xF) == 0)
{
g_CurBlocky--;
c >>= 4;
}
// 绘制新方块
DrawBlock(g_CurBlock);
// 绘制下一个方块
setfillstyle(BLACK);
bar((WIDTH + 1) SIZE, 0, (WIDTH + 5) SIZE - 1, 4 SIZE - 1);
DrawBlock(g_NextBlock);
// 设置计时器,用于判断自动下落
m_oldtime = GetTickCount();
}
// 画方块
void DrawBlock(BLOCKINFO _block, DRAW _draw)
{
WORD b = g_Blocks[_blockid]dir[_blockdir];
int x, y;
int color = BLACK;
switch(_draw)
{
case SHOW: color = g_Blocks[_blockid]color; break;
case HIDE: color = BLACK; break;
case FIX: color = g_Blocks[_blockid]color / 3; break;
}
setfillstyle(color);
for(int i=0; i<16; i++)
{
if (b & 0x8000)
{
x = _blockx + i % 4;
y = _blocky - i / 4;
if (y < HEIGHT)
{
if (_draw != HIDE)
bar3d(x SIZE + 2, (HEIGHT - y - 1) SIZE + 2, (x + 1) SIZE - 4, (HEIGHT - y) SIZE - 4, 3, true);
else
bar(x SIZE, (HEIGHT - y - 1) SIZE, (x + 1) SIZE - 1, (HEIGHT - y) SIZE - 1);
}
}
b <<= 1;
}
}
// 检测指定方块是否可以放下
bool CheckBlock(BLOCKINFO _block)
{
WORD b = g_Blocks[_blockid]dir[_blockdir];
int x, y;
for(int i=0; i<16; i++)
{
if (b & 0x8000)
{
x = _blockx + i % 4;
y = _blocky - i / 4;
if ((x < 0) || (x >= WIDTH) || (y < 0))
return false;
if ((y < HEIGHT) && (g_World[x][y]))
return false;
}
b <<= 1;
}
return true;
}
// 旋转方块
void onRotate()
{
// 获取可以旋转的 x 偏移量
int dx;
BLOCKINFO tmp = g_CurBlock;
tmpdir++; if (CheckBlock(tmp)) { dx = 0; goto rotate; }
tmpx = g_CurBlockx - 1; if (CheckBlock(tmp)) { dx = -1; goto rotate; }
tmpx = g_CurBlockx + 1; if (CheckBlock(tmp)) { dx = 1; goto rotate; }
tmpx = g_CurBlockx - 2; if (CheckBlock(tmp)) { dx = -2; goto rotate; }
tmpx = g_CurBlockx + 2; if (CheckBlock(tmp)) { dx = 2; goto rotate; }
return;
rotate:
// 旋转
DrawBlock(g_CurBlock, HIDE);
g_CurBlockdir++;
g_CurBlockx += dx;
DrawBlock(g_CurBlock);
}
// 左移方块
void OnLeft()
{
BLOCKINFO tmp = g_CurBlock;
tmpx--;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlockx--;
DrawBlock(g_CurBlock);
}
}
// 右移方块
void OnRight()
{
BLOCKINFO tmp = g_CurBlock;
tmpx++;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlockx++;
DrawBlock(g_CurBlock);
}
}
// 下移方块
void onDown()
{
BLOCKINFO tmp = g_CurBlock;
tmpy--;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlocky--;
DrawBlock(g_CurBlock);
}
else
onSink(); // 不可下移时,执行“沉底方块”操作
}
// 沉底方块
void onSink()
{
int i, x, y;
// 连续下移方块
DrawBlock(g_CurBlock, HIDE);
BLOCKINFO tmp = g_CurBlock;
tmpy--;
while (CheckBlock(tmp))
{
g_CurBlocky--;
tmpy--;
}
DrawBlock(g_CurBlock, FIX);
// 固定方块在游戏区
WORD b = g_Blocks[g_CurBlockid]dir[g_CurBlockdir];
for(i = 0; i < 16; i++)
{
if (b & 0x8000)
{
if (g_CurBlocky - i / 4 >= HEIGHT)
{ // 如果方块的固定位置超出高度,结束游戏
GameOver();
return;
}
else
g_World[g_CurBlockx + i % 4][g_CurBlocky - i / 4] = 1;
}
b <<= 1;
}
// 检查是否需要消掉行,并标记
int row[4] = {0};
bool bRow = false;
for(y = g_CurBlocky; y >= max(g_CurBlocky - 3, 0); y--)
{
i = 0;
for(x = 0; x < WIDTH; x++)
if (g_World[x][y] == 1)
i++;
if (i == WIDTH)
{
bRow = true;
row[g_CurBlocky - y] = 1;
setfillstyle(WHITE, DIAGCROSS2_FILL);
bar(0, (HEIGHT - y - 1) SIZE + SIZE / 2 - 2, WIDTH SIZE - 1, (HEIGHT - y - 1) SIZE + SIZE / 2 + 2);
}
}
if (bRow)
{
// 延时 200 毫秒
Sleep(200);
// 擦掉刚才标记的行
IMAGE img;
for(i = 0; i < 4; i++)
{
if (row[i])
{
for(y = g_CurBlocky - i + 1; y < HEIGHT; y++)
for(x = 0; x < WIDTH; x++)
{
g_World[x][y - 1] = g_World[x][y];
g_World[x][y] = 0;
}
getimage(&img, 0, 0, WIDTH SIZE, (HEIGHT - (g_CurBlocky - i + 1)) SIZE);
putimage(0, SIZE, &img);
}

}
}
// 产生新方块
NewBlock();
}


