发1061109567度高烧做的贪吃蛇
2024-09-01 14:37:00
发布于:广东
原理:自己模拟一个循环队列,里面记录蛇的头或身子的位置
修改就只用改头,原来的头和尾巴就行,速度直接拉满
使用上下左右不是WASD移动
//我不希望我的贪吃蛇代码被敌人捡到能直接使用
#include <windows.h>
#include <iostream>
#include <conio.h>
#include <bitset>
#include <cstdio>
#include <ctime>
#define gotoxy(x, y){COORD pos = {short(x), short(y)}; HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOut, pos);}
#define checklr(tmp) (tmp % roomsize <= 0 && cur == 4 || tmp % roomsize == roomsize - 1 && cur == 2)
#define getmove() (front() + (cur == 1 ? -roomsize : (cur == 2 ? -1 : (cur == 3 ? roomsize : 1))))
#define drawwall(){cls(); home() headwall(roomsize + 2) mainwall() end() headwall(roomsize + 2)}
#define ___main___ using namespace std; __INIT__; __SNAKE__; __VIS__; int main(){__main__();}
#define size() (__FRONT__ < __BACK__ ? __FRONT__ - __BACK__ + MAXNN : __FRONT__ - __BACK__)
#define checkkey1(){if(c1 == 224){cur = (c2 == 72 ? 1 : (c2 == 75 ? 2 : checkkey2()));}}
#define getc1c2(){while(!kbhit())go() c1 = getch(); while(!kbhit()) go() c2 = getch();}
#define move(){int tmp = getmove(); if(checkmove(tmp)){dead = 1; goto end_;} moveeat()}
#define movedraw(){draw(tmp, 'O') draw(front(), 'o') if(tmp != food) draw(back(), 32)}
#define mainwall() rep(i, 1, roomsize){__draw(0, i, '#') __draw(roomsize + 1, i, '#')}
#define createsnake(){rep(i, 0, 2){push(i) draw(i, 'o') vis[0][i] = 1;} draw(3, 'O')}
#define modifyfood(){draw(food, '$'); modifyvis2(rfood, 0); modifyvis2(food, 1);}
#define init__(){srand(time(0) * 10ll), roomsize = 25, cur = 4, waittime = 80;}
#define getfood(){int rfood = food; food = randfood(); addloc() modifyfood()}
#define moveeat(){movevis() movedraw() moveque() if(tmp == food) getfood();}
#define movevis(){modifyvis(tmp, 1); if(tmp != food) modifyvis(back(), 0);}
#define game(){__init__(); getfood(); while(1){getc1c2() checkkey1() go()}}
#define push(n){snake[__FRONT__] = n, __FRONT__ = (__FRONT__ + 1) % NN;}
#define checkmove(tmp) (checklr(tmp) || checkcf(tmp) || checkvis(tmp))
#define randfood() (rand() % max(roomsize * roomsize - size() - 1, 1))
#define draw(tmp, c) __draw(tmp % roomsize + 1, tmp / roomsize + 1, c)
#define addloc() rep(i, 0, food){food += checkvis(i) + checkvis2(i);}
#define modifyvis2(tmp, b) vis2[tmp / roomsize][tmp % roomsize] = b
#define modifyvis(tmp, b) vis[tmp / roomsize][tmp % roomsize] = b
#define __INIT__ int roomsize, cur, dead, c1, c2, food, waittime
#define checkvis2(tmp) (vis2[tmp / roomsize][tmp % roomsize])
#define checkcf(tmp) (tmp < 0 || tmp > roomsize * roomsize)
#define checkvis(tmp) (vis[tmp / roomsize][tmp % roomsize])
#define checkkey2() (c2 == 80 ? 3 : (c2 == 77 ? 4 : cur))
#define __SNAKE__ int snake[MAXNN], __FRONT__, __BACK__
#define clear(){snake[0] = __FRONT__ = __BACK__ = 0;}
#define __VIS__ bitset <MAXN> vis[MAXN], vis2[MAXN]
#define moveque(){push(tmp) if(tmp != food) pop()}
#define headwall(size) rep(i, 1, size){pc('#');}
#define rep(i, l, r) for(int i = l; i <= r; i++)
#define pop(){__BACK__ = (__BACK__ + 1) % NN;}
#define __draw(x, y, c){gotoxy(x, y) pc(c);}
#define __init(){drawwall() createsnake()}
#define __main__(){game(); end_: end();}
#define go() {move(); Sleep(waittime);}
#define front() (snake[__FRONT__ - 1])
#define end() gotoxy(0, roomsize + 1)
#define __init__(){init__() __init()}
#define back() (snake[__BACK__])
#define home() gotoxy(0, 0)
#define cls() system("cls")
#define pc(c) putchar(c)
#define MAXNN (NN + MAX)
#define MAXN (N + MAX)
#define NN (N * N)
#define MAX 5
#define N 25
___main___
全部评论 7
9
2024-09-01 来自 广东
0整体不错,不知道下次速度可不可以慢一点
2024-09-01 来自 江西
021行的
init__()
函数里面的waittime
变量就是等待时间,可以随便改2024-09-01 来自 广东
0哦哦,我不知道。现在试试
2024-09-01 来自 江西
0
难崩
2024-08-31 来自 广东
0边写边笑
2024-08-31 来自 广东
0
孩纸,你没事吧
2024-08-30 来自 浙江
0没逝,还在加密
2024-08-30 来自 广东
0完了
2024-08-30 来自 浙江
0
顶
2024-08-30 来自 广东
0代码正常人应该都能看得懂吧
2024-08-30 来自 广东
0顶
2024-08-30 来自 广东
0
有帮助,赞一个