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