/*
2023年4月26日 09:18:33
编写一个控制台贪吃蛇游戏,不知道能实现不
1、写界面 0 代表 空白处
1 代表 食物 食物 %符号表示
2、代表蛇头 蛇头 @符号表示
3、蛇的节数 + 1 = 尾巴的位置
4、蛇节数 - 蛇头 = 身 #符号表示
2023年4月26日 18:55:32 实现了
利用二维数组里面的数值,来实现控制台贪吃蛇
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctype.h>
#include <conio.h>
#include <time.h>
#define LENGTH 30 //贪吃蛇 大小
#define WIDTH 60 //改变 这两个值可以设置大小
int arr[LENGTH][WIDTH];
/* 初始化界面 */
void Init_jiemian(int arr[LENGTH][WIDTH] , int n);
/* 循环输出数组中的值 */
void show_arr(int arr[LENGTH][WIDTH]);
/* 蛇的移动 */
void move_snak(int arr[LENGTH][WIDTH] ,char ch , int * length );
/*设置食物*/
void food_snak(int arr[LENGTH][WIDTH]);
/* 获取用户输入 */
char get_char(char ch);
int main(){
int n = 5 ; //初始蛇的节数
Init_jiemian(arr,n); //初始化二维数组数据
char ch = 'd'; //初始化的移动设置
food_snak(arr); //随机生成食物的位置
while(1){
ch = get_char(ch); //获取用户的输入
// Sleep(100) //控制台刷新速度太慢 注了
show_arr(arr); //显示数组的内容
move_snak(arr,ch,&n); //蛇的移动函数 传入参数节数 不是太完美
system("cls"); //清除屏幕
}
system("pause");
}
void food_snak(int arr[LENGTH][WIDTH]){
srand(500); //食物随机位置
int i = rand() % 20 ; //有循环不是太完美 应该一次生成随机数限定在某个范围
int j = rand() % 40 ;
while(arr[i][j] > 0 || arr[i][j] == -1){
i = rand() % 20 ;
j = rand() % 40 ;
}
arr[i][j] = 1 ; //将随机数的位置赋值为1 代表食物
}
void move_snak(int arr[LENGTH][WIDTH] , char ch , int *length){
int new_head_i , new_end_i , new_head_j , new_end_j; //记录蛇新位置的头和尾巴
int old_head_i , old_end_i , old_head_j , old_end_j; //记录蛇的旧位置头和尾巴
int i , j ;
for (i = 0 ; i < LENGTH ; i ++){
for (int j = 0 ; j < WIDTH ; j ++){
if(arr[i][j] == 2){ //循环找到蛇的头
old_head_i = i;
old_head_j = j;
}
if(arr[i][j] > 1 ){ //将蛇的身子全部 + 1
arr[i][j] ++ ;
}
if (arr[i][j] > *length + 1 ){
/*上面将蛇整个身子加1,蛇头自增后等于3 这里找到蛇尾的必须是节数+1 ,因为整个蛇在循环中是自增的*/
old_end_i = i ;
old_end_j = j ;
}
}
}
new_head_i = old_head_i ; //将旧的蛇位置全部 赋值给新的蛇
new_end_i = old_end_i ; //因为下面要移动并设置蛇的新位置
new_head_j = old_head_j ;
new_end_j = old_end_j;
if(ch == 'd'){ // 字符 a w s d控制蛇的移动 旧的位置改变赋值给新位置
new_head_j = old_head_j + 1 ; //右移动 = j + 1 二维数组的行
}else if (ch == 'w'){ //上移动 = i + 1 数组的列
new_head_i = old_head_i - 1;
}else if (ch == 's'){
new_head_i = old_head_i + 1; //下移动 数组的列
}else if (ch == 'a'){
new_head_j = old_head_j - 1; //左移动 j - 1
}
/*移动完以后判断新的位置边界是否是墙,并且不能大于蛇的身子*/
if(arr[new_head_i][new_head_j] == -1 || arr[new_head_i][new_head_j] >= 2 ){
system("cls"); //如果失败清理屏幕
printf("游戏失败!\n"); //输出游戏失败
system("pause");
exit(-1);
}else if(arr[new_head_i][new_head_j] == 1){
food_snak(arr); //如果碰到了食物,重新生成食物
arr[new_head_i][new_head_j] = 2 ; //将食物的位置设置为蛇头值=2,前面蛇身自增过,这里蛇头不重复
(*length) ++ ; //将蛇节数+1
return ; //直接返回
}
/*如果 没有碰到自己 或者 墙壁 */
arr[old_end_i][old_end_j] = 0 ; //将旧的尾巴 = 0
arr[new_head_i][new_head_j] = 2 ; //新的 头等于 移动后的位置
}
char get_char(char ch1){
//while (getch()!='\n');
char ch ;
if(kbhit()){
ch = getch();
if(ch != 'w' && ch != 's' && ch != 'a' && ch != 'd'){
return ch1 ;
}
return ch ;
}
if (!kbhit()){
return ch1 ;
}
return ch ;
}
void show_arr(int arr[LENGTH][WIDTH]){
int i , j ;
for ( i = 0; i < LENGTH ; i++)
{
for (j = 0 ; j < WIDTH ; j ++){
if(arr[i][j] < 0 ){
printf("*");
}else if (arr[i][j] == 0 ){
printf(" ");
}else if(arr[i][j] == 2 )
printf("@");
else if (arr[i][j] == 1){
printf("%%");
} else
printf("#");
}
printf("\n");
}
}
void Init_jiemian(int arr[LENGTH][WIDTH] , int n ){
int i , j ;
for (i = 0 ; i < LENGTH ; i ++){
for (j = 0 ; j < WIDTH ; j ++){
if(j == 0 || i == 0 ){
arr[i][j] = -1;
}else if (j == WIDTH -1 || i ==LENGTH -1){
arr[i][j] = -1;
}else
arr[i][j] = 0;
}
}
i = 10 ; //蛇的初始化位置
j = 10; //蛇的初始化位置
for(int k = n + 1 ; k > 1 ; k --){
arr[i][j++] = k ;
}
}
控制台贪吃蛇
最新推荐文章于 2024-09-08 17:41:31 发布