practice_code/c/code/idea/Snakes/Snakes_3.c

1217 lines
51 KiB
C
Raw Normal View History

2023-12-07 21:45:29 +08:00
#include <stdio.h>
#include <unistd.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define map_Longitudinal 27//地图高度
#define map_across 102//地图宽度
int map[map_Longitudinal][map_across];//储存地图状态
int MAX_integral = 0;//玩家最高分
//定义是哪条蛇
#define mark_NULL 97//标记空
#define mark_food 98//标记为食物
#define mark_wall 99//标记墙
#define UP 72 //方向键:上
#define DOWN 80 //方向键:下
#define LEFT 75 //方向键:左
#define RIGHT 77 //方向键:右
//蛇
//得分
typedef struct
{
int y;//纵坐标
int x;//横坐标
int MAX_x;//横坐标
int integral;//玩家积分
} game_Integral;
//蛇头
typedef struct
{
int y;//纵坐标
int x;//横坐标
int direction;//蛇移动的方向
int move_x;//更新移动所产生的横坐标
int move_y;//更新移动所产生的纵坐标
int food;//判断是否吃到食物
} snake_head;
//蛇身
typedef struct
{
int color;//蛇的颜色
int y[99];//纵坐标
int x[99];//横坐标
int length;//蛇身体长度
} snake_body;
//哪条蛇
typedef struct
{
snake_head * head;//头
snake_body * body;//身体
game_Integral * score;//积分
} name_snake;
name_snake * snake[99];//给蛇全局声明
//蛇
void HideCursor ()//隐藏光标
{
CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量
curInfo . dwSize = 1; //如果没赋值的话,光标隐藏无效
curInfo . bVisible = FALSE; //将光标设置为不可见
HANDLE handle = GetStdHandle ( STD_OUTPUT_HANDLE ); //获取控制台句柄
SetConsoleCursorInfo ( handle , & curInfo ); //设置光标信息
}
void CursorJump ( int y , int x )//光标跳转
{
COORD pos; //定义光标位置的结构体变量
pos . X = x; //横坐标
pos . Y = y; //纵坐标
HANDLE handle = GetStdHandle ( STD_OUTPUT_HANDLE ); //获取控制台句柄
SetConsoleCursorPosition ( handle , pos ); //设置光标位置
}
void color ( int c )//颜色设置
{
SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , c ); //颜色设置
//注SetConsoleTextAttribute是一个API应用程序编程接口
}
void print_score ( int pick_score )//打印积分
{
if ( pick_score == 1 )
{
color ( snake[ 0 ] -> body -> color );//设置积分颜色
CursorJump ( snake[ 0 ] -> score -> y , snake[ 0 ] -> score -> x );
printf ( "当前积分为%d分" , snake[ 0 ] -> score -> integral );
CursorJump ( snake[ 0 ] -> score -> y , snake[ 0 ] -> score -> MAX_x );
printf ( "最高积分为%d分" , MAX_integral );
}
else if ( pick_score == 2 )
{
color ( snake[ 0 ] -> body -> color );//设置积分颜色
CursorJump ( snake[ 0 ] -> score -> y , snake[ 0 ] -> score -> x );
printf ( "一号玩家积分为%d分" , snake[ 0 ] -> score -> integral );
CursorJump ( snake[ 0 ] -> score -> y + 1 , snake[ 0 ] -> score -> x );
printf ( "W S A D进行上下左右移动" );
color ( snake[ 1 ] -> body -> color );//设置积分颜色
CursorJump ( snake[ 0 ] -> score -> y , snake[ 0 ] -> score -> MAX_x - 5 );
printf ( "二号玩家积分为%d分" , snake[ 1 ] -> score -> integral );
CursorJump ( snake[ 0 ] -> score -> y + 1 , snake[ 0 ] -> score -> MAX_x - 5 );
printf ( "↑ ↓ ← → 进行上下左右移动" );
}
}
void food_map ()//在动图上生成食物
{
int i = rand ( ) % map_Longitudinal;//随机食物纵坐标
int j = rand ( ) % map_across;//随机食物横坐标
int random = rand ( ) % 14 + 1;//随机生成颜色
if ( map[ i ][ j ] == mark_NULL )//监测到有物体就重新生成
{
map[ i ][ j ] = mark_food; // 正确标记食物
color ( random );
CursorJump ( i , j );
printf ( "" );
}
else
{
food_map ( );
}
}
void move ( int snake_digit )//移动逻辑
{
color ( snake[ snake_digit ] -> body -> color ); //颜色设置
if ( snake[ snake_digit ] -> head -> food == 1 )//如果吃到食物
{
snake[ snake_digit ] -> body -> x[ snake[ snake_digit ] -> body -> length ] = snake[ snake_digit ] -> body -> x[
snake[ snake_digit ] -> body -> length - 1 ];//新增的一节赋值现在最后一节的x
snake[ snake_digit ] -> body -> y[ snake[ snake_digit ] -> body -> length ] = snake[ snake_digit ] -> body -> y[
snake[ snake_digit ] -> body -> length - 1 ];//新增的一节赋值现在最后一节的y
map[ snake[ snake_digit ] -> body -> y[ snake[ snake_digit ] -> body -> length ] ][ snake[ snake_digit ] -> body -> x[ snake[ snake_digit ] -> body -> length ] ] = snake_digit;//标记蛇
snake[ snake_digit ] -> body -> length += 1;//增加蛇身体长度
if ( snake_digit == 1 || snake_digit == 0 )
{
snake[ snake_digit ] -> score -> integral += 10;//增加积分
}
}
//将之前身体的置空
for ( int i = 0 ; i < snake[ snake_digit ] -> body -> length ; ++ i )
{
map[ snake[ snake_digit ] -> body -> y[ i ] ][ snake[ snake_digit ] -> body -> x[ i ] ] = mark_NULL;//标记为空
CursorJump ( snake[ snake_digit ] -> body -> y[ i ] , snake[ snake_digit ] -> body -> x[ i ] );
printf ( " " );
}
//更新蛇身坐标
for ( int i = snake[ snake_digit ] -> body -> length - 1 ; i > 0 ; -- i )
{
snake[ snake_digit ] -> body -> x[ i ] = snake[ snake_digit ] -> body -> x[ i - 1 ];//将本节的x坐标换成前一节的
snake[ snake_digit ] -> body -> y[ i ] = snake[ snake_digit ] -> body -> y[ i - 1 ];//将本节的y坐标换成前一节的
}
snake[ snake_digit ] -> body -> x[ 0 ] = snake[ snake_digit ] -> head -> x;//将第一个的x坐标换成头部
snake[ snake_digit ] -> body -> y[ 0 ] = snake[ snake_digit ] -> head -> y;//将第一个的u坐标换成头部
//将重新打印身体
for ( int i = 0 ; i < snake[ snake_digit ] -> body -> length ; ++ i )
{
map[ snake[ snake_digit ] -> body -> y[ i ] ][ snake[ snake_digit ] -> body -> x[ i ] ] = snake_digit;//标记蛇
CursorJump ( snake[ snake_digit ] -> body -> y[ i ] , snake[ snake_digit ] -> body -> x[ i ] );
printf ( "" );
}
//更新蛇头坐标
snake[ snake_digit ] -> head -> x += snake[ snake_digit ] -> head -> move_x;
snake[ snake_digit ] -> head -> y += snake[ snake_digit ] -> head -> move_y;
//把蛇头的坐标在地图更新
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x ] = snake_digit;//标记蛇
CursorJump ( snake[ snake_digit ] -> head -> y , snake[ snake_digit ] -> head -> x );
printf ( "" );
}
int Begin ()//开始界面
{
begin_tab:
system ( "cls" );
printf ( "\n\n\n\n\n\n\n\n\t\t\t\t\t————————————贪吃蛇————————————\n" );
printf ( "\t\t\t\t\t|1.单人模式\t\t |\n" );
printf ( "\t\t\t\t\t|2.双人模式(先出现的为一号蛇)|\n" );
printf ( "\t\t\t\t\t|3.人机模式(先出现的为用户蛇)|\n" );
printf ( "\t\t\t\t\t 请输入:" );
int pick_Begin;//接收开始页面的选择
while ( ( scanf ( "%d" , & pick_Begin ) ) != 1 )
{
while ( getchar ( ) != '\n' );
goto begin_tab;
}
if ( pick_Begin == 0 )
{
exit ( 0 );
}
else if ( pick_Begin >= 1 && pick_Begin <= 3 )
{
return pick_Begin;
}
else
{
while ( getchar ( ) != '\n' );
printf ( "输入错误,请重新输入" );
goto begin_tab;
}
}
void initial_snake ( int snake_digit )//生成蛇
{
int pick_x = rand ( ) % 60 + 12;//随机生成横坐标
int pick_y = rand ( ) % 17 + 1;//随机生成纵坐标
snake[ snake_digit ] -> body -> color = rand ( ) % 14 + 1;//给蛇随机生成颜色
color ( snake[ snake_digit ] -> body -> color ); //给蛇设置颜色
while ( map[ pick_y ][ pick_x ] != mark_NULL || map[ pick_y ][ pick_x - 1 ] != mark_NULL ||
map[ pick_y ][ pick_x - 2 ] != mark_NULL )//判断生成的位置是不是空地
{
pick_x = rand ( ) % 70 + 10;//随机生成横坐标
pick_y = rand ( ) % 17 + 1;//随机生成纵坐标
}
//初始化蛇头
snake[ snake_digit ] -> head -> x = pick_x;
snake[ snake_digit ] -> head -> y = pick_y;
//初始化蛇身
snake[ snake_digit ] -> body -> x[ 0 ] = pick_x - 1;
snake[ snake_digit ] -> body -> y[ 0 ] = pick_y;
snake[ snake_digit ] -> body -> x[ 1 ] = pick_x - 2;
snake[ snake_digit ] -> body -> y[ 1 ] = pick_y;
snake[ snake_digit ] -> body -> length = 2;
//生成蛇的图像
//蛇头
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x ] = snake_digit;//标记蛇
CursorJump ( snake[ snake_digit ] -> head -> y , snake[ snake_digit ] -> head -> x );
printf ( "" );
//蛇身
for ( int i = snake[ snake_digit ] -> body -> length - 1 ; i >= 0 ; -- i )
{
map[ snake[ snake_digit ] -> body -> y[ i ] ][ snake[ snake_digit ] -> body -> x[ i ] ] = snake_digit;//标记蛇
CursorJump ( snake[ snake_digit ] -> body -> y[ i ] , snake[ snake_digit ] -> body -> x[ i ] );
printf ( "" );
}
//初始化积分
snake[ snake_digit ] -> score -> integral = 0;
//初始化移动所产生的坐标
snake[ snake_digit ] -> head -> move_x = 0;
snake[ snake_digit ] -> head -> move_y = 0;
//初始蛇移动方向
snake[ snake_digit ] -> head -> direction = 4;
//有没有吃到食物
snake[ snake_digit ] -> head -> food = 0;
}
void print_map ()//初始地图
{
color ( 12 );
for ( int i = 0 ; i < map_Longitudinal ; ++ i )
{
if ( i == 0 || i == map_Longitudinal - 1 )
{
for ( int j = 0 ; j < map_across ; ++ j )
{
//打印墙并且标记状态为墙
map[ i ][ j ] = mark_wall;
printf ( "" );
}
printf ( "\n" );
}
else
{
for ( int j = 0 ; j < map_across ; ++ j )
{
if ( j == 0 || j == map_across - 1 )//打印边界
{
//打印墙并且标记状态为墙
map[ i ][ j ] = mark_wall;
printf ( "" );
}
else
{
map[ i ][ j ] = mark_NULL;//标记为空
printf ( " " );//输出地图
}
}
printf ( "\n" );
}
}
snake[ 0 ] -> score -> x = 1;//积分横坐标
snake[ 0 ] -> score -> y = map_Longitudinal;//积分纵坐标
snake[ 0 ] -> score -> MAX_x = map_across - 14;//最大积分横坐标
}
void defeat ( int snake_digit , int toll )//失败界面
{
defeat_tab:
color ( 12 );
CursorJump ( 10 , 50 );
printf ( "\n\t\t\t\t———————游戏失败———————\n" );
if ( toll == 2 )
{
printf ( "\t\t\t\t|%d号玩家的蛇死亡 |\n" , snake_digit + 1 );
}
printf ( "\t\t\t\t|0.退出游戏 |\n" );
printf ( "\t\t\t\t|1.返回主页 |\n" );
printf ( "\t\t\t\t|2.重新开始 |\n" );
printf ( "\t\t\t\t 请输入:" );
int pick_defeat;//接收选择
while ( ( scanf ( "%d" , & pick_defeat ) ) != 1 )
{
while ( getchar ( ) != '\n' );
system ( "cls" );
goto defeat_tab;
}
if ( pick_defeat == 0 )
{
exit ( 0 );
}
else if ( pick_defeat == 1 )
{
snake[ snake_digit ] -> head -> direction = 6;
}
else if ( pick_defeat == 2 )
{
snake[ snake_digit ] -> head -> direction = 5;
}
else
{
while ( getchar ( ) != '\n' );
system ( "cls" );
goto defeat_tab;
}
}
void reception_input ( int snake_digit , int toll )//接收用户输入
{
//将上一次的状态转为方向
char direction_test;//方向接收
if ( toll == 1 )
{
if ( _kbhit ( ) )//接收用户输入
{
direction_test = _getch ( );
if ( direction_test == 'W' || direction_test == 'w' || direction_test == UP )//向上
{
snake[ 0 ] -> head -> direction = 1;
}
else if ( direction_test == 'S' || direction_test == 's' || direction_test == DOWN )//向下
{
snake[ 0 ] -> head -> direction = 2;
}
else if ( direction_test == 'A' || direction_test == 'a' || direction_test == LEFT )//向右
{
snake[ 0 ] -> head -> direction = 3;
}
else if ( direction_test == 'D' || direction_test == 'd' || direction_test == RIGHT )//向左
{
snake[ 0 ] -> head -> direction = 4;//方向
}
else if ( direction_test == 'R' || direction_test == 'r' )//重开
{
snake[ 0 ] -> head -> direction = 5;//重开
}
}
}
else if ( toll == 2 )
{
if ( _kbhit ( ) )//接收用户输入
{
direction_test = _getch ( );
if ( direction_test == 'W' || direction_test == 'w' && snake[ 0 ] -> head -> move_y != 1 )//向上
{
snake_digit = 0;//更新蛇
snake[ snake_digit ] -> head -> direction = 1;//更新蛇移动方向
}
if ( direction_test == 'S' || direction_test == 's' && snake[ 0 ] -> head -> move_y != - 1 )//向下
{
snake_digit = 0;//更新蛇
snake[ snake_digit ] -> head -> direction = 2;//更新蛇移动方向
}
if ( direction_test == 'A' || direction_test == 'a' && snake[ 0 ] -> head -> move_x != 1 )//向左
{
snake_digit = 0;//更新蛇
snake[ snake_digit ] -> head -> direction = 3;//更新蛇移动方向
}
if ( direction_test == 'D' || direction_test == 'd' && snake[ 0 ] -> head -> move_x != - 1 )//向右
{
snake_digit = 0;//更新蛇
snake[ snake_digit ] -> head -> direction = 4;//更新蛇移动方向
}
if ( direction_test == UP && snake[ 1 ] -> head -> move_y != 1 )//向上
{
snake_digit = 1;//更新蛇
snake[ snake_digit ] -> head -> direction = 1;//更新蛇移动方向
}
if ( direction_test == DOWN && snake[ 1 ] -> head -> move_y != - 1 )//向下
{
snake_digit = 1;//更新
snake[ snake_digit ] -> head -> direction = 2;//更新蛇移动方向
}
if ( direction_test == LEFT && snake[ 1 ] -> head -> move_x != 1 )//向左
{
snake_digit = 1;//更新蛇
snake[ snake_digit ] -> head -> direction = 3;//更新蛇移动方向
}
if ( direction_test == RIGHT && snake[ 1 ] -> head -> move_x != 1 )//向右
{
snake_digit = 1;//更新
snake[ snake_digit ] -> head -> direction = 4;//更新蛇移动方向
}
}
}
else
{
int pick = rand ( ) % 4 + 1;
switch ( pick )
{
case 1:
{
if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] == mark_food &&
snake[ snake_digit ] -> head -> direction != 2 )
{
snake[ snake_digit ] -> head -> direction = 1;
break;
}//判断要不要往上
}
case 2:
{
if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] == mark_food &&
snake[ snake_digit ] -> head -> direction != 1 )
{
snake[ snake_digit ] -> head -> direction = 2;
break;
}//判断要不要往下
}
case 3:
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] == mark_food &&
snake[ snake_digit ] -> head -> direction != 4 )
{
snake[ snake_digit ] -> head -> direction = 3;
break;
}//判断要往左
}
case 4:
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] == mark_food &&
snake[ snake_digit ] -> head -> direction != 3 )
{
snake[ snake_digit ] -> head -> direction = 4;
break;
}//判断要不要往右
}
case 5:
{
if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] == mark_food &&
snake[ snake_digit ] -> head -> direction != 2 )
{
snake[ snake_digit ] -> head -> direction = 1;
break;
}//判断要不要往上
else if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_food && snake[ snake_digit ] -> head -> direction != 1 )
{
snake[ snake_digit ] -> head -> direction = 2;
break;
}//判断要不要往下
else if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] ==
mark_food && snake[ snake_digit ] -> head -> direction != 4 )
{
snake[ snake_digit ] -> head -> direction = 3;
break;
}//判断要往左
else if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] ==
mark_food && snake[ snake_digit ] -> head -> direction != 3 )
{
snake[ snake_digit ] -> head -> direction = 4;
break;
}//判断要不要往右
}
case 6:
{
switch ( pick )
{
case 1:
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] ==
mark_NULL && snake[ snake_digit ] -> head -> direction != 3 )
{
snake[ snake_digit ] -> head -> direction = 4;
break;
}//判断要不要往右
}
case 2:
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] ==
mark_NULL && snake[ snake_digit ] -> head -> direction != 4 )
{
snake[ snake_digit ] -> head -> direction = 3;
break;
}//判断要往左
}
case 3:
{
if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_NULL && snake[ snake_digit ] -> head -> direction != 1 )
{
snake[ snake_digit ] -> head -> direction = 2;
break;
}//判断要不要往下
}
case 4:
{
if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_NULL && snake[ snake_digit ] -> head -> direction != 2 )
{
snake[ snake_digit ] -> head -> direction = 1;
break;
}//判断要不要往上
}
}
}
case 7:
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] == mark_NULL &&
snake[ snake_digit ] -> head -> direction != 3 )
{
snake[ snake_digit ] -> head -> direction = 4;
break;
}//判断要不要往右
else if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] ==
mark_NULL && snake[ snake_digit ] -> head -> direction != 4 )
{
snake[ snake_digit ] -> head -> direction = 3;
break;
}//判断要往左
else if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_NULL && snake[ snake_digit ] -> head -> direction != 1 )
{
snake[ snake_digit ] -> head -> direction = 2;
break;
}//判断要不要往下
else if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_NULL && snake[ snake_digit ] -> head -> direction != 2 )
{
snake[ snake_digit ] -> head -> direction = 1;
break;
}//判断要不要往上
}
case 8:
{
switch ( pick )
{
case 1:
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] ==
snake_digit && snake[ snake_digit ] -> head -> direction != 3 )
{
snake[ snake_digit ] -> head -> direction = 4;
break;
}//判断要不要往右
}
case 2:
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] ==
snake_digit && snake[ snake_digit ] -> head -> direction != 4 )
{
snake[ snake_digit ] -> head -> direction = 3;
break;
}//判断要往左
}
case 3:
{
if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] ==
snake_digit && snake[ snake_digit ] -> head -> direction != 1 )
{
snake[ snake_digit ] -> head -> direction = 2;
break;
}//判断要不要往下
}
case 4:
{
if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] ==
snake_digit && snake[ snake_digit ] -> head -> direction != 2 )
{
snake[ snake_digit ] -> head -> direction = 1;
break;
}//判断要不要往上
}
}
}
case 9:
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] == snake_digit &&
snake[ snake_digit ] -> head -> direction != 3 )
{
snake[ snake_digit ] -> head -> direction = 4;
break;
}//判断要不要往右
else if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] ==
snake_digit && snake[ snake_digit ] -> head -> direction != 4 )
{
snake[ snake_digit ] -> head -> direction = 3;
break;
}//判断要往左
else if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] ==
snake_digit && snake[ snake_digit ] -> head -> direction != 1 )
{
snake[ snake_digit ] -> head -> direction = 2;
break;
}//判断要不要往下
else if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] ==
snake_digit && snake[ snake_digit ] -> head -> direction != 2 )
{
snake[ snake_digit ] -> head -> direction = 1;
break;
}//判断要不要往上
}
}
}
}
void pick_move ( int snake_digit , int mode )//判断移动方向
{
if ( snake[ snake_digit ] -> head -> direction == 1 )//判断向上
{
if ( snake[ snake_digit ] -> head -> move_y == 1 )
{
if ( mode >= 3 )
{
if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] != snake_digit &&
map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
else
{
if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] == mark_food )
{
snake[ snake_digit ] -> head -> food = 1;//此蛇吃到了食物
}
snake[ snake_digit ] -> head -> move_x = 0;//更新移动所产生的横坐标
snake[ snake_digit ] -> head -> move_y = 1;//更新移动所产生的纵坐标
}
else
{
if ( mode >= 3 )
{
if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] != snake_digit &&
map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
else
{
if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] == mark_food )
{
snake[ snake_digit ] -> head -> food = 1;//此蛇吃到了食物
}
snake[ snake_digit ] -> head -> move_x = 0;//更新移动所产生的横坐标
snake[ snake_digit ] -> head -> move_y = - 1;//更新移动所产生的纵坐标
}
}
else if ( snake[ snake_digit ] -> head -> direction == 2 )//判断向下
{
if ( snake[ snake_digit ] -> head -> move_y == - 1 )
{
if ( mode >= 3 )
{
if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] != snake_digit &&
map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
else
{
if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
if ( map[ snake[ snake_digit ] -> head -> y - 1 ][ snake[ snake_digit ] -> head -> x ] == mark_food )
{
snake[ snake_digit ] -> head -> food = 1;//此蛇吃到了食物
}
snake[ snake_digit ] -> head -> move_x = 0;//更新移动所产生的横坐标
snake[ snake_digit ] -> head -> move_y = - 1;//更新移动所产生的纵坐标
}
else
{
if ( mode >= 3 )
{
if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] != snake_digit &&
map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
else
{
if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
if ( map[ snake[ snake_digit ] -> head -> y + 1 ][ snake[ snake_digit ] -> head -> x ] == mark_food )
{
snake[ snake_digit ] -> head -> food = 1;//此蛇吃到了食物
}
snake[ snake_digit ] -> head -> move_x = 0;//更新移动所产生的横坐标
snake[ snake_digit ] -> head -> move_y = 1;//更新移动所产生的纵坐标
}
}
else if ( snake[ snake_digit ] -> head -> direction == 3 )//判断向左
{
if ( snake[ snake_digit ] -> head -> move_x == 1 )
{
if ( mode >= 3 )
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] != snake_digit &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
else
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] == mark_food )
{
snake[ snake_digit ] -> head -> food = 1;//此蛇吃到了食物
}
snake[ snake_digit ] -> head -> move_x = 1;//更新移动所产生的横坐标
snake[ snake_digit ] -> head -> move_y = 0;//更新移动所产生的纵坐标
}
else
{
if ( mode >= 3 )
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] != snake_digit &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
else
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] == mark_food )
{
snake[ snake_digit ] -> head -> food = 1;//此蛇吃到了食物
}
snake[ snake_digit ] -> head -> move_x = - 1;//更新移动所产生的横坐标
snake[ snake_digit ] -> head -> move_y = 0;//更新移动所产生的纵坐标
}
}
else if ( snake[ snake_digit ] -> head -> direction == 4 )//判断右
{
if ( snake[ snake_digit ] -> head -> move_x == - 1 )
{
if ( mode >= 3 )
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] != snake_digit &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
else
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x - 1 ] == mark_food )
{
snake[ snake_digit ] -> head -> food = 1;//此蛇吃到了食物
}
snake[ snake_digit ] -> head -> move_x = - 1;//更新移动所产生的横坐标
snake[ snake_digit ] -> head -> move_y = 0;//更新移动所产生的纵坐标
}
else
{
if ( mode >= 3 )
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] != snake_digit &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
else
{
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] != mark_NULL &&
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] != mark_food ||
map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] ==
mark_wall )//判断有没有失败
{
snake[ snake_digit ] -> head -> direction = 0;//更新状态
}
}
if ( map[ snake[ snake_digit ] -> head -> y ][ snake[ snake_digit ] -> head -> x + 1 ] == mark_food )
{
snake[ snake_digit ] -> head -> food = 1;//此蛇吃到了食物
}
snake[ snake_digit ] -> head -> move_x = 1;//更新移动所产生的横坐标
snake[ snake_digit ] -> head -> move_y = 0;//更新移动所产生的纵坐标
}
}
}
int main ()
{
//初始化
int toll;//初始化真实人数
int snake_digit;//初始化蛇有几条
int total_food;//判断食物总数
int New_food;//现有食物
srand ( time ( NULL ) );//设置随机数
//开始界面
int pick_Begin;//接收开始页面的选择
HideCursor ( );//隐藏光标
game_Begin:
pick_Begin = Begin ( );
system ( "cls" );
//选择进入哪个模式
switch ( pick_Begin )
{
case 1:
{
goto Single_player;
break;
}
case 2:
{
goto Two_player;
break;
}
case 3:
{
goto Human_computer;
break;
}
}
//单人模式
Single_player:
//动态分配蛇头和身体
toll = 1;//用户数量
snake_digit = 1;//蛇数量
total_food = 10;//食物总数
for ( int i = 0 ; i < snake_digit ; ++ i )//动态分配蛇的内存
{
snake[ i ] = ( name_snake * ) malloc ( sizeof ( name_snake ) );
snake[ i ] -> head = ( snake_head * ) malloc ( sizeof ( snake_head ) );
snake[ i ] -> body = ( snake_body * ) malloc ( sizeof ( snake_body ) );
snake[ i ] -> score = ( game_Integral * ) malloc ( sizeof ( game_Integral ) );
}
print_map ( );//生成地图
for ( int i = 0 ; i < snake_digit ; ++ i )//生成蛇
{
initial_snake ( i );
}
print_score ( 1 );//打印积分
for ( int i = 0 ; i < total_food ; ++ i )
{
food_map ( );//在动图上生成食物
}
while ( 1 )
{
reception_input ( 0 , 1 );//接收用户输入
pick_move ( 0 , 1 );//判断移动方向
if ( snake[ 0 ] -> head -> direction == 0 )//判断是否重开游戏
{
defeat ( 0 , toll );
}
if ( snake[ 0 ] -> head -> direction == 5 || snake[ 0 ] -> head -> direction == 6 )//判断是否重新游戏
{
if ( snake[ 0 ] -> score -> integral > MAX_integral )//更新积分
{
MAX_integral = snake[ 0 ] -> score -> integral;
}
if ( snake[ 0 ] -> head -> direction == 6 )
{
system ( "cls" );
free ( snake[ 0 ] -> score );
free ( snake[ 0 ] -> head );
free ( snake[ 0 ] -> body );
free ( snake[ 0 ] );
goto game_Begin;//返回主页
}
else
{
system ( "cls" );
free ( snake[ 0 ] -> score );
free ( snake[ 0 ] -> head );
free ( snake[ 0 ] -> body );
free ( snake[ 0 ] );
goto Single_player;//重新开始
}
}
move ( 0 );//移动坐标
if ( snake[ 0 ] -> head -> food == 1 )//检查有没有吃到食物的
{
food_map ( );
print_score ( toll );//重新打印积分
snake[ 0 ] -> head -> food = 0;//重置积分状态
}
Sleep ( 80 );//停顿
}
//双人模式
Two_player:
//初始化
toll = 2;//用户数量
snake_digit = 2;//蛇数量
total_food = 20;//食物总数
for ( int i = 0 ; i < snake_digit ; ++ i )//动态分配蛇的内存
{
snake[ i ] = ( name_snake * ) malloc ( sizeof ( name_snake ) );
snake[ i ] -> head = ( snake_head * ) malloc ( sizeof ( snake_head ) );
snake[ i ] -> body = ( snake_body * ) malloc ( sizeof ( snake_body ) );
snake[ i ] -> score = ( game_Integral * ) malloc ( sizeof ( game_Integral ) );
}
print_map ( );//打印当前地图
for ( int i = 0 ; i < snake_digit ; ++ i )//生成蛇
{
initial_snake ( i );
sleep ( 1 );//避免生成一样的蛇
}
print_score ( 2 );//打印积分
for ( int i = 0 ; i < total_food ; ++ i )//在动图上生成食物
{
food_map ( );
}
while ( 1 )
{
for ( int i = 0 ; i < 10 ; ++ i )//接收用户输入
{
reception_input ( toll - 1 , toll );
}
for ( int i = 0 ; i < snake_digit ; ++ i )//判断移动方向
{
pick_move ( i , 2 );//判断移动方向
}
for ( int i = 0 ; i < snake_digit ; ++ i )//移动
{
if ( snake[ i ] -> head -> direction == 0 )//判断是否失败
{
defeat ( i , toll );
}
if ( snake[ i ] -> head -> direction == 5 || snake[ i ] -> head -> direction == 6 )//判断是否重新游戏
{
system ( "cls" );
if ( snake[ i ] -> head -> direction == 6 )
{
for ( int j = 0 ; j < snake_digit ; ++ j )
{
free ( snake[ j ] -> score );
free ( snake[ j ] -> head );
free ( snake[ j ] -> body );
free ( snake[ j ] );
}
goto game_Begin;//返回主页
}
else
{
for ( int j = 0 ; j < snake_digit ; ++ j )
{
free ( snake[ j ] -> score );
free ( snake[ j ] -> head );
free ( snake[ j ] -> body );
free ( snake[ j ] );
}
goto Two_player;//重新开始
}
}
move ( i );//移动坐标
}
for ( int i = 0 ; i < snake_digit ; ++ i )//判断食物
{
if ( snake[ i ] -> head -> food == 1 )//检查有没有吃到食物的
{
food_map ( );
print_score ( toll );//重新打印积分
snake[ i ] -> head -> food = 0;//重置积分状态
}
}
Sleep ( 80 );//停顿
}
//人机模式
Human_computer:
//动态分配蛇头和身体
toll = 1;//用户数量
snake_digit = 7;//蛇数量
total_food = 30;//食物总数
New_food = 0;//新增食物
for ( int i = 0 ; i < snake_digit ; ++ i )//动态分配蛇的内存
{
snake[ i ] = ( name_snake * ) malloc ( sizeof ( name_snake ) );
snake[ i ] -> head = ( snake_head * ) malloc ( sizeof ( snake_head ) );
snake[ i ] -> body = ( snake_body * ) malloc ( sizeof ( snake_body ) );
snake[ i ] -> score = ( game_Integral * ) malloc ( sizeof ( game_Integral ) );
}
print_map ( );//生成地图
for ( int i = 0 ; i < snake_digit ; ++ i )//生成蛇
{
initial_snake ( i );
sleep ( 1 );
}
print_score ( 1 );//打印积分
for ( int i = 0 ; i < total_food ; ++ i )
{
food_map ( );//在动图上生成食物
}
while ( 1 )
{
//用户
reception_input ( 0 , 1 );//接收用户输入
pick_move ( 0 , 3 );//判断移动方向
if ( snake[ 0 ] -> head -> direction == 0 )//判断是否重新游戏
{
defeat ( 0 , toll );
}
if ( snake[ 0 ] -> head -> direction == 5 || snake[ 0 ] -> head -> direction == 6 )//判断是否重开游戏
{
if ( snake[ 0 ] -> score -> integral > MAX_integral )//更新积分
{
MAX_integral = snake[ 0 ] -> score -> integral;
}
system ( "cls" );
if ( snake[ 0 ] -> head -> direction == 6 )
{
for ( int j = 0 ; j < snake_digit ; ++ j )
{
free ( snake[ j ] -> score );
free ( snake[ j ] -> head );
free ( snake[ j ] -> body );
free ( snake[ j ] );
}
goto game_Begin;//返回主页
}
else
{
for ( int j = 0 ; j < snake_digit ; ++ j )
{
free ( snake[ j ] -> score );
free ( snake[ j ] -> head );
free ( snake[ j ] -> body );
free ( snake[ j ] );
}
goto Human_computer;//重新开始
}
}
move ( 0 );//移动坐标
if ( snake[ 0 ] -> head -> food == 1 )//检查有没有吃到食物的
{
if ( New_food == 0 )
{
snake[ 0 ] -> body -> color = rand ( ) % 14 + 1;//给蛇随机生成颜色
food_map ( );
print_score ( toll );//重新打印积分
snake[ 0 ] -> head -> food = 0;//重置积分状态
}
else
{
New_food -= 1;
print_score ( toll );//重新打印积分
snake[ 0 ] -> head -> food = 0;//重置积分状态
}
}
//人机
for ( int i = 1 ; i < snake_digit ; ++ i )//生成坐标
{
reception_input ( i , snake_digit );//生成坐标
pick_move ( i , 3 );//判断移动方向
if ( snake[ i ] -> head -> direction == 0 )//判断是否重新生成
{
//将身体变成食物
for ( int j = 0 ; j < snake[ i ] -> body -> length ; ++ j )
{
color ( snake[ i ] -> body -> color );//设置食物颜色
CursorJump ( snake[ i ] -> body -> y[ j ] , snake[ i ] -> body -> x[ j ] );//光标跳转
map[ snake[ i ] -> body -> y[ j ] ][ snake[ i ] -> body -> x[ j ] ] = mark_food; // 正确标记食物
printf ( "" );
New_food += 1;//增加新增食物
}
//将头变为空
CursorJump ( snake[ i ] -> head -> y , snake[ i ] -> head -> x );//光标跳转
map[ snake[ i ] -> head -> y ][ snake[ i ] -> head -> x ] = mark_NULL; // 正确标记空气
printf ( " " );
//释放本条蛇
free ( snake[ i ] -> score );
free ( snake[ i ] -> head );
free ( snake[ i ] -> body );
free ( snake[ i ] );
//重新生成蛇
snake[ i ] = ( name_snake * ) malloc ( sizeof ( name_snake ) );
snake[ i ] -> head = ( snake_head * ) malloc ( sizeof ( snake_head ) );
snake[ i ] -> body = ( snake_body * ) malloc ( sizeof ( snake_body ) );
snake[ i ] -> score = ( game_Integral * ) malloc ( sizeof ( game_Integral ) );
initial_snake ( i );
}
move ( i );//移动坐标
if ( snake[ i ] -> head -> food == 1 )//检查有没有吃到食物的
{
if ( New_food == 0 )
{
food_map ( );
print_score ( toll );//重新打印积分
snake[ i ] -> head -> food = 0;//重置积分状态
}
else
{
New_food -= 1;
print_score ( toll );//重新打印积分
snake[ i ] -> head -> food = 0;//重置积分状态
}
}
}
Sleep ( 80 );//停顿
}
return 0;
2023-12-07 19:19:14 +08:00
}