周六終於可以抽出一整段時間了
想了想就寫個貪吃蛇吧 第一次寫 差不多下了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; }