控制台小游戏合集(持续更新) 发表于 2017-07-01 更新于 2017-11-11 分类于 随笔 本文字数: 14k 阅读时长 ≈ 26 分钟 近日为了做好游戏相关的准备,特地自行制作了几款控制台的小游戏,在以后的时间中,也会持续更新。 五子棋(鼠标下棋)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203#include <iostream>#include <Windows.h>#include <cstdlib>#include <ctime>#include <string>using namespace std;#define LEFT_CLICK FROM_LEFT_1ST_BUTTON_PRESSED#define RIGHT_CLICK RIGHTMOST_BUTTON_PRESSEDtypedef int GameState;#define PLAYING 0#define BLACKWIN 1#define WHITEWIN 2#define BLACK 1#define WHITE 2int ChessBoard[19][19];short Top = 3, Left = 6;char BlackChess[3] = "○";char WhiteChess[3] = "●";int Direct[8][2] = { { 1,1 }, { 1,0 }, { 1,-1 }, { 0,-1 }, { -1,-1 }, { -1,0 }, { -1,1 }, { 0,1 }};//------------------控制台函数------------------------void curGotoXY(short x, short y);//光标移动COORD getMouseXY(DWORD clickType);//鼠标单击时的位置 clickType = LEFT_CLICK时为鼠标左键void HideCursor();void ClearScreen(); // 清屏void PrintInXY(short x, short y, char *str);//-----------------------函数-----------------------void ShowInfo(bool isBlack);void ClearCB();void DrawCB();void Game();GameState CheckWin(int x, int y);void Message(int whoWin);int main() { HideCursor(); while(true){ ClearScreen(); ClearCB(); DrawCB(); Game(); curGotoXY(0, 0); getchar(); } return 0;}void curGotoXY(short x, short y) { SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), { x,y });}COORD getMouseXY(DWORD clickType) { INPUT_RECORD inRec; DWORD res; COORD pos; while (1) { ReadConsoleInputW(GetStdHandle(STD_INPUT_HANDLE), &inRec, 1, &res); if (inRec.EventType == MOUSE_EVENT) { pos = inRec.Event.MouseEvent.dwMousePosition; if (inRec.Event.MouseEvent.dwButtonState == clickType) break; } } return pos;}void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}void ClearScreen() { CONSOLE_SCREEN_BUFFER_INFO bInfo; DWORD d; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &bInfo); COORD home = { 0, 0 }; unsigned long size = bInfo.dwSize.X * bInfo.dwSize.Y; FillConsoleOutputCharacterW(GetStdHandle(STD_OUTPUT_HANDLE), 0, size, home, &d);}void PrintInXY(short x, short y, char * str) { //DWORD d; curGotoXY(x, y); printf_s("%s", str); //WriteConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), (LPCWSTR)str, strlen(str), { x,y }, &d);}void ShowInfo(bool isBlack) { char * str; if (isBlack)str = "该黑棋下了"; else str = "该白棋下了"; PrintInXY(Left + 8, 2, str);}void ClearCB() { for (int i = 0; i < 19; i++) for (int j = 0; j < 19; j++) ChessBoard[i][j] = 0;}void DrawCB() { char * str; for (short i = 0; i < 19; i++) { for (short j = 0; j < 19; j++) { if (i == 0 && j == 0) str = "╔"; else if (i == 0 && j == 18) str = "╚"; else if (i == 18 && j == 0) str = "╗"; else if (i == 18 && j == 18) str = "╝"; else if (i == 0) str = "╠"; else if (i == 18) str = "╣"; else if (j == 0) str = "╦"; else if (j == 18) str = "╩"; else str = "╬"; PrintInXY(i * 2 + Left, j + Top, str); } } //═║╔╗╚╝╠╣╦╩╬○●}void Game() { int Winner; bool isBlack = true; ShowInfo(isBlack); int x = 0, y = 0; do { if (isBlack) { COORD pos = getMouseXY(LEFT_CLICK); x = (pos.X - Left) / 2, y = pos.Y - Top; if (x > 18 || x < 0 || y > 18 || y < 0) continue; if (ChessBoard[x][y] == 0) { PrintInXY(x * 2 + Left, y + Top, BlackChess); ChessBoard[x][y] = BLACK; isBlack = !isBlack; ShowInfo(isBlack); } } else { COORD pos = getMouseXY(RIGHT_CLICK); x = (pos.X - Left) / 2, y = pos.Y - Top; if (x > 18 || x < 0 || y > 18 || y < 0) continue; if (ChessBoard[x][y] == 0) { PrintInXY(x * 2 + Left, y + Top, WhiteChess); ChessBoard[x][y] = WHITE; isBlack = !isBlack; ShowInfo(isBlack); } } Winner = CheckWin(x, y); if (Winner)break; } while (true); Message(Winner);}GameState CheckWin(int x, int y) { int tmp = ChessBoard[x][y]; int num[4] = { 1,1,1,1 }; int i, j, m, n; for (i = 0; i < 8; i++) { m = x; n = y; j = i % 4; m += Direct[i][0]; n += Direct[i][1]; while (ChessBoard[m][n] == tmp) { m += Direct[i][0]; n += Direct[i][1]; num[j]++; } } for (i = 0; i < 4; i++) if (num[i] >= 5) return tmp; return PLAYING;}void Message(int whoWin) { char * WhoWin; int x = 7 * 2 + Left, y = 9 + Top; char * str; str = "╔═════════╗"; PrintInXY(x - 6, y - 1, str); str = "║ ║"; PrintInXY(x - 6, y, str); str = "╚═════════╝"; PrintInXY(x - 6, y + 1, str); if (whoWin == BLACKWIN) { WhoWin = "黑棋赢了"; PrintInXY(x, y, WhoWin); } else { WhoWin = "白棋赢了"; PrintInXY(x, y, WhoWin); }} 迷宫(随机生成)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165#include<iostream>#include<cstdlib>#include<conio.h>#include<ctime>#include<Windows.h>using namespace std;#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)#define TOP 1#define LEFT (2 * TOP)#define MAX_SIZE 40#define RANDOM(min, max) ((min) + (rand()%((max) - (min) + 1)))#define ROAD 0#define WALL 1#define END 2typedef struct PlayerCharacter { int x, y; char *PC; PlayerCharacter() { PC = "●"; x = y = 1; }}PlayerCharacter;typedef struct RandomMap { int **Map; int mapW, mapH; long mapID; RandomMap() { mapW = 2 * RANDOM(8, MAX_SIZE / 2) + 1; mapH = 2 * RANDOM(5, MAX_SIZE / 2) + 1; Map = (int**)malloc(mapH * sizeof(int*)); for (int i = 0; i < mapH; i++) { Map[i] = (int*)malloc(mapW * sizeof(int)); for (int j = 0; j < mapW; j++) Map[i][j] = WALL; } }}RandomMap;void GotoXY(short x, short y);//光标移动void HideCursor();void Create(RandomMap rMap, int m, int n);void InitMap(RandomMap rMap);void PaintMapPoint(RandomMap rMap, int x, int y);void GamePlaying(PlayerCharacter &pc);void PaintPC(PlayerCharacter pc);void Move(RandomMap rMap, PlayerCharacter &pc, int x, int y);int main() { SYSTEMTIME sys[2]; system("MODE con: COLS=120 LINES=50"); srand((unsigned int)time(0)); HideCursor(); PlayerCharacter pc; GetLocalTime(&sys[0]); GamePlaying(pc); GetLocalTime(&sys[1]); int mm = sys[1].wMinute - sys[0].wMinute, ss = sys[1].wSecond - sys[0].wSecond; if (ss < 0) { ss += 60; mm -= 1; } else if (ss > 59) { ss -= 60; mm += 1; } printf("\n好牛逼啊,走出迷宫只花了%2d:%2d的时间!\n", mm, ss); return 0;}void GotoXY(short x, short y) { SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), { x,y });}void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}bool CheckBorder(RandomMap rMap, int x, int y) { if (x <= 0 || y <= 0 || x >= rMap.mapW - 1 || y >= rMap.mapH - 1)return true; else return false;}bool CheckOutside(RandomMap rMap, int x, int y) { if (x < 0 || y < 0 || x > rMap.mapW - 1 || y > rMap.mapH - 1)return false; else return true;}void Create(RandomMap rMap, int m, int n) { int next[4][2] = { { 0,1 }, { 1,0 }, { 0,-1 }, { -1,0 } }; int i, j, t; for (i = 0; i<4; i++) { j = rand() % 4; t = next[i][0], next[i][0] = next[j][0], next[j][0] = t; t = next[i][1], next[i][1] = next[j][1], next[j][1] = t; } rMap.Map[m][n] = ROAD; for (i = 0; i<4; i++) if (!CheckBorder(rMap, n + 2 * next[i][1], m + 2 * next[i][0]) && rMap.Map[m + 2 * next[i][0]][n + 2 * next[i][1]] == WALL) { rMap.Map[m + next[i][0]][n + next[i][1]] = ROAD; Create(rMap, m + 2 * next[i][0], n + 2 * next[i][1]); }}void InitMap(RandomMap rMap) { Create(rMap, 1, 1); rMap.Map[rMap.mapH - 2][rMap.mapW - 2] = END; for (int i = 0; i < rMap.mapW; i++) { for (int j = 0; j < rMap.mapH; j++) { PaintMapPoint(rMap, i, j); } }}void PaintMapPoint(RandomMap rMap, int x, int y) { GotoXY(x * 2 + LEFT, y + TOP); switch (rMap.Map[y][x]) { case 0: printf(" "); break; case 1: printf("※"); break; case 2: printf(" E"); break; }}void PaintPC(PlayerCharacter pc) { GotoXY(pc.x * 2 + LEFT, pc.y + TOP); printf("%s", pc.PC);}void Move(RandomMap rMap, PlayerCharacter &pc, int x, int y) { PaintMapPoint(rMap, pc.x, pc.y); pc.x += x; pc.y += y; PaintPC(pc);}void GamePlaying(PlayerCharacter &pc) { RandomMap rm; InitMap(rm); PaintPC(pc); int x, y; while (pc.x != rm.mapW - 2 || pc.y != rm.mapH - 2) { x = 0; y = 0; if (KEYDOWN(VK_UP)) { y--; } if (KEYDOWN(VK_DOWN)) { y++; } if (KEYDOWN(VK_LEFT)) { x--; } if (KEYDOWN(VK_RIGHT)) { x++; } if (x || y) if (CheckOutside(rm, pc.x + x, pc.y + y) && rm.Map[pc.y + y][pc.x + x] != WALL) { Move(rm, pc, x, y); } Sleep(100); } GotoXY(LEFT, rm.mapH + TOP);} 贪吃蛇 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217#include <Windows.h>#include <iostream>#include <ctime>#include <conio.h>#include <cstdlib>using namespace std;#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)#define RANDOM(min, max) ((min) + (rand()%((max) - (min) + 1)))#define MAP_SIZE 20#define TOP 1#define LEFT (TOP * 2)#define WIN 1#define LOSE -1#define GAMING 0//-------------贪吃蛇自身结构---------typedef struct Position { int x; int y; Position operator+(Position op) { return{ x + op.x,y + op.y }; } Position operator-(Position op) { return{ x - op.x,y - op.y }; } bool operator!=(Position op) { return (x != op.x || y != op.y); } Position(int i = 0, int j = 0) { x = i; y = j; }}Position, Direction;typedef struct SnakeNode { SnakeNode* next; SnakeNode* prev; Position pos; Direction dir;}*SnakeBody;typedef struct Snake { SnakeBody head, tail; int length; Snake() { length = 8; head = new SnakeNode(); SnakeBody q = head; for (int i = 0; i < length; i++) { SnakeBody p = new SnakeNode(); p->pos = { 0 , length - i - 1 }; p->dir.x = 0; p->dir.y = 1; p->prev = NULL; if (i == 0) { q = head = p; } else { p->prev = q; q->next = p; q = q->next; } } tail = q; tail->next = NULL; }}Snake;int Map[MAP_SIZE][MAP_SIZE];//----------相关函数--------void GotoXY(short x, short y);//光标移动void HideCursor();//隐藏光标void Gaming();int main() { system("MODE con: COLS=50 LINES=22"); srand((unsigned int)time(0)); HideCursor(); Gaming(); return 0;}void GotoXY(short x, short y) { SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), { x,y });}void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}void MoveSnake(Snake &S) { SnakeBody p = S.head; while (p) { if (!p->next) Map[p->pos.y][p->pos.x] = 0; if (p == S.head) Map[p->pos.y][p->pos.x] = 1; p->pos = p->pos + p->dir; p = p->next; } Map[S.head->pos.y][S.head->pos.x] = 2;}void PaintSnake(Snake &S) { SnakeBody p = S.head; Position q; while (p) { q = p->pos - p->dir; GotoXY(2 * q.x + LEFT, q.y + TOP); printf(" "); p = p->next; } p = S.head; while (p) { q = p->pos; GotoXY(2 * q.x + LEFT, q.y + TOP); printf("□"); p = p->next; } GotoXY(2 * S.head->pos.x + LEFT, S.head->pos.y + TOP); printf("○");}void CreateFood() { int x, y; do { x = RANDOM(1, MAP_SIZE - 1); y = RANDOM(1, MAP_SIZE - 1); } while (Map[y][x] != 0); Map[y][x] = 3; GotoXY(LEFT + 2 * x, TOP + y); printf("★");}void Gaming() { for (int i = -1; i <= MAP_SIZE; i++) { GotoXY(LEFT + 2 * i, 0); printf("※"); GotoXY(LEFT + 2 * i, TOP + MAP_SIZE); printf("※"); } for (int i = -1; i <= MAP_SIZE; i++) { GotoXY(0, TOP + i); printf("※"); GotoXY(LEFT + 2 * MAP_SIZE, TOP + i); printf("※"); } Snake snake; Direction nowD = { 0,1 }; for (int i = 0; i < MAP_SIZE; i++) for (int j = 0; j < MAP_SIZE; j++) Map[i][j] = 0; SnakeBody p = snake.head; while (p) { GotoXY(LEFT + 2 * p->pos.x, TOP + p->pos.y); if(p == snake.head) printf("○"); else printf("□"); p = p->next; } p = snake.head; while (p) { if(p == snake.head)Map[p->pos.y][p->pos.x] = 2; else Map[p->pos.y][p->pos.x] = 1; p = p->next; } CreateFood(); bool win = false; while (true) { if (_kbhit()) { if (KEYDOWN(VK_UP)) { if (nowD != Direction(0,1)) nowD = { 0,-1 }; } if (KEYDOWN(VK_DOWN)) { if (nowD != Direction(0, -1)) nowD = { 0,1 }; } if (KEYDOWN(VK_LEFT)) { if (nowD != Direction(1, 0)) nowD = { -1,0 }; } if (KEYDOWN(VK_RIGHT)) { if (nowD != Direction(-1, 0)) nowD = { 1,0 }; } } snake.head->dir = nowD; for (SnakeBody p = snake.head->next;p; p = p->next) { p->dir = p->prev->pos - p->pos; } if (Map[snake.head->pos.y + snake.head->dir.y][snake.head->pos.x + snake.head->dir.x] == 1) { break; } if (Map[snake.head->pos.y + snake.head->dir.y][snake.head->pos.x + snake.head->dir.x] == 3) { SnakeBody q = new SnakeNode(); q->dir = snake.tail->dir; q->pos = snake.tail->pos - snake.tail->dir; q->next = NULL; q->prev = snake.tail; snake.tail->next = q; snake.tail = q; snake.length++; Map[q->pos.y][q->pos.x] = 1; CreateFood(); } if (Map[snake.head->pos.y][snake.head->pos.x] == 1) { break; } MoveSnake(snake); PaintSnake(snake); if (snake.length == MAP_SIZE * MAP_SIZE - 1) { win = true; break; } if (snake.head->pos.x < 0 || snake.head->pos.x >= MAP_SIZE || snake.head->pos.y < 0 || snake.head->pos.y >= MAP_SIZE) { break; } Sleep(200); }} -------------本文结束感谢您的阅读------------- 亲,可以打赏点吗?. 打赏 微信支付 支付宝 本文作者: GaryCao 发表时间: 2017年07月01日 - 12:37 最后更新: 2017年11月11日 - 13:36 本文链接: http://garycao97.github.io/2017/07/01/控制台小游戏合集(持续更新)/ 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!