最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)基于控制臺(tái)界面的吃豆子游戲

 更新時(shí)間:2015年04月20日 12:14:59   作者:司青  
這篇文章主要介紹了C++實(shí)現(xiàn)基于控制臺(tái)界面的吃豆子游戲,實(shí)例分析了吃豆子游戲的原理與C++實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了C++實(shí)現(xiàn)基于控制臺(tái)界面的吃豆子游戲。分享給大家供大家參考。具體分析如下:

程序運(yùn)行界面如下所示:

ESC鍵可退出游戲。

main.cpp源文件如下:

#include "lib.h"
#pragma once
extern int level;
int main()
{
 FOOD food;
 WALL wall;
 BODY CurPos;
 HALL hall;
 int iExit = 0;
 while(1)
 {
  if(iExit)
   break;
  Init(&food,&wall,&CurPos,&hall);
  MakeWall(&wall);
  while(1)
  {
   Sleep(200);
   int res = Move(&food,&wall,&CurPos);
   if(1 == res) //重新開(kāi)局
    break;
   else if(-1 == res) //用戶(hù)退出
   {
    iExit = 1;
    break;
   }
   ShowScore(&CurPos,&food);
  }
 }
 return 0;
}

lib.h頭文件如下:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
//標(biāo)識(shí)用戶(hù)按下的方向鍵
#define KEY_UP    WM_USER + 1
#define KEY_DOWN   WM_USER + 2
#define KEY_LEFT   WM_USER + 3
#define KEY_RIGHT   WM_USER + 4
//標(biāo)識(shí)用戶(hù)當(dāng)前運(yùn)動(dòng)方向
#define DIRECTION_UP  WM_USER + 5
#define DIRECTION_DOWN  WM_USER + 6
#define DIRECTION_LEFT  WM_USER + 7
#define DIRECTION_RIGHT  WM_USER + 8
//標(biāo)識(shí)要打印的元素類(lèi)型
#define PRINT_WALL   WM_USER + 9
#define PRINT_FOOD   WM_USER + 10
#define PRINT_BODY   WM_USER + 11
#define PRINT_CLEAN   WM_USER + 12
#define KNOCK_WALL   WM_USER + 13
#define KNOCK_FOOD   WM_USER + 14
struct POS
{
 int x;
 int y;
};
struct WALL
{
 POS pos[9999];
 int len;
};
struct FOOD
{
 POS pos[8];
 int len;
 int IsHidden;
};
struct BODY
{
 POS pos;
 int Direction;
};
struct HALL{
 POS pos[200];
 int len;
};
void Init(FOOD *pFood,WALL *pWall,BODY *pBody,HALL *pHall);
//進(jìn)行一些初始化操作
void Print(POS *pos,int TYPE,int ix = 0);
//完成打印功能
void MakeWall(WALL *pWall);
//生成墻
void MakeFood(HALL *pHall,FOOD *pFood);
//生成食物
int Move(FOOD *pFood,WALL *pWall,BODY *pBody);
//用戶(hù)移動(dòng)
void ShowScore(BODY *pBody,FOOD *pFood);
//顯示等級(jí) 和剩余豆子數(shù)
int IsOver(POS pos1,POS pos2,int TYPE);
//判斷2點(diǎn)是否重合
int IsKnock(WALL *pWall,BODY *pBody,FOOD *pFood,int TYPE);
//判斷是否撞墻、吃到豆子
int GetKey();
//得到用戶(hù)按鍵

lib.cpp源文件如下:

