花了两天时间撸了个贪吃蛇(实在太闲). 感觉这玩意也不难啊, 写着写着就写出来了, 这里使用 VS2013 自制, 需要项目源码 加小编 C++ 学习群: 825414254 可以获取各类 C++ 学习资料
运行一下试试看
- #include<Windows.h>#include<conio.h>#include<time.h>#include<string>using namespace std;/*=============== all the structures ===============*/typedef struct Frame
- {
- COORD position[2];// 位置
- int flag;
- }Frame;// 帧 /*=============== all the functions ===============*/void SetPos(COORD a)// set cursor 设置光标{
- HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleCursorPosition(out, a);
- }/* set cursor 设置光标 */void SetPos(int i, int j){
- COORD pos = {
- i, j
- };
- SetPos(pos);
- }void HideCursor(){
- CONSOLE_CURSOR_INFO cursor_info = {
- 1, 0
- };
- SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
- }// 把第 y 行,[x1, x2) 之间的坐标填充为 chvoid drawRow(int y, int x1, int x2, char ch){
- SetPos(x1, y); for (int i = 0; i <= (x2 - x1); i++) cout <<ch;
- }// 在 a, b 纵坐标相同的前提下, 把坐标 [a, b] 之间填充为 chvoid drawRow(COORD a, COORD b, char ch){
- if (a.Y == b.Y)
- drawRow(a.Y, a.X, b.X, ch); else
- {
- SetPos(0, 25); cout << "error code 01: 无法填充行, 因为两个坐标的纵坐标 (x) 不相等";
- system("pause");
- }
- }// 把第 x 列,[y1, y2] 之间的坐标填充为 chvoid drawCol(int x, int y1, int y2, char ch){
- int y = y1; while (y != y2 + 1)
- {
- SetPos(x, y); cout << ch;
- y++;
- }
- }// 在 a, b 横坐标相同的前提下, 把坐标 [a, b] 之间填充为 chvoid drawCol(COORD a, COORD b, char ch){
- if (a.X == b.X)
- drawCol(a.X, a.Y, b.Y, ch); else
- {
- SetPos(0, 25); cout << "error code 02: 无法填充列, 因为两个坐标的横坐标 (y) 不相等";
- system("pause");
- }
- }// 左上角坐标, 右下角坐标, 用 row 填充行, 用 col 填充列 void drawFrame(COORD a, COORD b, char row, char col){
- drawRow(a.Y, a.X + 1, b.X - 1, row);
- drawRow(b.Y, a.X + 1, b.X - 1, row);
- drawCol(a.X, a.Y + 1, b.Y - 1, col);
- drawCol(b.X, a.Y + 1, b.Y - 1, col);
- }// 点覆盖 void drawFrame(COORD a, char r){
- SetPos(a.X, a.Y); cout << r;
- }void drawFrame(int x1, int y1, int x2, int y2, char row, char col){
- COORD a = {
- x1, y1
- };
- COORD b = {
- x2, y2
- };
- drawFrame(a, b, row, col);
- }void drawFrame(Frame frame, char row, char col){
- COORD a = frame.position[0];
- COORD b = frame.position[1];
- drawFrame(a, b, row, col);
- }void drawPlaying(){
- drawFrame(0, 0, 48, 24, '=', '|');// draw map frame;
- drawFrame(49, 0, 77, 24, '-', '|');// draw output frame
- SetPos(52, 6); cout << "玩家 1 长度:";
- SetPos(52, 8); cout << "玩家 2 长度:";
- SetPos(52, 14); cout << "操作方式:";
- SetPos(52, 16); cout << "玩家 1 上下左右";
- SetPos(52, 17); cout << "玩家 2 a,s,d,w";
- SetPos(52, 19); cout << "p 暂停游戏.";
- SetPos(52, 20); cout << "esc 退出游戏.";
- }// 在 [a, b) 之间产生一个随机整数 int random(int a, int b){
- int c = (rand() % (a - b)) + a; return c;
- }// 在两个坐标包括的矩形框内随机产生一个坐标 COORD random(COORD a, COORD b){
- int x = random(a.X, b.X); int y = random(a.Y, b.Y);
- COORD c = {
- x, y
- }; return c;
- }// 判断是否撞到蛇身或者墙壁 点对点 bool judgeCoordSnake(COORD spot1, COORD spot2){
- if (spot1.X == spot2.X) if (spot1.Y == spot2.Y) return true; if (spot1.X == 0 || spot1.X == 48 || spot1.Y == 0 || spot1.Y == 24) return true; return false;
- }// 判断是否撞到蛇身或者墙壁 头对身子 bool judgeCoordSnake(COORD spot1, COORD *snake1, COORD *snake2){
- for (int i = 1; i < 250; i++)
- {
- if (spot1.X == snake1[i].X) if (spot1.Y == snake1[i].Y) return false; if (spot1.X == snake2[i].X) if (spot1.Y == snake2[i].Y) return false; if (spot1.X == 0 || spot1.X == 48 || spot1.Y == 0 || spot1.Y == 24) return false;
- } return true;
- }bool judgeCoordSnakeFood(COORD spot1, COORD spot2, COORD spot3,int& a){
- if (spot1.X == spot2.X) if (spot1.Y == spot2.Y)
- {
- a = 0; return true;
- } if (spot1.X == spot3.X) if (spot1.Y == spot3.Y)
- {
- a = 1; return true;
- } return false;
- }// 因为在判断时头部的问题所以单列出来
- void printCoord(COORD a){
- cout << "(" << a.X << "," << a.Y << ")";
- }int drawMenu(){
- SetPos(30, 1); cout << "贪吃的大蟒蛇";
- drawRow(3, 0, 79, '-');
- drawRow(5, 0, 79, '-');
- SetPos(28, 4); cout << "w 和 s 选择, k 确定";
- SetPos(15, 11); cout << "开始游戏";
- SetPos(15, 13); cout << "结束游戏";
- drawRow(20, 0, 79, '-');
- drawRow(22, 0, 79, '-');
- SetPos(47, 11); cout << "本游戏为双人游戏:";
- SetPos(51, 13); cout << "wasd 和 ijkl 控制";
- SetPos(24, 21); cout << "制作: 威微游戏制造厂厂长 唐宇威"; int j = 11;
- SetPos(12, j); cout <<"->"; while (1)
- {
- if (_kbhit())
- {
- char x = _getch(); switch (x)
- {
- case 'w':
- {
- if (j == 13)
- {
- SetPos(12, j); cout <<" ";
- j = 11;
- SetPos(12, j); cout << "->";
- SetPos(51, 13); cout <<" ";
- SetPos(47, 11); cout << "准备好了吗?";
- SetPos(51, 13); cout << "wasd 和 ijkl 控制";
- } break;
- } case 's':
- {
- if (j == 11)
- {
- SetPos(12, j); cout << " ";
- j = 13;
- SetPos(12, j); cout << "->";
- SetPos(51, 13); cout <<" ";
- SetPos(47, 11); cout << "结束游戏:";
- SetPos(51, 13); cout << "要走了吗?";
- } break;
- } case 'k':
- {
- if (j == 11)
- return 1; else exit(0);
- }
- }
- }
- }
- }/*
- DWORD WINAPI MusicFun(LPVOID lpParamte)
- {
- //DWORD OBJ;
- sndPlaySound(TEXT("bgm.wav"), SND_FILENAME|SND_ASYNC);
- return 0;
- }
- *//*================== the Game Class ==================*/class Game
- {
- public:
- COORD snake1[250];
- COORD snake2[250];
- COORD food[2]; int length1; int length2; int direction1;// 蛇 1 的头 1 上 2 下 3 左 4 右
- int direction2;// 蛇 2 的头 1 上 2 下 3 左 4 右
- string title; // 初始化所有
- void initFood(); COORD randomFood(); // 初始化其中一个
- //void initThisBullet( COORD );
- //void initThisEnemy( Frame );
- void Playing(); void Pause(); void judgeSnake(); void GameOver(); void snake1ChangeDirection(char x); void snake2ChangeDirection(char x); void drawSnake1(int direction); void drawSnake2(int direction); void drawSnake1ToNull(); void drawSnake2ToNull(); void drawFood(); void drawFoodToNull();
- Game()
- {
- direction1 = 1,direction2 = 1;
- snake1[0] = {
- 8, 15
- }, snake1[1] = {
- 8, 16
- }, snake1[2] = {
- 8, 17
- };
- snake2[0] = {
- 40, 15
- }, snake2[1] = {
- 40, 16
- }, snake2[2] = {
- 40, 17
- };
- length1 = 3, length2 = 3; for (int i = 3; i < 249; i++)
- {
- snake1[i] = {
- 0, 0
- };
- snake2[i] = {
- 0, 0
- };
- }
- }
- };// 画第一条蛇 void Game::drawSnake1(int direction)
- {
- for (int i = 0; i<240; i++)
- {
- SetPos(snake1[i]); if (i != 0) cout << "O"; else if (i == 0)
- {
- if (direction==1)
- {
- cout << "^";
- } else if(direction == 2)
- {
- cout << "v";
- } else if (direction == 3)
- {
- cout << "<";
- } else if (direction == 4)
- {
- cout << ">";
- }
- }
- }
- }void Game::drawSnake2(int direction)
- {
- for (int i = 0; i<240; i++)
- {
- SetPos(snake2[i]); if (i != 0) cout <<"X"; else if (i == 0)
- {
- if (direction == 1)
- {
- cout << "^";
- } else if (direction == 2)
- {
- cout << "v";
- } else if (direction == 3)
- {
- cout << "<";
- } else if (direction == 4)
- {
- cout << ">";
- }
- }
- }
- }// 把第一条蛇消失, 行动时使用, 只让蛇头蛇尾消失, 这样不会一闪一闪 void Game::drawSnake1ToNull()
- {
- SetPos(snake1[0]); cout << " ";
- SetPos(snake1[length1]); cout << " ";
- }void Game::drawSnake2ToNull()
- {
- /*for (int i = length2; i<240; i++)
- {
- SetPos(snake2[i]);
- cout << " ";
- }*/
- SetPos(snake2[0]); cout << " ";
- SetPos(snake2[length2]); cout << " ";
- }// 初始食物 void Game::initFood()
- {
- COORD a = {
- 2, 2
- };
- COORD b = {
- 24,12
- };
- COORD c = {
- 25, 2
- };
- COORD d = {
- 47,14
- };
- food[0] = random(a, b);
- food[1] = random(c, d);
- }// 随机食物, 如果有墙需要修改. COORD Game::randomFood()
- {
- COORD food;
- COORD a = {
- 2, 2
- };
- COORD b = {
- 47, 23
- }; while (1)
- {
- food = random(a, b); if (judgeCoordSnake(food, snake1, snake2)) return food;
- }
- }// 画出食物
- void Game::drawFood()
来源: http://www.jianshu.com/p/1e46c1d726a2