这些游戏的源码你都有吗

看这个文章的筒子们应该都是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


转载请注明:http://www.aierlanlan.com/rzfs/383.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了