亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++實現基于控制臺界面的吃豆子游戲

2020-01-26 15:07:28
字體:
來源:轉載
供稿:網友

本文實例講述了C++實現基于控制臺界面的吃豆子游戲。分享給大家供大家參考。具體分析如下:

程序運行界面如下所示:

ESC鍵可退出游戲。

main.cpp源文件如下:

#include "lib.h"#pragma onceextern 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) //重新開局    break;   else if(-1 == res) //用戶退出   {    iExit = 1;    break;   }   ShowScore(&CurPos,&food);  } } return 0;}

lib.h頭文件如下:

#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <time.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//標識用戶當前運動方向#define DIRECTION_UP  WM_USER + 5#define DIRECTION_DOWN  WM_USER + 6#define DIRECTION_LEFT  WM_USER + 7#define DIRECTION_RIGHT  WM_USER + 8//標識要打印的元素類型#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 + 14struct 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);//進行一些初始化操作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);//用戶移動void ShowScore(BODY *pBody,FOOD *pFood);//顯示等級 和剩余豆子數int IsOver(POS pos1,POS pos2,int TYPE);//判斷2點是否重合int IsKnock(WALL *pWall,BODY *pBody,FOOD *pFood,int TYPE);//判斷是否撞墻、吃到豆子int GetKey();//得到用戶按鍵

lib.cpp源文件如下:

#include "lib.h"#pragma onceHANDLE 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};/*********************************** 功能:* 判斷用戶與墻相撞或吃到食物***********************************/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;}/*********************************** 功能:* 用戶移動***********************************/int Move(FOOD *pFood,WALL *pWall,BODY *pBody){ BODY prePos = *pBody;// POS prePos = pBody->pos; int iKey = GetKey(); if(-1 == iKey) //用戶退出  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) //當局完成  {   ++level;   return 1;  } } Print(&prePos.pos,PRINT_CLEAN); //先刪除上一個輸出 Print(&pBody->pos,PRINT_BODY); return 0;}/*********************************** 功能:* 判斷2點是否重合***********************************/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; //更新墻的數量}/*********************************** 功能:* 完成初始化操作***********************************/void Init(FOOD *pFood,WALL *pWall,BODY *pBody,HALL *pHall){ //得到控制臺標準輸入輸出句柄 hMain_Out = GetStdHandle(STD_OUTPUT_HANDLE); hMain_In = GetStdHandle(STD_INPUT_HANDLE); //隱藏光標 GetConsoleCursorInfo(hMain_Out,&info); info.bVisible = FALSE; SetConsoleCursorInfo(hMain_Out,&info); //初始化結構體 pFood->len = 0; pWall->len = 0; pHall->len = 0; //改變控制臺大小 system("mode con cols=50 lines=21"); //走廊結構體賦值 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); }}/*********************************** 功能:* 得到用戶按鍵***********************************/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; //用戶退出 return 0;//用戶沒有有效按鍵}/*********************************** 功能:* 完成打印功能***********************************/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(" ");}/*********************************** 功能:* 顯示等級 和剩余豆子數***********************************/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;}

