C語言/C加加編程學習之貪吃蛇小游戲源代碼

[代碼運行效果截圖]

[c]代碼庫

#include

#include

#include

#include

#include

#include

#define N 21

//●★

intapple[3];

charscore[3];

chartail[3];

voidgotoxy(intx,?inty)????//輸出坐標

{

????????COORD pos;//WINDOWS API中定義的一個結(jié)構(gòu)表示一個字符在控制臺屏幕上的坐標

????????pos.X = x;

????????pos.Y = y;

????????SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

????????//使光標 到(x沙绝,y)這個位置的函數(shù).

}

voidcolor(intb)?????????//顏色函數(shù)

{

????HANDLEhConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;//用來修改命令行窗口的顏色

????SetConsoleTextAttribute(hConsole,b) ;

}

intBlock(charhead[2])???//判斷出界

{

????????if((head[0] < 1) || (head[0] > N) || (head[1] < 1) || (head[1] > N))

????????????return1;

????????return0;

}

intEat(charsnake[2])???//吃了蘋果

{

????????if((snake[0] == apple[0]) && (snake[1] == apple[1]))

???????{

????????????????apple[0] = apple[1] = apple[2] = 0;

????????????????gotoxy(N+44,10);

????????????????color(13);

????????????????printf("%d",score[0]*10);

????????????????color(11);

????????????????return1;

???????????}

????????return0;

}

voidDraw(char**snake,?intlen)????//蛇移動

{

????????if(apple[2])

????????{

????????????????gotoxy(apple[1] * 2, apple[0]);

????????????????color(12);

????????????????printf("●");

????????????????color(18);//軌跡顏色

????????}

????????gotoxy(tail[1] * 2, tail[0]);

????????if(tail[2])

?????????{?

????????????color(14);

????????????printf("★");

????????????color(11);

?????????}

????else

????????printf("■");

????????gotoxy(snake[0][1] * 2, snake[0][0]);

????????color(14);

????????printf("★");

????????color(11);

????????putchar('\n');

}

char** Move(char**snake,?chardirx,?int*len)???//控制方向

{

????????inti, full = Eat(snake[0]);

????????memcpy(tail, snake[(*len)-1], 2);

????????for(i = (*len) - 1; i > 0; --i)

????????????????memcpy(snake[i], snake[i-1], 2);

????????switch(dirx)

??????????{

???????????case'w':?case'W': --snake[0][0];?break;

???????????case's':?case'S': ++snake[0][0];?break;

???????????case'a':?case'A': --snake[0][1];?break;

???????????case'd':?case'D': ++snake[0][1];?break;

???????????default: ;

?????????}?

????????if(full)??

???????????{

????????????????snake = (char**)realloc(snake,?sizeof(char*) * ((*len) + 1));

????????????????snake[(*len)] = (char*)malloc(sizeof(char) * 2);

????????????????memcpy(snake[(*len)], tail, 2);

????????????????++(*len);

????????????????++score[0];

????????????????if(score[3] < 16)

????????????????++score[3];

????????????????tail[2] = 1;

???????????}

???????????else

????????????????tail[2] = 0;

????????????????returnsnake;

}

voidinit(charplate[N+2][N+2],?char***snake_x,?int*len)??//初始化

{

????????inti, j;

????????char**snake = NULL;

????????*len = 3;

????????score[0] = score[3] =3;

????????snake = (char**)realloc(snake,?sizeof(char*) * (*len));

????????for(i = 0; i < *len; ++i)

????????????????snake[i] = (char*)malloc(sizeof(char) * 2);

????????for(i = 0; i < 3; ++i)

????????????????{

????????????????snake[i][0] = N/2 + 1;

????????????????snake[i][1] = N/2 + 1 + i;

?????????????}

????????for(i = 1; i <= N; ++i)

????????????????for(j = 1; j <= N; ++j)

????????????????????????plate[i][j] = 1;

????????apple[0] =?rand()%N + 1; apple[1] =?rand()%N + 1;

????????apple[2] = 1;

????????for(i = 0; i < N + 2; ++i)

????????????????{

????????????????gotoxy(0, i);

????????????????for(j = 0; j < N + 2; ++j)

????????????????????????{

????????????????????????switch(plate[i][j])

????????????????????????????????{

?????????????????????????????case0:

?????????????????????????????????color(12);printf("□");color(11);?continue;

????????????????????????case1:?printf("■");?continue;

?????????????????????????????default: ;

?????????????????????????????}

????????????????????}

???????????????????putchar('\n');

????????????}

????????for(i = 0; i < (*len); ++i)

???????{

????????????????gotoxy(snake[i][1] * 2, snake[i][0]);

????????????????printf("★");

????????????}

????????putchar('\n');

????????*snake_x = snake;

}

