貪吃蛇C語言
不知不覺大一已過去了一半, 今天要考試了, 我也是感慨良多, 那是我失去的青春, 嗚嗚嗚~~ 這次代碼是繼上次的優化和完善, 若有好的建議或意見隨時歡迎交流
運行效果圖

代碼奉上
# include <stdio.h>
# include <stdlib.h> //malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()
# include <windows.h> //Sleep()、gotoxy()、HideCursor()
# include <conio.h> //_getch()、kbhit()
# include <time.h> //time()
void gotoxy(int x, int y) { //移動游標; 網上復制
COORD pos;
HANDLE hOutput;
pos.X = (SHORT)x;
pos.Y = (SHORT)y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, pos);
}
void HideCursor() { //隱藏游標; 網上復制
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof(cursor);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cursor);
}
typedef struct Node { //結構體坐標
int x, y;
struct Node *next;
} Node, *List;
List head; //全域變數
//num蛇身長度; x, y蛇身坐標; fx, fy食物坐標; garde玩家分數
int num = 5, x = 5, y = 5, fx = 5, fy = 5, garde = 0;
DWORD speed = 200; //speed移動速度
List Create() { //創建結點
List p = (List)malloc(sizeof(Node));
if (!p) {
puts("空間不足");
exit(0);
}
p->next = NULL;
return p;
}
void Insert() { //錄入結點
List p = Create();
p->x = x;
p->y = y;
p->next = head->next;
head->next = p;
}
void Wall() {
int i, j;
gotoxy(0, 0);
for (i = 0; i < 20; ++i) {
for (j = 0; j < 40; ++j) {
if (0 == i || 19 == i || 0 == j || 39 == j) {
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
}
void GameOver() { //游戲結束
gotoxy(0, 0); //覆寫蛇身
Wall();
gotoxy(15, 9);
puts("GAME OVER");
system("pause");
exit(0);
}
void EatOver() { //吃到自己結束;
int i, j;
List pa, pb;
//比較是否存在坐標相同結點, 如果存在即撞到自身, 游戲結束
for (i = 0, pa = head->next; i < num - 1 && pa->next; ++i, pa = pa->next) {
for (j = 0, pb = pa->next; j < num && pb; ++j, pb = pb->next) {
if (pa->x == pb->x && pa->y == pb->y) {
GameOver();
}
}
}
}
List Food() { //創建食物
List p = Create();
srand((unsigned)time(NULL)); //完全隨機
p->x = rand() % 17 + 1;
p->y = rand() % 17 + 1;
return p;
}
List FoodCreate() { //列印食物
List p = head->next, pf = Create();
int i, judge = 0;
while (1) {
judge = 0;
pf->x = Food()->x;
pf->y = Food()->y;
//食物坐標與蛇身坐標比較, 如果相同, 則重新得到食物
for (i = 0, p = head->next; i < num && p->next; ++i, p = p->next) {
if (pf->x == p->x && pf->y == p->y) {
judge = 1;
break;
}
}
if (0 == judge) {
return pf;
}
}
}
void Print() { //列印蛇身
int i;
EatOver(); //是否吃到自己
List p = head->next;
for (i = 0; i < num && p; ++i, p = p->next) {
gotoxy(p->x, p->y);
if (0 == i) { //蛇頭
printf("@");
} else if (1 == i) { //蛇身
printf("+");
} else if (i + 1 == num) { //蛇尾覆寫
printf(" ");
}
}
}
void WallDeath() { //撞墻結束
if (0 == x || 39 == x || 0 == y || 19 == y) {
GameOver();
}
}
void WallPass() { //穿墻(未插入, 可替換WallDeath();)
if (0 == x) {
x = 38;
}
if (39 == x) {
x = 1;
}
if (0 == y) {
y = 18;
}
if (19 == y) {
y = 1;
}
}
void FoodEat() { //吃到食物
if (x == fx && y == fy) {
if (0 == num % 5 && speed > 50) { //速度變快
speed -= 5;
}
gotoxy(41, 1);
printf("速度: %.1f%%", 10000 / (float)speed); //速度上限是200%
garde += 10; //分數增加
gotoxy(41, 3);
printf("分數: %d", garde);
++num; //蛇身加長
gotoxy(41, 5);
printf("長度: %d", num);
fx = FoodCreate()->x;
fy = FoodCreate()->y;
gotoxy(fx, fy); //列印食物
printf("$");
gotoxy(41, 7);
printf("食物: (%d, %d) ", fx, fy);//注意細節, 加空格是為了覆寫
}
}
void Menu() { //開始界面
gotoxy(0, 0);
puts("****************************************");
puts("* ________ *");
puts("* -------- *");
puts("* // \\\\ *");
puts("* // @ \\\\ *");
puts("* // ______ \\\\ *");
puts("* ------ *");
puts("* // *");
puts("* // *");
puts("* // *");
puts("* ________________ *");
puts("* ---------------- *");
puts("* || || *");
puts("* || || || *");
puts("* || || || *");
puts("* // \\\\ *");
puts("* // \\\\ *");
puts("* // \\\\ *");
puts("* *");
puts("****************************************");
Sleep(2000); //顯示2秒
}
int main() {
HideCursor(); //隱藏游標
Menu(); //列印開始界面
Wall(); //列印墻體
head = Create();
gotoxy(fx, fy); //列印第一個食物
printf("$");
char ch;
while (1) { //有按鍵改變方向
ch = (char)getch();
while(!kbhit()) { //無按鍵向指定方向移動
switch(ch) {
case 'a': { //向左
--x;
break;
}
case 'd': { //向右
++x;
break;
}
case 'w': { //向上
--y;
break;
}
case 's': { //向下
++y;
break;
}
default: {
break;
}
}
FoodEat(); //是否吃到食物
WallDeath(); //是否撞墻; 可替換為wallPass(x, y);
Insert(); //錄入資料
Print(); //列印蛇身
Sleep(speed); //延遲; 與速度有關
}
}
return 0;
}
希望各位看望之后給個免費的紅心加關注, 之后我還會繼續分享的>-<
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/248512.html
標籤:其他
上一篇:Qt-creator windows環境下自帶工具打包
下一篇:pygame(十五)拼圖游戲