希望本文所述對大家的C++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品自拍小视频| 欧美激情视频三区| 亚洲白虎美女被爆操| 欧美午夜片欧美片在线观看| 91社区国产高清| 国产精品成人免费电影| 亚洲精品日韩激情在线电影| 欧美wwwxxxx| 一本色道久久88亚洲综合88| 国产丝袜精品第一页| 亚洲一区二区三区香蕉| 91麻豆国产语对白在线观看| 亚洲91精品在线观看| 欧美性色xo影院| 久久国产精品亚洲| 久久夜色精品亚洲噜噜国产mv| 欧美在线观看日本一区| 黑人精品xxx一区| 欧美激情精品久久久| 中文字幕av一区二区三区谷原希美| 亚洲欧洲在线看| 国产91在线播放九色快色| 欧美一乱一性一交一视频| 成人久久一区二区| 亚洲精品国产精品久久清纯直播| 国外成人免费在线播放| 久久九九国产精品怡红院| 精品人伦一区二区三区蜜桃网站| 亚洲日韩第一页| 日韩电影大片中文字幕| 伊人久久久久久久久久久久久| 中文字幕亚洲一区二区三区五十路| 日韩视频免费在线观看| 亚洲精品免费一区二区三区| 国产69精品久久久久9| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品678| 久久国产视频网站| 97超碰色婷婷| 精品国产一区二区三区久久| 中文一区二区视频| 精品国内亚洲在观看18黄| 成人综合网网址| 成人激情视频小说免费下载| 亚洲国产欧美日韩精品| 成人羞羞国产免费| 欧美另类交人妖| 亚洲国产高潮在线观看| 在线观看精品国产视频| www国产精品com| 日韩专区在线观看| 欧洲中文字幕国产精品| 国产91精品久久久| 91精品国产99久久久久久| 欧美电影在线免费观看网站| 亚洲欧美国产一区二区三区| 久久久成人精品| 欧美国产日韩在线| 久久久久久久久久久网站| 亚洲日韩第一页| 亚洲成人免费网站| 国模极品一区二区三区| 国内精品视频久久| 精品偷拍一区二区三区在线看| 555www成人网| 日韩av网址在线观看| 国产精品久久久久久久久久久久| 国产精品亚洲自拍| 日本三级久久久| 久久精品青青大伊人av| 欧美极品少妇xxxxⅹ裸体艺术| 欧美精品生活片| 欧美在线一区二区三区四| 国产成人精品一区二区三区| 欧美成人四级hd版| 欧美激情亚洲激情| 亚洲国产精品成人一区二区| 亚洲欧美日韩久久久久久| 亚洲精品在线91| 91大神福利视频在线| 亚洲图片欧美日产| 亚洲国产成人在线播放| 成人性生交大片免费观看嘿嘿视频| 精品无人区太爽高潮在线播放| 伊人成人开心激情综合网| 在线观看精品自拍私拍| 2019中文字幕在线免费观看| 一区二区三区无码高清视频| 亚洲精品91美女久久久久久久| 欧美日韩加勒比精品一区| 久操成人在线视频| 亚洲精品v天堂中文字幕| 国产精品高潮呻吟久久av黑人| 欧美精品在线免费| 国内精品视频一区| 成人免费看片视频| 亚洲最大成人网色| 伊人精品在线观看| 国产精品尤物福利片在线观看| 国外成人免费在线播放| 欧美亚洲午夜视频在线观看| 亚洲网站在线看| 国产性色av一区二区| xx视频.9999.com| 亚洲国产精品资源| 久久久精品欧美| 欧美性猛交xxxx黑人| 亚洲精品视频在线播放| 在线播放国产一区中文字幕剧情欧美| 色老头一区二区三区在线观看| 国产婷婷色综合av蜜臀av| 韩国三级日本三级少妇99| 欧美日本啪啪无遮挡网站| 国产精品久久在线观看| 7m第一福利500精品视频| 久久九九亚洲综合| 97视频在线观看免费高清完整版在线观看| 98视频在线噜噜噜国产| 亚洲欧美中文字幕在线一区| 国产亚洲人成a一在线v站| 美日韩精品免费观看视频| 日韩视频免费在线观看| 欧洲精品毛片网站| 日韩av在线影视| 亚洲人成在线免费观看| 色偷偷噜噜噜亚洲男人| 中文字幕欧美专区| 国产精品极品美女在线观看免费| 成人福利网站在线观看| 久久久免费在线观看| www.日本久久久久com.| 久久视频在线直播| 国产精品96久久久久久又黄又硬| 亚洲欧美在线第一页| 午夜精品一区二区三区视频免费看| 久久99视频精品| 国产精品久久一区| 久久久精品久久久| 欧美老女人xx| 日韩精品电影网| 成人免费视频网| 亚洲一区二区精品| 亚洲成人在线网| 国产在线观看精品| 国产精品高清网站| 国产一区二区三区丝袜| 欧美高清在线视频观看不卡| 国产日韩在线视频| 国产日韩在线看片| 国产69久久精品成人看| 欧美日韩在线观看视频小说| 精品国产一区二区三区久久狼5月| 色午夜这里只有精品| 国产一区私人高清影院| 亚洲国产精品99久久| 亚洲国产成人爱av在线播放| 欧美高清性猛交| 中文字幕日韩综合av| 精品国内自产拍在线观看| 久久久亚洲网站| 国产不卡精品视男人的天堂| 91久久精品国产91久久| 91亚洲精品一区| 久久久精品影院|