控制台的小游戏

最近有点闲昨天中午搞个好玩的,vc6控制台编译,有兴趣的试试看。

我很懒不怎么上Blog的,有C++的可以试一试啊

 

// main.cpp

#include <windows.h>
#include <ctime>
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

int main()
{
 srand(time(NULL));
 
 // 初始化地图 和 蛇
 char map[30][40];
 memset(map, ' ', sizeof(map));
 for(int i=0; i<30; i++)
 {
  map[i][0] = '#';
  map[i][39] = '#';
 }
 for(i=0; i<40; i++)
 {
  map[0][i] = '#';
  map[29][i] = '#';
 }
 map[10][20]='$';
 list<int> snake;
 snake.push_back(10*256+10);
 snake.push_back(9*256+10);
 snake.push_back(8*256+10);
 
 int score = 0;
 while(true)
 {
  // 处理键盘 找出方向
  static char dir = 'R';
  if(GetAsyncKeyState(VK_UP) && dir!='D')
   dir='U';
  else if(GetAsyncKeyState(VK_DOWN) && dir!='U')
   dir='D';
  else if(GetAsyncKeyState(VK_LEFT) && dir!='R')
   dir='L';
  else if(GetAsyncKeyState(VK_RIGHT) && dir!='L')
   dir='R';
  
  // 找出下一点
  int dx=0, dy=0;
  if(dir=='U')
   dy=-1;
  if(dir=='D')
   dy=1;
  if(dir=='L')
   dx=-1;
  if(dir=='R')
   dx=1;
  int nextX=snake.front()/256+dx;
  int nextY=snake.front()%256+dy;
  
  // 碰撞检测
  list<int>::iterator findResult = find(snake.begin(), snake.end(), nextX*256+nextY);
  bool inSnake = findResult!=snake.end();
  if(inSnake)// 撞自己
  {
   break;
  }
  else if(map[nextY][nextX]=='#')// 撞墙
  {
   break;
  }
  else if(map[nextY][nextX]=='$')// 撞吃的
  {
   score+=100;
   map[nextY][nextX]=' ';
   snake.push_front(nextX*256+nextY);
   int fruitX, fruitY;
   while(true)
   {
    fruitX = rand()%40;
    fruitY = rand()%30;
    list<int>::iterator findResult = find(snake.begin(), snake.end(), fruitX*256+fruitY);
    bool inSnake = findResult!=snake.end();
    if( (!inSnake) && (map[fruitY][fruitX]==' ') )
     break;
   };
   map[fruitY][fruitX]='$';
  }
  else// 行动
  {
   snake.push_front(nextX*256+nextY);
   snake.pop_back();
  }
  
  // 显示
  char map2[30][40];
  memcpy(map2, map, sizeof(map));
  for(list<int>::iterator p=snake.begin(); p!=snake.end(); p++)
  {
   int x=(*p)/256;
   int y=(*p)%256;
   map2[y][x] = 'O';
  }
  map2[nextY][nextX]='@';
  system("cls");
  for(int i=0; i<30; i++)
  {
   for(int j=0; j<40; j++)
   {
    cout<<map2[i][j];
   }
   cout<<endl;
  }
  cout<<"score: "<<score<<endl;
  
  _sleep(250);
 }
 
 cout<<"Game Over"<<endl;
 system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值