void gotoxy(int x, int y) {
COORD pos;
pos.X = 2 * y; pos.Y = x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
用于制造比较大的,清屏后输出比较慢的地图(此处因为我地图的每个格子是占两个字符的,故使用2*y)
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
初始化时要设定长度,位置,地图以及提示信息,例如:
color(136);
for (int i = 0; i <= N + 1; i++) printf("$ ");
color(15);
puts("");
for (int i = 1; i <= N; i++) {
color(136);
printf("$ ");
color(15);
for (int j = 1; j <= N; j++) printf(". ");
color(136);
printf("$ ");
color(15);
puts("");
}
color(136);
for (int i = 0; i <= N + 1; i++) printf("$ ");
color(15);
puts("");
gotoxy(0, N + 2);
color(15);
printf("use 'w','a','s','d' to move.");
color(15);
gotoxy(2, N + 2);
color(15);
printf("other key to pause.");
color(15);
gotoxy(4, N + 2);
color(15);
printf("point: 0");
color(15);
(这烦人的缩进)
‘$ ’是围栏,‘. ’是空地
此处使用pair<int,int>来表示坐标,first表示x坐标,second表示y坐标(下称pair)
首先,建立一个pair来保存苹果的坐标,否则就不好判断吃到没有了。
然后要防止把苹果放在蛇上。
用‘O ’来表示苹果。
while (1) {
apple.first = rand() % N + 1;
apple.second = rand() % N + 1;
bool flag = false;
for (int i = 0; i < len; i++) {
if (apple.first == snake[i].first && apple.second == snake[i].second) {
flag = true;
break;
}
}
if (!flag) break;
}
gotoxy(apple.first, apple.second);
color(14);
printf("O ");
color(15);
这个应该大家能看懂
bool gameover() {
if (snake[0].first == 0 || snake[0].first == N + 1 || snake[0].second == 0 || snake[0].second == N + 1) {
return true;
}
for (int i = 1; i < len; i++) {
if (snake[0].first == snake[i].first && snake[0].second == snake[i].second) {
return true;
}
}
return false;
}
先检测蛇头有没有碰到,如果碰到了就增加长度。
void eat() {
if (snake[0].first == apple.first && snake[0].second == apple.second) {
len++;
snake[len - 1].first = snake[len - 2].first;
snake[len - 1].second = snake[len - 2].second;
create();
gotoxy(4, N + 6);
color(15);
printf("%d", len - 1);
color(15);
}
}
void move(int dx, int dy) {
gotoxy(snake[len - 1].first, snake[len - 1].second);
color(15);
printf(". ");
color(15);
gotoxy(snake[0].first + dx, snake[0].second + dy);
color(14);
printf("# ");
color(15);
for (int i = len - 1; i > 0; i--) {
snake[i].first = snake[i - 1].first;
snake[i].second = snake[i - 1].second;
}
snake[0].first += dx;
snake[0].second += dy;
}
移到蛇尾,用空地覆盖它,然后到蛇头,打一个蛇头,其他的向前移。
char getkey() {
char res = ch;
if (kbhit()) {
gotoxy(N + 1, 0);
res = getche();
}
return res;
}
这个要用conio.h头文件,kbhit()是检测键盘按下的。
int main() {
srand(time(NULL));
N = 30;
init();
len = 1;
snake[0].first = rand() % N + 1;
snake[0].second = rand() % N + 1;
while (gameover()) {
snake[0].first = rand() % N + 1;
snake[0].second = rand() % N + 1;
}
gotoxy(snake[0].first, snake[0].second);
color(14);
printf("# ");
color(15);
for (int i = 1; i < N; i++) {
snake[i].first = snake[0].first;
snake[i].second = snake[0].second;
gotoxy(snake[i].first, snake[i].second);
color(14);
printf("# ");
color(15);
}
create();
while (!gameover()) {
eat();
ch = getkey();
switch (ch) {
case 'w': move(-1, 0); break;
case 'a': move(0, -1); break;
case 's': move(1, 0); break;
case 'd': move(0, 1); break;
}
Sleep(200);
}
return 0;
}
#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>
using namespace std;
#define MAX_N 1000
#define MAX_LEN 1000
void gotoxy(int x, int y) {
COORD pos;
pos.X = 2 * y; pos.Y = x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void color(int a) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}
pair<int, int> snake[MAX_LEN], apple;
int len, N;
char ch = 'p';
void init() {
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
color(136);
for (int i = 0; i <= N + 1; i++) printf("$ ");
color(15);
puts("");
for (int i = 1; i <= N; i++) {
color(136);
printf("$ ");
color(15);
for (int j = 1; j <= N; j++) printf(". ");
color(136);
printf("$ ");
color(15);
puts("");
}
color(136);
for (int i = 0; i <= N + 1; i++) printf("$ ");
color(15);
puts("");
gotoxy(0, N + 2);
color(15);
printf("use 'w','a','s','d' to move.");
color(15);
gotoxy(2, N + 2);
color(15);
printf("other key to pause.");
color(15);
gotoxy(4, N + 2);
color(15);
printf("point: 0");
color(15);
}
void create() {
while (1) {
apple.first = rand() % N + 1;
apple.second = rand() % N + 1;
bool flag = false;
for (int i = 0; i < len; i++) {
if (apple.first == snake[i].first && apple.second == snake[i].second) {
flag = true;
break;
}
}
if (!flag) break;
}
gotoxy(apple.first, apple.second);
color(14);
printf("O ");
color(15);
}
bool gameover() {
if (snake[0].first == 0 || snake[0].first == N + 1 || snake[0].second == 0 || snake[0].second == N + 1) {
return true;
}
for (int i = 1; i < len; i++) {
if (snake[0].first == snake[i].first && snake[0].second == snake[i].second) {
return true;
}
}
return false;
}
void eat() {
if (snake[0].first == apple.first && snake[0].second == apple.second) {
len++;
snake[len - 1].first = snake[len - 2].first;
snake[len - 1].second = snake[len - 2].second;
create();
gotoxy(4, N + 6);
color(15);
printf("%d", len - 1);
color(15);
}
}
void move(int dx, int dy) {
gotoxy(snake[len - 1].first, snake[len - 1].second);
color(15);
printf(". ");
color(15);
gotoxy(snake[0].first + dx, snake[0].second + dy);
color(14);
printf("# ");
color(15);
for (int i = len - 1; i > 0; i--) {
snake[i].first = snake[i - 1].first;
snake[i].second = snake[i - 1].second;
}
snake[0].first += dx;
snake[0].second += dy;
}
char getkey() {
char res = ch;
if (kbhit()) {
gotoxy(N + 1, 0);
res = getche();
}
return res;
}
int main() {
srand(time(NULL));
N = 30;
init();
len = 1;
snake[0].first = rand() % N + 1;
snake[0].second = rand() % N + 1;
while (gameover()) {
snake[0].first = rand() % N + 1;
snake[0].second = rand() % N + 1;
}
gotoxy(snake[0].first, snake[0].second);
color(14);
printf("# ");
color(15);
for (int i = 1; i < N; i++) {
snake[i].first = snake[0].first;
snake[i].second = snake[0].second;
gotoxy(snake[i].first, snake[i].second);
color(14);
printf("# ");
color(15);
}
create();
while (!gameover()) {
eat();
ch = getkey();
switch (ch) {
case 'w': move(-1, 0); break;
case 'a': move(0, -1); break;
case 's': move(1, 0); break;
case 'd': move(0, 1); break;
}
Sleep(200);
}
return 0;
}
如有错误请在下方评论区留言。
原文:https://www.cnblogs.com/liuchenyun/p/tan-chi-she.html