#include "lib.h"
#pragma once
HANDLE hMain_Out;
HANDLE hMain_In;
CONSOLE_CURSOR_INFO info;
int iBeans = 0;
int level = 1;
//extern short wall[17][24];
short wall[17][24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     0,-1,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,
     0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,-1,0,0,0,0,0,-1,-1,-1,0,0,
     0,-1,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,-1,0,0,0,0,
     0,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,0,-1,0,-1,-1,-1,-1,-1,-1,-1,0,0,
     0,-1,0,0,-1,0,-1,0,0,0,0,-1,0,-1,-1,-1,0,0,0,0,0,0,0,0,
     0,-1,-1,-1,-1,-1,-1,0,0,0,0,-1,0,0,0,-1,0,0,0,0,0,0,0,0,
     0,-1,0,0,0,0,0,0,0,0,0,-1,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,0,
     0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,-1,0,0,0,0,
     0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,-1,0,0,-1,0,0,0,0,
     0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,-1,-1,-1,-1,0,-1,-1,0,
     0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,-1,0,0,
     0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,
     0,0,-1,-1,-1,-1,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,
     0,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,
     0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
/**********************************
* 功能:
* 判斷用戶(hù)與墻相撞或吃到食物
***********************************/
int IsKnock(WALL *pWall,BODY *pBody,FOOD *pFood,int TYPE)
{
 if(KNOCK_WALL == TYPE)
 {
  int i;
  for(i = 0 ; i < pWall->len ; ++i)
  {
   if(IsOver(pBody->pos,pWall->pos[i],KNOCK_WALL))
    return 1; //與墻相撞
  }
 }
 else if(KNOCK_FOOD == TYPE)
 {
  int i;
  for(i = 1 ; i <= pFood->len ; ++i)
  {
   if(IsOver(pFood->pos[i],pBody->pos,KNOCK_WALL))
    return i; //與食物相撞
  }
 }
 return 0;
}
/**********************************
* 功能:
* 用戶(hù)移動(dòng)
***********************************/
int Move(FOOD *pFood,WALL *pWall,BODY *pBody)
{
 BODY prePos = *pBody;
// POS prePos = pBody->pos;
 int iKey = GetKey();
 if(-1 == iKey) //用戶(hù)退出
  return -1;
 if(iKey)
 {
  pBody->Direction = iKey + 4;
  iKey = 0;
 }
 if(0 == iKey)
 {
  if(DIRECTION_UP == pBody->Direction)
   --pBody->pos.y;
  else if(DIRECTION_DOWN == pBody->Direction)
   ++pBody->pos.y;
  else if(DIRECTION_LEFT == pBody->Direction)
   --pBody->pos.x;
  else if(DIRECTION_RIGHT == pBody->Direction)
   ++pBody->pos.x;
 }
 
 if(IsKnock(pWall,pBody,pFood,KNOCK_WALL))
 {
  *pBody = prePos;
  return 0;
 }
 int ix = IsKnock(pWall,pBody,pFood,KNOCK_FOOD);
 if(ix)
 {
  ++iBeans;
  //刪除初吃掉的食物
  int i;
  for(i = ix ; i <= (pFood->len - 1) ; ++i)
   pFood->pos[i] = pFood->pos[i + 1];
  --(pFood->len);
  if(0 == pFood->len) //當(dāng)局完成
  {
   ++level;
   return 1;
  }
 }
 Print(&prePos.pos,PRINT_CLEAN); //先刪除上一個(gè)輸出
 Print(&pBody->pos,PRINT_BODY);
 return 0;
}
/**********************************
* 功能:
* 判斷2點(diǎn)是否重合
***********************************/
int IsOver(POS pos1,POS pos2,int TYPE)
{
 if(KNOCK_WALL == TYPE) //pos1,the body. pos2,the wall
  if((pos1.x == pos2.x && pos1.y == pos2.y) || (pos2.x + 1 == pos1.x && pos2.y == pos1.y))
   return 1;
 return 0;
}
/**********************************
* 功能:
* 生成墻
***********************************/
void MakeWall(WALL *pWall)
{
 int x,y;
 int ix = 0;
 for(x = 0 ; x <= 16 ; ++x)
 {
  for(y = 0 ; y <= 23 ; ++y)
  {
   if(0 == wall[x][y])
   {
    pWall->pos[ix].x = 2 * y;
    pWall->pos[ix].y = x;
    Print(&pWall->pos[ix++],PRINT_WALL);
   }
  }
 }
 pWall->len = ix; //更新墻的數(shù)量
}
/**********************************
* 功能:
* 完成初始化操作
***********************************/
void Init(FOOD *pFood,WALL *pWall,BODY *pBody,HALL *pHall)
{
 //得到控制臺(tái)標(biāo)準(zhǔn)輸入輸出句柄
 hMain_Out = GetStdHandle(STD_OUTPUT_HANDLE);
 hMain_In = GetStdHandle(STD_INPUT_HANDLE);
 //隱藏光標(biāo)
 GetConsoleCursorInfo(hMain_Out,&info);
 info.bVisible = FALSE;
 SetConsoleCursorInfo(hMain_Out,&info);
 //初始化結(jié)構(gòu)體
 pFood->len = 0;
 pWall->len = 0;
 pHall->len = 0;
 //改變控制臺(tái)大小
 system("mode con cols=50 lines=21");
 //走廊結(jié)構(gòu)體賦值
 int x,y;
 int ix = 0;
 for(x = 0 ; x < 17 ; ++x)
 {
  for(y = 0 ; y < 24 ; ++y)
  {
   if(wall[x][y]) //非墻
   {
    pHall->pos[ix].x = 2 * y;
    pHall->pos[ix++].y = x;
   }
  }
 }
 pHall->len = ix;
 pBody->pos.x = 2;
 pBody->pos.y = 1;
 pBody->Direction = DIRECTION_DOWN;
 printf("%d %d\n",pHall->pos[0].x,pHall->pos[0].y);
 //輸出食物
 int i;
 MakeFood(pHall,pFood);
 for(i = 1 ; i <= 7 ; ++i)
 {
  Print(&pFood->pos[i],PRINT_FOOD,i);
 }
}
/**********************************
* 功能:
* 得到用戶(hù)按鍵
***********************************/
int GetKey()
{
 if(GetAsyncKeyState(VK_UP))
  return KEY_UP;
 if(GetAsyncKeyState(VK_DOWN))
  return KEY_DOWN;
 if(GetAsyncKeyState(VK_LEFT))
  return KEY_LEFT;
 if(GetAsyncKeyState(VK_RIGHT))
  return KEY_RIGHT;
 if(GetAsyncKeyState(VK_ESCAPE))
  return -1; //用戶(hù)退出
 return 0;//用戶(hù)沒(méi)有有效按鍵
}
/**********************************
* 功能:
* 完成打印功能
***********************************/
void Print(POS *p,int TYPE,int ix)
{
 COORD pos;
 pos.X = p->x;
 pos.Y = p->y;
 SetConsoleCursorPosition(hMain_Out,pos);
 if(PRINT_WALL == TYPE)
  printf("■");
 else if(PRINT_FOOD == TYPE)
  printf("%d",ix);
 else if(PRINT_BODY == TYPE)
  printf("\1");
 else if(PRINT_CLEAN == TYPE)
  printf(" ");
}
/**********************************
* 功能:
* 顯示等級(jí) 和剩余豆子數(shù)
***********************************/
void ShowScore(BODY *pBody,FOOD *pFood)
{
 COORD pos;
 pos.X = 0;
 pos.Y = 18;
 SetConsoleCursorPosition(hMain_Out,pos);
 printf("\tBeans left : %d | pos : x=%d,y=%d\n",pFood->len,pBody->pos.x,pBody->pos.y);
 printf("\t\tLevel : %d",level);
// for(int i = 1 ; i <= pFood->len ; ++i)
//  printf("(x=%d,y=%d)",pFood->pos[i].x,pFood->pos[i].y);
}
/**********************************
* 功能:
* 生成食物
***********************************/
void MakeFood(HALL *pHall,FOOD *pFood)
{
 srand((unsigned)time(NULL));
 int tot;
 for(tot = 1 ; tot <= 7 ; ++tot)
 {
  int ixFood = rand() * pHall->len / RAND_MAX;
  pFood->pos[tot].x = pHall->pos[ixFood].x;
  pFood->pos[tot].y = pHall->pos[ixFood].y;
 }
 pFood->len = 7;
}

希望本文所述對(duì)大家的C++程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 詳解c++中的類(lèi)型識(shí)別

    詳解c++中的類(lèi)型識(shí)別

    這篇文章主要介紹了 詳解c++中的類(lèi)型識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • C++ 中快排的遞歸和非遞歸實(shí)現(xiàn)

    C++ 中快排的遞歸和非遞歸實(shí)現(xiàn)

    這篇文章主要介紹了C++ 中快排的遞歸和非遞歸實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語(yǔ)言在屏幕上輸出楊輝三角

    C語(yǔ)言在屏幕上輸出楊輝三角

    這篇文章主要介紹了在屏幕上輸出楊輝三角的方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • 詳解C語(yǔ)言中的指針與數(shù)組的定義與使用

    詳解C語(yǔ)言中的指針與數(shù)組的定義與使用

    這篇文章主要介紹了C語(yǔ)言中的指針與數(shù)組的定義與使用,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Qt5.9實(shí)現(xiàn)簡(jiǎn)單的多線程實(shí)例(類(lèi)QThread)

    Qt5.9實(shí)現(xiàn)簡(jiǎn)單的多線程實(shí)例(類(lèi)QThread)

    Qt開(kāi)啟多線程,主要用到類(lèi)QThread。用一個(gè)類(lèi)繼承QThread,然后重新改寫(xiě)虛函數(shù)run()。具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-09-09
  • c語(yǔ)言中的移位運(yùn)算符

    c語(yǔ)言中的移位運(yùn)算符

    這篇文章主要介紹了c語(yǔ)言中的移位運(yùn)算符,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲

    C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++?requires關(guān)鍵字簡(jiǎn)單介紹

    C++?requires關(guān)鍵字簡(jiǎn)單介紹

    requires?是?C++20?中引入的一個(gè)新關(guān)鍵字,用于在函數(shù)模板或類(lèi)模板中聲明所需的一組語(yǔ)義要求,它可以用來(lái)限制模板參數(shù),類(lèi)似于?typename?和?class?關(guān)鍵字,這篇文章主要介紹了C++?requires關(guān)鍵字簡(jiǎn)介,需要的朋友可以參考下
    2023-05-05
  • C++中淺拷貝與深拷貝的詳解及其作用介紹

    C++中淺拷貝與深拷貝的詳解及其作用介紹

    這篇文章主要介紹了C++中淺拷貝與深拷貝的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C語(yǔ)言簡(jiǎn)明講解操作符++和--的使用方法

    C語(yǔ)言簡(jiǎn)明講解操作符++和--的使用方法

    ++和--運(yùn)算符分別是+=1和-=1的簡(jiǎn)寫(xiě)。設(shè)計(jì)這樣兩個(gè)運(yùn)算符的本意是?便程序員,但i++和++i使?不恰當(dāng)有時(shí)候會(huì)造成混淆,反倒令剛?cè)腴T(mén)的C程序員有點(diǎn)混亂
    2022-04-04

最新評(píng)論

涞水县| 河曲县| 肥城市| 晋江市| 白河县| 南通市| 唐河县| 土默特右旗| 潜江市| 德令哈市| 宁陵县| 营山县| 体育| 彭泽县| 修武县| 遂昌县| 南汇区| 阿巴嘎旗| 洪泽县| 诸暨市| 都安| 恩平市| 新乡县| 建水县| 平潭县| 石河子市| 五莲县| 横山县| 仙桃市| 平遥县| 阳东县| 临泽县| 秦皇岛市| 从化市| 南川市| 永川市| 临桂县| 大港区| 平遥县| 泗水县| 宿州市|