voidManual()

{

????????gotoxy(N+30,2);

????????color(10);

????????printf("按 W S A D 移動方向");

????????gotoxy(N+30,4);

????????printf("按 space 鍵暫停");

????????gotoxy(N+30,8);

????????color(11);

????????printf("歷史最高分為: ");

????????color(12);

????????gotoxy(N+44,8);

????????printf("%d",score[1]*10);

????????color(11);

????????gotoxy(N+30,12);

????????printf("你現(xiàn)在得分為: 0");????????

}

intFile_in()?????//取記錄的分數(shù)

{

???FILE*fp;

???if((fp =?fopen("C:\\tcs.txt","a+")) == NULL)

???{

????????????gotoxy(N+18, N+2);

?????printf("文件不能打開\n");

?????????exit(0);

???}

???if((score[1] =?fgetc(fp)) != EOF);

???else

???score[1] = 0;

???return0;

}

intFile_out()????//存數(shù)據(jù)

{

????????FILE*fp;

????????if(score[1] > score[0])

????????{gotoxy(10,10);

????????color(12);

????????puts("Demi 加油哦");

????????gotoxy(0,N+2);

????????return0;

????????}

????????if((fp =?fopen("C:\\tcs.txt","w+")) == NULL)

????????{

????????????????printf("文件不能打開\n");

????????????????exit(0);

????????}

????if(fputc(--score[0],fp)==EOF)

???????????printf("輸出失敗\n");

????gotoxy(10,10);

????????color(12);

????????puts("恭喜Demi打破記錄");

????????gotoxy(0,N+2);

????????return0;

}

voidFree(char**snake,?intlen)????//釋放空間

{

????????inti;

????????for(i = 0; i < len; ++i)

????????????????free(snake[i]);

????????free(snake);

}

intmain(void)

{

????????intlen;

????????charch =?'g';

????????chara[N+2][N+2] = {{0}};

????????char**snake;

????????srand((unsigned)time(NULL));

????????color(11);

????????File_in();

????????init(a, &snake, &len);

????????Manual();

????????while(ch != 0x1B)???// 按 ESC 結(jié)束

?????????{

????????????????Draw(snake, len);

????????????????if(!apple[2]) {

????????????????????????apple[0] =?rand()%N + 1;

????????????????????????apple[1] =?rand()%N + 1;

????????????????????????apple[2] = 1;

????????????????}

????????????????Sleep(200-score[3]*10);

????????????????setbuf(stdin, NULL);

????????????????if(kbhit())

???????????????????{

????????????????????????gotoxy(0, N+2);

????????????????????????ch = getche();

????????????????????}

?????????????????snake = Move(snake, ch, &len);

?????????????????if(Block(snake[0])==1)

??????????????????{

????????????????????????gotoxy(N+2, N+2);

????????????????????????puts("你輸了");

????????????????????????File_out();

????????????????????????Free(snake, len);

????????????????????????getche();

????????????????????????exit(0);

??????????????????}???????????????????????

????????}

????????Free(snake, len);

????????exit(0);

}


感覺大家一直以來的支持,謝謝(#^.^#)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市后德,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件班巩,死亡現(xiàn)場離奇詭異夕冲,居然都是意外死亡氮兵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門歹鱼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泣栈,“玉大人,你說我怎么就攤上這事弥姻∧掀” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵庭敦,是天一觀的道長疼进。 經(jīng)常有香客問我,道長秧廉,這世上最難降的妖魔是什么伞广? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮疼电,結(jié)果婚禮上嚼锄,老公的妹妹穿的比我還像新娘。我一直安慰自己蔽豺,他們只是感情好区丑,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著修陡,像睡著了一般沧侥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上魄鸦,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天宴杀,我揣著相機與錄音,去河邊找鬼拾因。 笑死婴氮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的盾致。 我是一名探鬼主播主经,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼庭惜!你這毒婦竟也來了罩驻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤护赊,失蹤者是張志新(化名)和其女友劉穎惠遏,沒想到半個月后砾跃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡节吮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年抽高,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片透绩。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡翘骂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帚豪,到底是詐尸還是另有隱情碳竟,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布狸臣,位于F島的核電站莹桅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏烛亦。R本人自食惡果不足惜诈泼,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煤禽。 院中可真熱鬧厂汗,春花似錦、人聲如沸呜师。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汁汗。三九已至,卻和暖如春栗涂,著一層夾襖步出監(jiān)牢的瞬間知牌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工斤程, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留角寸,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓忿墅,卻偏偏與公主長得像扁藕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疚脐,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容