#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <time.h>
using namespace std ;
const int N = 23;
struct Point {
int x,y;
void set(int X, int Y) {x=X; y=Y;}
};
HANDLE hIn, hOut; //I/O 控制器
Point body[32], cookie, v = {-2,0}; //體塊, 食物, 移動向量,
char room[N][N*2+4]; //房間
int delay_time = 100; //延遲時間
int x1=2,y1=1,x2=(N-1)*2,y2=N-1, len=2; //房間邊界, 身長
bool bExit = false; //是否持續遊戲
void gotoxy (int x, int y)
{
static COORD c;
c.X = x; c.Y = y;
SetConsoleCursorPosition (hOut, c);
}
void draw (int x, int y, char* s)
{
gotoxy (x,y);
cout << s;
}
void drawList (char* a, char* b, char* c, int w, int h=1)
{
static char* p = room[0];
for (int i; h--; *p++=*c, *p++=c[1], *p++=0, p++)
for (*p++='\n', *p++=*a, *p++=a[1], *p++=a[2],
i=w-2; i--;) *p++=*b, *p++=b[1];
}
void put_cookie ()
{
cookie.x = 3 + rand()%(N-2) * 2;
cookie.y = 2 + rand()%(N-3);
}
void init()
{
srand (time(0));
hOut = GetStdHandle (STD_OUTPUT_HANDLE);
hIn = GetStdHandle (STD_INPUT_HANDLE);
HANDLE err = INVALID_HANDLE_VALUE;
if (hIn == err || hOut == err) {
puts ("handle failed");
getch ();
exit (1);
}
drawList (" ┌","─","┐", N);
drawList (" │"," ","│", N, N-2);
drawList (" └","─","┘", N);
gotoxy (0,0);
for (int i=0; i<N; i++) cout << room[i];
put_cookie ();
body[0].set ((x2-x1)/2, (y2-y1)/2);
body[1].set (body[0].x+1, body[0].y);
}
void key_control()
{
static DWORD count;
static INPUT_RECORD ir;
ReadConsoleInput (hIn, &ir, 1, &count);
if (!ir.Event.KeyEvent.bKeyDown) return;
switch (ir.Event.KeyEvent.wVirtualKeyCode) {
case VK_UP : if (v.y != 1) v.set(0,-1); break;
case VK_DOWN : if (v.y != -1) v.set(0, 1); break;
case VK_LEFT : if (v.x != 2) v.set(-2,0); break;
case VK_RIGHT: if (v.x != -2) v.set( 2,0); break;
case VK_ESCAPE: bExit = true;
}
}
void move_snack()
{
int i;
int& x = body[0].x;
int& y = body[0].y;
for (i=1; i<len; i++) //檢查自身碰撞
if (body[0].x == body[i].x &&
body[0].y == body[i].y ) break;
if (i!=len || x<=x1 || x>x2 || y<=y1 || y>y2) {
draw (14,10,"G a m e O v e r");
getch(); bExit = true;
return;
}
if (x == cookie.x && y == cookie.y) { //吃到食物
delay_time -= 2;
if (++len > 30) {
draw (16,10, "Y o u W i n");
getch(); bExit = true;
return;
}put_cookie();
}
else draw (body[len-1].x, body[len-1].y, " ");
for (i=len-1; i>0; --i)
body[i] = body[i-1];
x += v.x;
y += v.y;
for (i=0; i<len; ++i)
draw (body[i].x, body[i].y, "█");
}
int main ()
{
init();
while (!bExit)
{
Sleep (delay_time); if (kbhit()) key_control();
draw (cookie.x, cookie.y, "◎");
move_snack();
Sleep (delay_time); if (kbhit()) key_control();
gotoxy (10,24);
printf ("cookie: (%2d,%2d) head: (%2d,%2d)",
cookie.x, cookie.y, body[0].x, body[0].y);
}
}
I2luY2x1ZGUgPHdpbmRvd3MuaD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGNvbmlvLmg+CiNpbmNsdWRlIDx0aW1lLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQgOwoKY29uc3QgaW50IE4gPSAyMzsKCnN0cnVjdCBQb2ludCB7CiAgICBpbnQgeCx5OwogICAgdm9pZCBzZXQoaW50IFgsIGludCBZKSB7eD1YOyB5PVk7fQp9OwoKSEFORExFIGhJbiwgaE91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0kvTyDmjqfliLblmagKUG9pbnQgIGJvZHlbMzJdLCBjb29raWUsIHYgPSB7LTIsMH07ICAgICAgICAvL+mrlOWhiiwg6aOf54mpLCDnp7vli5XlkJHph48sCmNoYXIgICByb29tW05dW04qMis0XTsgICAgICAgICAgICAgICAgICAgICAgLy/miL/plpMKaW50ICAgIGRlbGF5X3RpbWUgPSAxMDA7ICAgICAgICAgICAgICAgICAgICAvL+W7tumBsuaZgumWkwppbnQgICAgeDE9Mix5MT0xLHgyPShOLTEpKjIseTI9Ti0xLCBsZW49MjsgIC8v5oi/6ZaT6YKK55WMLCDouqvplbcKYm9vbCAgIGJFeGl0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAvL+aYr+WQpuaMgee6jOmBiuaIsgoKdm9pZCBnb3RveHkgKGludCB4LCBpbnQgeSkKewogICAgc3RhdGljIENPT1JEIGM7IAogICAgYy5YID0geDsgYy5ZID0geTsKICAgIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbiAoaE91dCwgYyk7Cn0KCnZvaWQgZHJhdyAoaW50IHgsIGludCB5LCBjaGFyKiBzKQp7CiAgICBnb3RveHkgKHgseSk7CiAgICBjb3V0IDw8IHM7Cn0KCnZvaWQgZHJhd0xpc3QgKGNoYXIqIGEsIGNoYXIqIGIsIGNoYXIqIGMsIGludCB3LCBpbnQgaD0xKQp7CiAgICBzdGF0aWMgY2hhciogcCA9IHJvb21bMF07CiAgICBmb3IgKGludCBpOyBoLS07ICpwKys9KmMsICpwKys9Y1sxXSwgKnArKz0wLCBwKyspCiAgICAgICAgZm9yICgqcCsrPSdcbicsICpwKys9KmEsICpwKys9YVsxXSwgKnArKz1hWzJdLAogICAgICAgICAgICBpPXctMjsgaS0tOykgKnArKz0qYiwgKnArKz1iWzFdOyAKfQp2b2lkIHB1dF9jb29raWUgKCkKewogICAgY29va2llLnggPSAzICsgcmFuZCgpJShOLTIpICogMjsKICAgIGNvb2tpZS55ID0gMiArIHJhbmQoKSUoTi0zKTsKICAKfQoKdm9pZCBpbml0KCkKewogICAgc3JhbmQgKHRpbWUoMCkpOwogICAgaE91dCA9IEdldFN0ZEhhbmRsZSAoU1REX09VVFBVVF9IQU5ETEUpOwogICAgaEluICA9IEdldFN0ZEhhbmRsZSAoU1REX0lOUFVUX0hBTkRMRSk7CiAgICBIQU5ETEUgZXJyID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiAgICBpZiAoaEluID09IGVyciB8fCBoT3V0ID09IGVycikgewogICAgICAgIHB1dHMgKCJoYW5kbGUgZmFpbGVkIik7CiAgICAgICAgZ2V0Y2ggKCk7CiAgICAgICAgZXhpdCAoMSk7CiAgICB9CiAgICBkcmF3TGlzdCAoIiDilIwiLCLilIAiLCLilJAiLCBOKTsgIAogICAgZHJhd0xpc3QgKCIg4pSCIiwiICAiLCLilIIiLCBOLCBOLTIpOwogICAgZHJhd0xpc3QgKCIg4pSUIiwi4pSAIiwi4pSYIiwgTik7CgogICAgZ290b3h5ICgwLDApOwogICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgY291dCA8PCByb29tW2ldOwogICAgcHV0X2Nvb2tpZSAoKTsKICAKICAgIGJvZHlbMF0uc2V0ICgoeDIteDEpLzIsICh5Mi15MSkvMik7CiAgICBib2R5WzFdLnNldCAoYm9keVswXS54KzEsIGJvZHlbMF0ueSk7Cn0KCnZvaWQga2V5X2NvbnRyb2woKQp7CiAgICBzdGF0aWMgRFdPUkQgY291bnQ7CiAgICBzdGF0aWMgSU5QVVRfUkVDT1JEIGlyOwogICAgICAgCiAgICBSZWFkQ29uc29sZUlucHV0IChoSW4sICZpciwgMSwgJmNvdW50KTsKICAgIGlmICghaXIuRXZlbnQuS2V5RXZlbnQuYktleURvd24pIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgCiAgICBzd2l0Y2ggKGlyLkV2ZW50LktleUV2ZW50LndWaXJ0dWFsS2V5Q29kZSkgeyAgICAgICAgICAgICAgICAgICAKICAgICAgICBjYXNlIFZLX1VQICAgOiBpZiAodi55ICE9ICAxKSB2LnNldCgwLC0xKTsgYnJlYWs7CiAgICAgICAgY2FzZSBWS19ET1dOIDogaWYgKHYueSAhPSAtMSkgdi5zZXQoMCwgMSk7IGJyZWFrOwogICAgICAgIGNhc2UgVktfTEVGVCA6IGlmICh2LnggIT0gIDIpIHYuc2V0KC0yLDApOyBicmVhazsgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIGNhc2UgVktfUklHSFQ6IGlmICh2LnggIT0gLTIpIHYuc2V0KCAyLDApOyBicmVhazsKICAgICAgICBjYXNlIFZLX0VTQ0FQRTogYkV4aXQgPSB0cnVlOwogICAgfSAgICAgICAKfQoKdm9pZCBtb3ZlX3NuYWNrKCkKeyAgCiAgICBpbnQgaTsKICAgIGludCYgeCA9IGJvZHlbMF0ueDsKICAgIGludCYgeSA9IGJvZHlbMF0ueTsKICAgIGZvciAoaT0xOyBpPGxlbjsgaSsrKSAgICAgICAgICAgICAgICAgICAvL+aqouafpeiHqui6q+eisOaSngogICAgICAgIGlmIChib2R5WzBdLnggPT0gYm9keVtpXS54ICYmCiAgICAgICAgICAgIGJvZHlbMF0ueSA9PSBib2R5W2ldLnkgKSBicmVhazsKCiAgICBpZiAoaSE9bGVuIHx8IHg8PXgxIHx8IHg+eDIgfHwgeTw9eTEgfHwgeT55MikgewogICAgICAgIGRyYXcgKDE0LDEwLCJHIGEgbSBlICAgIE8gdiBlIHIiKTsKICAgICAgICBnZXRjaCgpOyBiRXhpdCA9IHRydWU7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHggPT0gY29va2llLnggJiYgeSA9PSBjb29raWUueSkgeyAgIC8v5ZCD5Yiw6aOf54mpCiAgICAgICAgZGVsYXlfdGltZSAtPSAyOwogICAgICAgIGlmICgrK2xlbiA+IDMwKSB7CiAgICAgICAgICAgIGRyYXcgKDE2LDEwLCAiWSBvIHUgICAgVyBpIG4iKTsKICAgICAgICAgICAgZ2V0Y2goKTsgYkV4aXQgPSB0cnVlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfXB1dF9jb29raWUoKTsKICAgIH0KICAgIGVsc2UgZHJhdyAoYm9keVtsZW4tMV0ueCwgYm9keVtsZW4tMV0ueSwgIiAgIik7CgogICAgZm9yIChpPWxlbi0xOyBpPjA7IC0taSkKICAgICAgICBib2R5W2ldID0gYm9keVtpLTFdOwogICAgeCArPSB2Lng7CiAgICB5ICs9IHYueTsKICAgIGZvciAoaT0wOyBpPGxlbjsgKytpKQogICAgICAgIGRyYXcgKGJvZHlbaV0ueCwgYm9keVtpXS55LCAi4paIIik7Cn0KCgppbnQgbWFpbiAoKQp7CiAgICBpbml0KCk7CiAgICB3aGlsZSAoIWJFeGl0KQogICAgeyAgICAgICAKICAgICAgICBTbGVlcCAoZGVsYXlfdGltZSk7IGlmIChrYmhpdCgpKSBrZXlfY29udHJvbCgpOwogICAgICAgIGRyYXcgKGNvb2tpZS54LCBjb29raWUueSwgIuKXjiIpOwogICAgICAgIG1vdmVfc25hY2soKTsKICAgICAgICBTbGVlcCAoZGVsYXlfdGltZSk7IGlmIChrYmhpdCgpKSBrZXlfY29udHJvbCgpOyAgICAgICAgICAgCiAgICAgICAgZ290b3h5ICgxMCwyNCk7CiAgICAgICAgcHJpbnRmICgiY29va2llOiAoJTJkLCUyZCkgIGhlYWQ6ICglMmQsJTJkKSIsCiAgICAgICAgICAgIGNvb2tpZS54LCBjb29raWUueSwgYm9keVswXS54LCBib2R5WzBdLnkpOwogICAgfQp9