標(biāo)題:
一個簡易的貪吃蛇小游戲C語言源碼
[打印本頁]
作者:
twc976327901
時間:
2018-3-25 10:10
標(biāo)題:
一個簡易的貪吃蛇小游戲C語言源碼
貪吃蛇源碼,C語言
源程序如下:
/*
*程序名稱:貪吃蛇v2.1
*程序描述:一個簡易的貪吃蛇小游戲
*版本信息:v2.1
*v1.1版本更新:1:加入菜單選擇項(xiàng)
*v1.2版本更新:1:修復(fù)菜單選擇bug
*v1.3班本更新:1:加入難度選擇項(xiàng)
* 2:增加鍵盤采集頻率,大大增加操作靈敏度
* 3:優(yōu)化屏幕刷新頻率,平衡刺眼的情況
*v2.0版本更新:1:使用新的數(shù)據(jù)存儲結(jié)構(gòu)
* 2:使用全新的蛇的形狀,更加美觀
* 3:解決了1.X版本地圖長寬不等距的問題
*v2.1版本更新:1:修復(fù)蛇行進(jìn)過程中快速切換方向至死亡的bug
* 2:屏幕刷新改為蛇每前進(jìn)一次刷新一次,閃屏更柔和
* 3:更新退出后版本信息的輸出
*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
#include<time.h>
#include<conio.h>
int i;
#define N 25
#define M 22
//結(jié)構(gòu)體名的宏定義
#define STRU_B struct board
//結(jié)構(gòu)體元素part的值定義
#define bBORDER "◆"
#define sHEAD "■"
#define sBODY "◆"
#define sTAIL "◇"
#define bNONE " "
#define bFOOD "☆"
//結(jié)構(gòu)體元素drection的值定義
#define UP 24
#define DOWN 25
#define RIGHT 26
#define LEFT 27
struct board{
char drection;
char part[4];
};
void print_first(void);
int degree_difficulty(void);
void start(int diff);
void initialise_board(STRU_B(*p)[N]);
void creat_sanke(STRU_B(*p)[N]);
void show_board(STRU_B(*p)[N]);
int move_snake(STRU_B(*p)[N], char drection);
void delete_tail(STRU_B(*p)[N]);
void lose(STRU_B(*p)[N]);
void add_food(STRU_B(*p)[N]);
void print_last();
int main(void)
{
print_first();
do
{
start(degree_difficulty());
printf("1:再來一局\n2:退出\n請選擇:");
fflush(stdin);
scanf("%d", &i);
} while (i == 1);
print_last();
return 0;
}
void print_first(void)
{
printf("*************歡迎來到貪吃蛇*************\n\n");
printf("使用鍵盤上、下、左、右鍵控制方向\n\n\n");
}
int degree_difficulty(void)
{
int diff;
do
{
printf("\n請選擇難度:(1——3):");
scanf("%d", &diff);
switch (diff)
{
case 1:diff = 10; break;
case 2:diff = 6; break;
case 3:diff = 2; break;
default:
break;
}
if (2 <= diff && diff <= 10)
return diff;
printf("\n請輸入正確的編號選擇難度:(1——3):");
} while (1);
}
void start(int diff)
{
STRU_B board[M][N];
char drection = RIGHT;
int isn_lose = 1, i, dc;
initialise_board(board);
creat_sanke(board);
while (isn_lose)
{
dc = 0;
system("CLS");
show_board(board);
for (i = 0; i < diff; i++)
{
if (GetKeyState(VK_UP) < 0 && drection != DOWN && dc == 0) drection = UP, dc++;
if (GetKeyState(VK_DOWN) < 0 && drection != UP && dc == 0) drection = DOWN, dc++;
if (GetKeyState(VK_LEFT) < 0 && drection != RIGHT && dc == 0) drection = LEFT, dc++;
if (GetKeyState(VK_RIGHT) < 0 && drection != LEFT && dc == 0) drection = RIGHT, dc++;
Sleep(10);
}
isn_lose = move_snake(board, drection);
}
system("CLS");
show_board(board);
}
void initialise_board(STRU_B(*p)[N])
{
int i, j;
for (j = 0; j < N; j++)
strcpy(p[0][j].part , bBORDER);
for (i = 1; i < M - 1; i++)
for (j = 0; j < N; j++)
if (j == 0 || j == (N - 1))
strcpy(p[i][j].part , bBORDER);
else
strcpy(p[i][j].part , bNONE);
for (j = 0; j < N; j++)
strcpy(p[M - 1][j].part , bBORDER);
}
void creat_sanke(STRU_B(*p)[N])
{
p[M / 2][N / 2].drection = RIGHT;
strcpy(p[M / 2][N / 2].part , sHEAD);
p[M / 2][N / 2 - 1].drection = RIGHT;
strcpy(p[M / 2][N / 2 - 1].part , sBODY);
p[M / 2][N / 2 - 2].drection = RIGHT;
strcpy(p[M / 2][N / 2 - 2].part , sTAIL);
add_food(p);
}
void show_board(STRU_B(*p)[N])
{
int i, j;
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
printf("%s", p[i][j].part);
printf("\n");
}
}
int move_snake(STRU_B(*p)[N], char drection)
{
int i, j, NH = 0;
for (i = 0; i < M; i++)
for (j = 0; j < N; j++)
{
if (strcmp(p[i][j].part, bNONE) == 0 || strcmp(p[i][j].part, sBODY) == 0);
else if (strcmp(p[i][j].part , sHEAD) == 0 && NH == 0)
{
p[i][j].drection = drection;
switch (drection)
{
case UP:if (strcmp(p[i - 1][j].part , bBORDER) == 0) { lose(p); return 0; }
if (strcmp(p[i - 1][j].part , bFOOD) == 0) add_food(p);
else delete_tail(p);
p[i - 1][j] = p[i][j];
break;
case DOWN:if (strcmp(p[i + 1][j].part, bBORDER) == 0) { lose(p); return 0; }
if (strcmp(p[i + 1][j].part, bFOOD) == 0) add_food(p);
else delete_tail(p);
p[i + 1][j] = p[i][j];
break;
case LEFT:if (strcmp(p[i][j - 1].part, bBORDER) == 0) { lose(p); return 0; }
if (strcmp(p[i][j - 1].part, bFOOD) == 0) add_food(p);
else delete_tail(p);
p[i][j - 1] = p[i][j];
break;
case RIGHT:if (strcmp(p[i][j + 1].part, bBORDER) == 0) { lose(p); return 0; }
if (strcmp(p[i][j + 1].part, bFOOD) == 0) add_food(p);
else delete_tail(p);
p[i][j + 1] = p[i][j];
break;
}
strcpy(p[i][j].part, sBODY);
NH++;
}
}
return 1;
}
void delete_tail(STRU_B(*p)[N])
{
int i, j, NT = 0;
for (i = 0; i < M; i++)
for (j = 0; j < N; j++)
if (strcmp(p[i][j].part, sTAIL) == 0 && NT == 0)
{
switch (p[i][j].drection)
{
case UP:strcpy(p[i - 1][j].part, p[i][j].part), strcpy(p[i][j].part, bNONE);
break;
case DOWN:strcpy(p[i + 1][j].part, p[i][j].part), strcpy(p[i][j].part, bNONE);
break;
case LEFT:strcpy(p[i][j - 1].part, p[i][j].part), strcpy(p[i][j].part, bNONE);
break;
case RIGHT:strcpy(p[i][j + 1].part, p[i][j].part), strcpy(p[i][j].part, bNONE);
break;
}
NT++;
}
}
void lose(STRU_B(*p)[N])
{
strcpy(p[M / 2][N / 3].part, "Yo");
strcpy(p[M / 2][N / 3 + 1].part, "u ");
strcpy(p[M / 2][N / 3 + 2].part, "lo");
strcpy(p[M / 2][N / 3 + 3].part, "se");
strcpy(p[M / 2][N / 3 + 4].part, "! ");
}
void add_food(STRU_B(*p)[N])
{
int x, y;
srand(time(0));
x = (rand() % N - 2) + 1;
y = (rand() % M - 2) + 1;
while (strcmp(p[y][x].part, bNONE) != 0)
{
x = (rand() % N - 2) + 1;
y = (rand() % M - 2) + 1;
}
strcpy(p[y][x].part, bFOOD);
}
void print_last()
{
system("CLS");
printf("\n\n\n********************************************************\n");
printf("* *\n");
printf("* 貪吃蛇v2.1 *\n");
printf("* *\n");
printf("********************************************************\n");
Sleep(1000);
}
復(fù)制代碼
所有資料51hei提供下載:
貪吃蛇.zip
(2.08 KB, 下載次數(shù): 19)
2018-3-25 10:09 上傳
點(diǎn)擊文件名下載附件
源碼
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1