C++实现的控制台-贪吃蛇
周六终于可以抽出一整段时间了
想了想就写个贪吃蛇吧 第一次写 差不多下了140行 也不算太多吧
以后ACM比赛是在做不来就自己打个贪吃蛇玩
ps:本来想写个项目的 但是为了方便你们阅读 就写在一个文件里面了
测试了下 无重大BUG 但是 功德圆满 没有测试
知识点:
1:刷新窗口 system("cls");
2: time.h 用来编写时钟系统;
3:SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); 重置光标位置,即你想在那里输出就把光标移到那个地方输出就可以了
开始还有一个思路就是 不用数组存地图 只用定位光标来 更新蛇 后面发现有点困难
4:其他的就是一些C++的基本语法了
感兴趣的可以拿下去玩玩
贴代码:
//基础知识clock_t clock(void) 返回从程序开始到现在为止的时间单位毫秒 CLOCKS_PER_SEC 转换为秒的单位 相当于1000.0 /* 打开exe 后输出普通游戏画面并在地图中间提示 按任意键开始游戏 */ #include<iostream> #include<windows.h> #include<conio.h> #include<time.h> #include<list> #include<string> using namespace std; class retro_snake { private: COORD zz;//缓存前进的点用; list<COORD>snake;//保存蛇 string ma[15]; //保存游戏画面 int direction; //保存现在蛇的前进方向 int grates; int level; //游戏等级 int rate; //游戏速率 public: retro_snake() //初始化游戏 { level = 0; rate = 800; grates = 0; direction = 1; for (int i = 0; i<15; i++) { if (i == 0 || i == 14) ma[i] = "###################################";//35 else ma[i] = "# #"; } zz.X = 17; zz.Y = 7; snake.push_front(zz); } void draw(void) const//绘画游戏界面 { for (int i = 0; i<15; i++) cout << ma[i] << endl; cout << "得分:" << grates << "等级:" << level << endl; cout << "w: 上 s:下 a:左 d:右 空格:暂停 " << endl; } void creat_food()//生成食物 { int x, y; do { x = rand() % 14 + 1; y = rand() % 34 + 1; } while (ma[x][y] != ' '); ma[x][y] = '$'; } void clock_system(void)//时钟系统 控制游戏进行 { double Start = clock(); char ch = 'w'; bool flag;//初始化前进方向 creat_food(); while (1) { while ((clock() - Start)<rate && !(flag=_kbhit()));//一秒后自动读取 或者直接有键入 Start = clock(); if (flag) { ch = _getch(); int direction_; if (ch == ' ')//暂停的功能实现 { while (!_kbhit()); ch = _getch(); Start = clock(); } else if (ch == 'r') { } switch (ch) { case 'w':direction_ = 1; break; case 'a':direction_ = 3; break; case 's':direction_ = 4; break; case 'd':direction_ = 2; break; default:direction_ = 0; } if (direction_ + direction != 5&&direction_!=0) direction = direction_;//如果输入的方向不和现在前进的方向冲突 就改变 } switch (direction) { case 1:zz.X = snake.front().X; zz.Y = snake.front().Y - 1; break; case 2:zz.X = snake.front().X + 1; zz.Y = snake.front().Y; break; case 3:zz.X = snake.front().X - 1; zz.Y = snake.front().Y; break; case 4:zz.X = snake.front().X; zz.Y = snake.front().Y + 1; break; } if (ma[zz.Y][zz.X] == '#' || ma[zz.Y][zz.X] == '.') { COORD coord; coord.X = 3; coord.Y = 8; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); cout << "游戏结束"; Sleep(300); break; } else if (ma[zz.Y][zz.X] == '$') { grates++; level = grates / 10; level = min(5, level); rate = 800 - level * 100; ma[snake.front().Y][snake.front().X] = '.'; snake.push_front(zz); ma[snake.front().Y][snake.front().X] = '@'; if (snake.size() == 429) { COORD coord; coord.X = 3; coord.Y = 8; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); cout << "功德圆满"; Sleep(300); break; } creat_food(); } else { ma[snake.front().Y][snake.front().X] = '.'; snake.push_front(zz); ma[snake.front().Y][snake.front().X] = '@'; ma[snake.back().Y][snake.back().X] = ' '; snake.pop_back(); } system("cls"); draw(); } } void start(void) { draw(); COORD coord; coord.X = 13; coord.Y = 8; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); cout << "按任意键开始"; while (!_kbhit()); char ch =_getch(); system("cls"); draw(); clock_system(); } }; int main() { retro_snake Game; Game.start(); return 0; }