看这个文章的筒子们应该都是80、90后的比较多,也不排除70或者00后。
回想起小时候玩过的游戏有贪吃蛇、坦克大战、扫雷等这些都是我们小时候的高级游戏,那时候我们都不知道这个游戏是怎么来的,就知道家里人给买了小霸王那高兴的劲儿呀~~现在那个小霸王的配音我都还记得~~
现在我们的游戏也比较高级了,比如说魔兽、LOL、CF等
那么大家都知道这些大型游戏都是用什么?
据我所知,客户端的应该都是.net程序,基层都会用到C/C++开发,c语言可以写很多方面的程序,但是C++可以写的更好,C++对可以自动生成你想要的程序结构使你可以省了很多时间。有很多可用的工具如加入MFC中的类的时候,加入变量的时候等等。C++中的附加工具也有很多,可以进行系统的分析,可以查看API;可以查看控件。所以这也是本小编一直在追求C/C++的原因。
代码献上、请收下贪吃蛇:
#includestdio.h
#includewindows.h
#defineFrameX4//游戏窗口左上角的X轴坐标
#defineFrameY4//游戏窗口左上角的Y轴坐标
#defineFrame_height20//游戏窗口的高度
#defineFrame_width20//游戏窗口的宽度
inti;
inta[2];//用来记住蛇尾的坐标,其中a[0]、a[1]分别表示横、竖坐标
//声明蛇的结构体
structSnake
{
intx[];//蛇的横坐标
inty[];//蛇的竖坐标
intlength;//蛇的长度
intspeed;//蛇的速度
};
//光标移动指定的位置
voidGamePosition(HANDLEg_hout,intx,inty)
{
COORDpos;//表示一个字符在控制台屏幕上的坐标
pos.X=x;//横坐标
pos.Y=y;//纵坐标
SetConsoleCursorPosition(g_hout,pos);//光标设置到屏幕上
}
//初始化蛇
voidinit_snake(structSnake*snake)
{
snake-x[0]=FrameX+2;//初始化蛇的横坐标
snake-y[0]=FrameY+Frame_height/2;//初始化蛇的纵坐标
snake-length=3;//初始化蛇的长度
snake-speed=;//初始化蛇的速度
for(i=1;isnake-length;i++)
{//依次得到蛇身、蛇头的坐标
snake-x[i]=snake-x[i-1]+2;
snake-y[i]=snake-y[i-1];
}
}
//移动蛇
voidmove_snake(HANDLEhout,structSnake*snake)
{
GamePosition(hout,snake-x[0],snake-y[0]);
printf("");//清除蛇尾
for(i=1;isnake-length;i++)
{//后一节的坐标依次取代前一节坐标
snake-x[i-1]=snake-x[i];
snake-y[i-1]=snake-y[i];
}
}
//打印蛇
voidshow_snake(HANDLEhout,structSnake*snake)
{
for(i=0;isnake-length;i++)
{
GamePosition(hout,snake-x[i],snake-y[i]);
if(i==0)//■◎
printf("□");//打印蛇尾
elseif(i==snake-length-1)
printf("◎");//打印蛇头
else
printf("■");//打印蛇身
}
}
//开始游戏
voidstart_game()
{
unsignedcharch=77;//定义用户接收键盘输入的字符变量
HANDLEhout=GetStdHandle(STD_OUTPUT_HANDLE);
structSnakes,*snake=s;//定义蛇的结构体指针并指向蛇的结构体
init_snake(snake);
while(1)
{
a[0]=snake-x[0];
a[0]=snake-y[0];
ch=getch();
switch(ch)
{
case72://向上移动
move_snake(hout,snake);
snake-y[snake-length-1]-=1;//蛇头的竖坐标向上移,即减1
break;
case80://向下移动
move_snake(hout,snake);
snake-y[snake-length-1]+=1;//蛇头的竖坐标向下移,即加1
break;
case75://向左移动
move_snake(hout,snake);
snake-x[snake-length-1]-=2;//蛇头的横坐标向左移,即减2
break;
case77://向右移动
move_snake(hout,snake);
snake-x[snake-length-1]+=2;//蛇头的横坐标向右移,即加2
break;
}
show_snake(hout,snake);//打印蛇
}
}
intmain()
{
start_game();
return0;
}
坦克大战:
#includeiostream
#includestdlib.h
#includetchar.h
#includeWindows.h
#includetime.h
#includeconio.h
usingnamespacestd;
HANDLEMutex=CreateMutex(NULL,FALSE,NULL);//互斥对象
intGameOver=0;
intlevel=0;
intmap[23][23];
//坦克种类,Normal为玩家坦克
#defineNormal0
#defineRed1
#defineBlue2
#defineGreen3
//方向的宏定义
#defineUp0
#defineDown1
#defineLeft2
#defineRight3
//地图标记的宏定义
#defineEmpty0
#definePlayer1
#definePlayerBullet2
#defineEnemyBullet3
#defineEnemy4
intKill;
intKillRed;
intKillGreen;
intEnemyExist;
voidSetPos(inti,intj)//设定光标位置
{
COORDpos={i,j};
HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(Out,pos);
}
voidHideCurSor(void)//隐藏光标
{
CONSOLE_CURSOR_INFOinfo={1,0};
HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(Out,info);
}
intsharp[4][12]=
{
{0,1,1,0,1,1,1,2,2,0,2,2},
{0,0,0,2,1,0,1,1,1,2,2,1},
{0,1,0,2,1,0,1,1,2,1,2,2},
{0,0,0,1,1,1,1,2,2,0,2,1},
};//此数组用来保存坦克各个方向的形状信息
DWORDWINAPIBulletfly(LPVOIDlpParameter);//子弹函数申明
voidUpdata();//更新界面信息函数申明
classTank//坦克类
{
private:
intDirection;//方向
inthotpoint[2];//活动点
intSpeed;//速度
intFirePower;//火力
public:
Tank(intdir,inthot1,inthot2,inttyp,intspe,intfirepow)//构造函数
{
Direction=dir;
hotpoint[0]=hot1;
hotpoint[1]=hot2;
Type=typ;
Speed=spe;
FirePower=firepow;
}
intType;//坦克的种类(详见宏定义)
intID;//坦克在MAP中的标记(详见宏定义)
intFireEnable;//是否可以开火
intLife;//生命值
voidRunning();//运行函数
intJudge(intx,inty,intID);//判断是否可以绘制坦克
voidDrawTank();//重绘坦克
voidRedraw();//擦除坦克
intGetSpeed()//获取速度
{
returnSpeed;
}
intGetFire()//获取火力
{
returnFirePower;
}
intGetDirection()//获取方向
{
returnDirection;
}
intGetHotX()//获取活动点坐标
{
returnhotpoint[0];
}
intGetHotY()
{
returnhotpoint[1];
}
voidIncreaseFire()//火力+
{
FirePower++;
}
voidIncreaseSpeed()//速度+
{
Speed++;
}
voidChangeDirection(intnewD)//改变方向
{
Direction=newD;
}
voidChangePos(intx,inty)//改变活动点
{
hotpoint[0]=x;
hotpoint[1]=y;
}
};
Tankplayer(Right,0,0,Normal,1,1);//玩家
Tankenemy(Left,20,0,Red,1,1);//敌人
voidTank::DrawTank()//绘制坦克
{
inti;
intnx,ny;
if(Type==Red)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_RED);
elseif(Type==Blue)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_BLUE);
elseif(Type==Green)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_GREEN);
elseif(Type==Normal)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_RED
FOREGROUND_GREEN
FOREGROUND_BLUE);
for(i=0;i6;i++)
{
nx=hotpoint[0]+sharp[Direction][i*2];
ny=hotpoint[1]+sharp[Direction][i*2+1];
SetPos((ny+1)*2,nx+1);//利用sharp数组相对于点x,y绘制形状
map[nx][ny]=ID;
cout"■";
}
}
voidTank::Redraw()//擦除坦克,原理同上
{
inti;
intnx,ny;
for(i=0;i6;i++)
{
nx=hotpoint[0]+sharp[Direction][i*2];
ny=hotpoint[1]+sharp[Direction][i*2+1];
map[nx][ny]=Empty;
SetPos((ny+1)*2,nx+1);
cout"";
}
}
intTank::Judge(intx,inty,intdir)//判断当前是否可以绘制坦克
{
inti;
intnx,ny;
for(i=0;i6;i++)
{
nx=x+sharp[dir][i*2];
ny=y+sharp[dir][i*2+1];
if(nx0
nx=23
ny0
ny=23
map[nx][ny]!=Empty)//不能绘制,返回1
return1;
}
return0;
}
voidTank::Running()//坦克运行函数
{
intnewD;
//坦克的运行
while(1)
{
if(Life==0)
{
EnemyExist=0;//敌人不存在
return;
}
if(GameOver==1)
return;
if(FireEnable==1GameOver==0)//如果可以开火
{
WaitForSingleObject(Mutex,INFINITE);//线程拥有互斥对象
FireEnable=0;//设为不可开火
HANDLEbullet=CreateThread(NULL,0,Bulletfly,ID,0,NULL);//创建子弹线程
CloseHandle(bullet);
ReleaseMutex(Mutex);//释放互斥对象
Sleep();
}
WaitForSingleObject(Mutex,INFINITE);//线程拥有互斥对象
srand((int)time(0));
newD=rand()%4;
if(newD==Up)//随机出新的方向并重新绘制坦克
{
Redraw();
if(Judge(hotpoint[0]-1,hotpoint[1],newD)==0)
{
hotpoint[0]--;
Direction=newD;
}
else
{
if(Judge(hotpoint[0],hotpoint[1],newD)==0)
Direction=newD;
}
}
elseif(newD==Down)
{
Redraw();
if(Judge(hotpoint[0]+1,hotpoint[1],newD)==0)
{
hotpoint[0]++;
Direction=newD;
}
else
{
if(Judge(hotpoint[0],hotpoint[1],newD)==0)
Direction=newD;
}
}
elseif(newD==Left)
{
Redraw();
if(Judge(hotpoint[0],hotpoint[1]-1,newD)==0)
{
hotpoint[1]--;
Direction=newD;
}
else
{
if(Judge(hotpoint[0],hotpoint[1],newD)==0)
Direction=newD;
}
}
elseif(newD==Right)
{
Redraw();
if(Judge(hotpoint[0],hotpoint[1]+1,newD)==0)
{
hotpoint[1]++;
Direction=newD;
}
else
{
if(Judge(hotpoint[0],hotpoint[1],newD)==0)
Direction=newD;
}
}
if(GameOver==0Life!=0)
DrawTank();
ReleaseMutex(Mutex);//释放互斥对象
Sleep(-80*Speed);
}
}
/*********************子弹线程函数*******************/
DWORDWINAPIBulletfly(LPVOIDlpParameter)
{
int*ID=(int*)lpParameter;//ID用来获取发射子弹坦克的ID
intPos[2];//子弹活动点
intdirection;
intSpeed;
inttype;
inthit=0;//击中标记
intoldx,oldy;//旧活动点
intflag=0;//子弹是否有移动的标记
if(*ID==Player)//如果是玩家坦克
{
type=PlayerBullet;
direction=player.GetDirection();
Speed=player.GetFire();
Pos[0]=player.GetHotX();
Pos[1]=player.GetHotY();
}
elseif(*ID==Enemy)//如果是敌人坦克
{
type=EnemyBullet;
direction=enemy.GetDirection();
Speed=enemy.GetFire();
Pos[0]=enemy.GetHotX();
Pos[1]=enemy.GetHotY();
}
if(direction==Up)//根据坦克的位置和方向确定子弹的初始坐标
{
Pos[0]--;
Pos[1]++;
}
elseif(direction==Down)
{
Pos[0]+=3;
Pos[1]++;
}
elseif(direction==Left)
{
Pos[0]++;
Pos[1]--;
}
elseif(direction==Right)
{
Pos[0]++;
Pos[1]+=3;
}
//子弹的运行
while(1)
{
WaitForSingleObject(Mutex,INFINITE);//这个不再注释了。。。。。
if(flag==1hit!=1)//擦除原位置
{
map[oldx][oldy]=Empty;
SetPos((oldy+1)*2,oldx+1);
cout"";
}
if(GameOver==1)
return0;
if(hit==1
Pos[0]0
Pos[0]22
Pos[1]0
Pos[1]22)//如果击中
{
ReleaseMutex(Mutex);
Sleep();
if(type==PlayerBullet)
player.FireEnable=1;
elseif(type=EnemyBullet)
enemy.FireEnable=1;
break;
}
switch(map[Pos[0]][Pos[1]])//子弹经过的MAP的标记
{
caseEmpty://如果是空位置就绘制子弹
map[Pos[0]][Pos[1]]=type;
SetPos((Pos[1]+1)*2,Pos[0]+1);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_RED
FOREGROUND_GREEN
FOREGROUND_BLUE);
cout"■";
break;
casePlayer://如果是玩家位置
if(type!=PlayerBullet)
{
player.Life--;//生命减少
if(player.Life=0)
GameOver=1;
}
Updata();
hit=1;
break;
caseEnemy://如果是敌人位置
if(type!=PlayerBullet)
hit=1;
else
{
hit=1;
Kill++;
if(Kill%20==0player.Life5)//击杀数++
player.Life++;
if(enemy.Type==Red)//如果击杀红坦克
{
KillRed++;
if(KillRed%10==0player.GetFire()5)
player.IncreaseFire();
}
if(enemy.Type==Green)///如果击杀绿坦克
{
KillGreen++;
if(KillGreen%10==0player.GetSpeed()5)
player.IncreaseSpeed();
}
enemy.Redraw();//擦除敌人
enemy.Life=0;//敌人死亡
}
Updata();
break;
}
oldx=Pos[0];
oldy=Pos[1];
if(direction==Up)//子弹移动
Pos[0]--;
elseif(direction==Down)
Pos[0]++;
elseif(direction==Left)
Pos[1]--;
elseif(direction==Right)
Pos[1]++;
ReleaseMutex(Mutex);
flag=1;
Sleep(60-10*Speed);
}
return0;
}
/*************************敌人线程函数***************************/
DWORDWINAPITankRuning(LPVOIDlpParameter)
{
Sleep();
intPos;
intStart[2];//敌人起始地址
inttyp;
intfire;
intspe;
while(1)
{
if(GameOver==1)
return0;
srand((int)time(0));//随机出敌人起始地址
Pos=rand()%4;
if(Pos==0)
{
Start[0]=2;
Start[0]=2;
}
elseif(Pos==1)
{
Start[0]=2;
Start[1]=18;
}
elseif(Pos==2)
{
Start[0]=18;
Start[1]=2;
}
elseif(Pos==3)
{
Start[0]=18;
Start[1]=18;
}
if(player.Judge(Start[0],Start[1],Down)==0)
break;
}
WaitForSingleObject(Mutex,INFINITE);
srand((int)time(0));
typ=rand()%3+1;//随机出敌人的种类
if(typ==Blue)
{
spe=1+level;
fire=1+level;
}
elseif(typ==Red)
{
spe=1+level;
fire=3+level;
}
elseif(typ==Green)
{
spe=3+level;
fire=1+level;
}
enemy=Tank(Down,Start[0],Start[1],typ,spe,fire);//重新生成敌人坦克
enemy.ID=Enemy;
enemy.Life=1;
enemy.FireEnable=1;
ReleaseMutex(Mutex);
enemy.Running();
return0;
}
voidInit()//初始化函数
{
Kill=0;
KillRed=0;
KillGreen=0;
player=Tank(Left,0,0,Normal,1,1);
enemy=Tank(Left,0,0,Red,1,1);
player.Life=2;
player.FireEnable=1;
enemy.Life=0;
enemy.FireEnable=1;
player.ID=Player;
enemy.ID=Enemy;
EnemyExist=0;
}
voidUpdata()//更新界面信息
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_RED
FOREGROUND_GREEN
FOREGROUND_BLUE);
inti;
SetPos(53,0);
cout"生命值:";
SetPos(53,1);
for(i=0;i5;i++)
{
if(iplayer.Life)
cout"■";
else
cout"";
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_GREEN);
SetPos(53,3);
cout"移动速度:";
SetPos(53,4);
for(i=0;i5;i++)
{
if(iplayer.GetSpeed())
cout"■";
else
cout"";
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_RED);
SetPos(53,5);
cout"火力:";
SetPos(53,6);
for(i=0;i5;i++)
{
if(iplayer.GetFire())
cout"■";
else
cout"";
}
SetPos(53,8);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_RED
FOREGROUND_GREEN
FOREGROUND_BLUE);
cout"杀敌数:"Kill;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_RED);
SetPos(53,9);
cout"杀死红坦克:"KillRed;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_GREEN);
SetPos(53,10);
cout"杀死绿坦克:"KillGreen;
}
voidDrawMap()//画界面
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
FOREGROUND_RED
FOREGROUND_GREEN
FOREGROUND_BLUE);
system("cls");
inti;
for(i=0;i25;i++)
{
SetPos(i*2,0);
cout"■";
}
for(i=1;i25;i++)
{
SetPos(0,i);
cout"■";
SetPos(24*2,i);
cout"■";
}
for(i=0;i25;i++)
{
SetPos(i*2,24);
cout"■";
}
Updata();
}
voidWel