1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > c语言双人贪吃蛇-基于图形库实现

c语言双人贪吃蛇-基于图形库实现

时间:2018-09-06 22:05:23

相关推荐

c语言双人贪吃蛇-基于图形库实现

/*蛇蛇大作战作者:施瑞文*/#include <conio.h>#include <graphics.h>#include <time.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <mmsystem.h>#pragma comment(lib,"winmm.lib")#define R 30#define fram_width 30 //宽度#define fram_height 30 //高度#define SIZE 16 //方格边长//玩家1#define UP 'w' //72上#define DOWN 's' //80 下#define LEFT 'a' //75 左#define RIGHT 'd' //77 右//玩家2#define DOWN2 'k' //72,80,75,77是方向键对应的键值 下#define LEFT2 'j' //左#define RIGHT2 'l' //右#define UP2 'i' //上char ch = 'a';//用于记录方向,传统模式char c = LEFT2; //记录玩家2方向int m;//全局变量,用于循环计数int score = 0; //玩家1分数和传统模式分数int score2 = 0; //玩家2分数char maxScore[5] = "0"; //记录传统模式历史最高分struct Food//食物结构体{int x;//食物的横坐标int y;//食物的纵坐标}food;struct Snake { //玩家1贪吃蛇int len; //蛇的长度int x[780]; //蛇的每一节的横坐标int y[780]; //蛇的每一节的纵坐标int count; //蛇吃到的食物数量int speed; //蛇的速度}snake;struct newSnake //玩家2 {int len;int x[780];int y[780];int count;int speed;}new_snake;void initmap(); //画边框void menu();//菜单void getfood(); //随机产生食物void chushihua(); //初始化蛇void eatfood();//判断蛇是否吃到食物int die(); //判断蛇是否死亡void move();//迁移蛇的坐标,移动蛇void turn(char t); //转向void print(); //打印蛇void play(); //开始传统模式游戏void start(); //开始特效int StringToInt(char a[], int n); //将字符串转化为整数void wall(); //传统模式的障碍物void score_rule(); //显示分数和规则//双人PK模式void double_initmap(); //双人PK地图void new_chushihua(); //初始化玩家2的蛇void double_play();//开始双人PK模式游戏void double_eatfood(); //判断是否吃到食物void double_turn(char t); //转向void double_print();//打印玩家2的蛇void double_move1(); //双人模式玩家1移动void double_move2(); //双人模式玩家2移动void double_getfood();//双人模式随机产生食物void double_score_rule();//双人模式 显示分数和操作规则int double_die(); //双人模式判断玩家1是否死亡int double_die2(); //双人模式判断玩家2是否死亡int win(int grade); //判断赢家void main(){do{initgraph(640, 480); //产生画板PlaySound("F:\\Snake_bgm\\start.WAV", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐menu(); //进入菜单closegraph(); //关闭画板} while (1);system("pause");}int StringToInt(char a[], int n)//将字符串转化为整数{if (n == 1)return a[0] - 48;elsereturn StringToInt(a, n - 1) * 10 + a[n - 1] - 48;}void start()//开始特效{int x, y, i;for (i = 0; i<30; i++){x = i;for (y = x; y<R - x; y++){setfillcolor(BROWN);fillrectangle(x*SIZE, y*SIZE, x*SIZE + SIZE, y*SIZE + SIZE);}x = (R - 1 - i);for (y = i; y <= x; y++){setfillcolor(BROWN);fillrectangle(x*SIZE, y*SIZE, x*SIZE + SIZE, y*SIZE + SIZE);}x = i;for (y = x; y<R - x; y++){setfillcolor(BROWN);fillrectangle(y*SIZE, x*SIZE, y*SIZE + SIZE, x*SIZE + SIZE);}x = (R - 1 - i);for (y = i; y <= x; y++){setfillcolor(BROWN);fillrectangle(y*SIZE, x*SIZE, y*SIZE + SIZE, x*SIZE + SIZE);}Sleep(50);}for (i = 0; i<30; i++){x = i;for (y = x; y<R - x; y++){setfillcolor(BLACK);solidrectangle(x*SIZE, y*SIZE, x*SIZE + SIZE, y*SIZE + SIZE);}x = (R - 1 - i);for (y = i; y <= x; y++){setfillcolor(BLACK);solidrectangle(x*SIZE, y*SIZE, x*SIZE + SIZE, y*SIZE + SIZE);}x = i;for (y = x; y<R - x; y++){setfillcolor(BLACK);solidrectangle(y*SIZE, x*SIZE, y*SIZE + SIZE, x*SIZE + SIZE);}x = (R - 1 - i);for (y = i; y <= x; y++){setfillcolor(BLACK);solidrectangle(y*SIZE, x*SIZE, y*SIZE + SIZE, x*SIZE + SIZE);}Sleep(50);}}void double_getfood()//双人模式随机产生食物{int flag;while (1){flag = 1;food.x = rand() % (fram_width - 2) + 1;food.y = rand() % (fram_height - 2) + 1;for (m = 0; m<snake.len; m++){if (food.x == snake.x[m] && food.y == snake.y[m]) //判断食物是否落到蛇身上{flag = 0;break;}}if (flag == 0)continue;for (m = 0; m<new_snake.len; m++){if (food.x == new_snake.x[m] && food.y == new_snake.y[m]){flag = 0;break;}}if (flag == 0)continue;if (flag == 1){if ((new_snake.count + snake.count) % 5 == 0 && (new_snake.count + snake.count) != 0)//每产生5个小食物后产生1个大食物{setfillcolor(WHITE);fillcircle(food.x*SIZE + SIZE / 2, food.y*SIZE + SIZE / 2, SIZE / 2);}else{setfillcolor(WHITE);fillcircle(food.x*SIZE + SIZE / 2, food.y*SIZE + SIZE / 2, SIZE / 4);}break;}}}void getfood()//产生食物{int flag;while (1){flag = 1;food.x = rand() % (fram_width - 2) + 1;food.y = rand() % (fram_height - 2) + 1;for (m = 1; m<fram_width / 3; m++){if ((food.x == m && food.y == fram_height / 4) || (food.x == m && food.y == 3 * fram_height / 4))//判断食物是否落到蛇身上{flag = 0;break;}}if (flag == 0)continue;for (m = 2 * fram_width / 3; m<fram_width; m++){if (food.x == m && food.y == fram_height / 2)//判断食物是否落到障碍物上{flag = 0;break;}}if (flag == 0)continue;for (m = 0; m<snake.len; m++){if (food.x == snake.x[m] && food.y == snake.y[m]){flag = 0;break;}}if (flag == 0)continue;if (flag == 1){if (snake.count % 5 == 0 && snake.count != 0){setfillcolor(WHITE);fillcircle(food.x*SIZE + SIZE / 2, food.y*SIZE + SIZE / 2, SIZE / 2);}else{setfillcolor(WHITE);fillcircle(food.x*SIZE + SIZE / 2, food.y*SIZE + SIZE / 2, SIZE / 4);}break;}}}void double_eatfood()//双人模式判断是否吃到食物{if (snake.x[0] == food.x&&snake.y[0] == food.y)//如果玩家1吃到食物{snake.len++;if ((snake.count + new_snake.count) % 5 == 0 && (snake.count + new_snake.count) != 0){score += 15;}elsescore += 5;snake.count++;double_getfood();}else if (new_snake.x[0] == food.x&&new_snake.y[0] == food.y)//如果玩家2吃到食物{new_snake.len++;if ((snake.count + new_snake.count) % 5 == 0 && (snake.count + new_snake.count) != 0){score2 += 15;}elsescore2 += 5;new_snake.count++;double_getfood();}}void eatfood()//传统模式 判断是否吃到食物{if (snake.x[0] == food.x&&snake.y[0] == food.y){snake.len++;if (snake.count % 5 == 0 && snake.count != 0){score += 20;if (snake.speed>100)snake.speed -= 50;elsesnake.speed = 100;}elsescore += 5;snake.count++;getfood();//吃完还有}}void new_chushihua()//初始化玩家2{//产生蛇头new_snake.x[0] = (fram_width) / 3;new_snake.y[0] = (fram_height) / 3;new_snake.speed = 300;moveto(new_snake.x[0] * SIZE, new_snake.y[0] * SIZE);setfillcolor(BLUE);fillcircle(new_snake.x[0] * SIZE + SIZE / 2, new_snake.y[0] * SIZE + SIZE / 2, SIZE / 2);//产生蛇身fillcircle(new_snake.x[0] * SIZE + SIZE / 2, new_snake.y[0] * SIZE + SIZE / 2, SIZE / 2);new_snake.len = 4;for (int k = 1; k < new_snake.len; k++)//依次给后一节蛇身赋值{//将前一节坐标赋给后一节new_snake.x[k] = new_snake.x[k - 1] + 1;new_snake.y[k] = new_snake.y[k - 1];moveto(new_snake.x[k] * SIZE, new_snake.y[k] * SIZE);setfillcolor(YELLOW);//填充颜色fillcircle(new_snake.x[k]*SIZE+SIZE/2, new_snake.y[k]*SIZE+SIZE/2, SIZE/2);//画蛇}}void chushihua(){//产生蛇头snake.x[0] = (fram_width) / 2;snake.y[0] = (fram_height) / 2;snake.speed = 300;moveto(snake.x[0] * SIZE, snake.y[0] * SIZE);setfillcolor(GREEN);fillcircle(snake.x[0] * SIZE + SIZE / 2, snake.y[0] * SIZE + SIZE / 2, SIZE / 2);//产生蛇身//fillcircle(snake.x[0] * SIZE + SIZE / 2, snake.y[0] * SIZE + SIZE / 2, SIZE / 2);snake.len = 4;for (int k = 1; k < snake.len; k++){//将前一节坐标赋给后一节snake.x[k] = snake.x[k - 1] + 1;snake.y[k] = snake.y[k - 1];moveto(snake.x[k] * SIZE, snake.y[k] * SIZE);setfillcolor(RED);//填充颜色fillcircle(snake.x[k]*SIZE+SIZE/2, snake.y[k]*SIZE+SIZE/2, SIZE/2);//画蛇}}void move()//迁移坐标,移动蛇{//每次移动将蛇尾巴画为背景色moveto(snake.x[snake.len - 1] * SIZE, snake.y[snake.len - 1] * SIZE);setfillcolor(BLACK);solidrectangle(snake.x[snake.len - 1] * SIZE, snake.y[snake.len - 1] * SIZE, snake.x[snake.len - 1] * SIZE + SIZE, snake.y[snake.len - 1] * SIZE + SIZE);if (snake.y[0] == 0)//穿墙snake.y[0] = fram_height - 2;else if (snake.y[0] == fram_height - 1)snake.y[0] = 0;for (m = snake.len - 1; m > 0; m--){//将后一节坐标赋值给前一节坐标snake.x[m] = snake.x[m - 1];snake.y[m] = snake.y[m - 1];}}void double_move1()//双人模式移动玩家1{//每次移动将蛇尾巴画为背景色moveto(snake.x[snake.len - 1] * SIZE, snake.y[snake.len - 1] * SIZE);setfillcolor(BLACK);solidrectangle(snake.x[snake.len - 1] * SIZE, snake.y[snake.len - 1] * SIZE, snake.x[snake.len - 1] * SIZE + SIZE, snake.y[snake.len - 1] * SIZE + SIZE);if (snake.y[0] == 0)//穿墙snake.y[0] = fram_height - 2;else if (snake.y[0] == fram_height - 1)snake.y[0] = 0;else if (snake.x[0] == 0)snake.x[0] = fram_width - 2;else if (snake.x[0] == fram_width - 1)snake.x[0] = 0;for (m = snake.len - 1; m > 0; m--){//将后一节坐标赋值给前一节坐标snake.x[m] = snake.x[m - 1];snake.y[m] = snake.y[m - 1];}}void double_move2()//双人模式移动玩家2{//int k;//每次移动将蛇尾巴画为背景色moveto(new_snake.x[new_snake.len - 1] * SIZE, new_snake.y[new_snake.len - 1] * SIZE);setfillcolor(BLACK);solidrectangle(new_snake.x[new_snake.len - 1] * SIZE, new_snake.y[new_snake.len - 1] * SIZE, new_snake.x[new_snake.len - 1] * SIZE + SIZE, new_snake.y[new_snake.len - 1] * SIZE + SIZE);if (new_snake.y[0] == 0)//穿墙new_snake.y[0] = fram_height - 2;else if (new_snake.y[0] == fram_height - 1)new_snake.y[0] = 0;else if (new_snake.x[0] == 0)new_snake.x[0] = fram_width - 2;else if (new_snake.x[0] == fram_width - 1)new_snake.x[0] = 0;for (m = new_snake.len - 1; m > 0; m--){//将后一节坐标赋值给前一节坐标new_snake.x[m] = new_snake.x[m - 1];new_snake.y[m] = new_snake.y[m - 1];}}void double_turn(char t){if (t == UP2)new_snake.y[0]--;else if (t == DOWN2)new_snake.y[0]++;else if (t == LEFT2)new_snake.x[0]--;else if (t == RIGHT2)new_snake.x[0]++;}void turn(char t){if (t == UP)snake.y[0]--;else if (t == DOWN)snake.y[0]++;else if (t == LEFT)snake.x[0]--;else if (t == RIGHT)snake.x[0]++;}void print()//打印蛇{//打印蛇头moveto(snake.x[0] * SIZE, snake.y[0] * SIZE);setfillcolor(GREEN);fillcircle(snake.x[0] * SIZE + SIZE / 2, snake.y[0] * SIZE + SIZE / 2, SIZE / 2);//打印蛇身for (m = 1; m<snake.len; m++){setfillcolor(RED);fillcircle(snake.x[m] * SIZE + SIZE / 2, snake.y[m] * SIZE + SIZE / 2, SIZE / 2);}}void double_print()//双人模式 同时打印两条蛇{int len = new_snake.len<snake.len ? new_snake.len : snake.len;//len取两者中的较小值moveto(new_snake.x[0] * SIZE, new_snake.y[0] * SIZE);setfillcolor(BLUE);fillcircle(new_snake.x[0] * SIZE + SIZE / 2, new_snake.y[0] * SIZE + SIZE / 2, SIZE / 2);//画玩家2的蛇头moveto(snake.x[0] * SIZE, snake.y[0] * SIZE);setfillcolor(GREEN);fillcircle(snake.x[0] * SIZE + SIZE / 2, snake.y[0] * SIZE + SIZE / 2, SIZE / 2);//画玩家1的蛇头for (m = 1; m<len; m++)//同时画玩家1和玩家2的蛇身{setfillcolor(RED);fillcircle(snake.x[m] * SIZE + SIZE / 2, snake.y[m] * SIZE + SIZE / 2, SIZE / 2);setfillcolor(YELLOW);fillcircle(new_snake.x[m] * SIZE + SIZE / 2, new_snake.y[m] * SIZE + SIZE / 2, SIZE / 2);}for (m = len; m<(new_snake.len>snake.len ? new_snake.len : snake.len); m++){if (new_snake.len>snake.len)//如果玩家2的蛇比玩家1的蛇长,则把玩家2比玩家1多处的那部分补全{setfillcolor(YELLOW);fillcircle(new_snake.x[m] * SIZE + SIZE / 2, new_snake.y[m] * SIZE + SIZE / 2, SIZE / 2);}else//如果玩家1的蛇比玩家2的蛇长,则把玩家1比玩家2多处的那部分补全{setfillcolor(RED);fillcircle(snake.x[m] * SIZE + SIZE / 2, snake.y[m] * SIZE + SIZE / 2, SIZE / 2);}}}int win(int grade)//判断输赢{if (score >= grade)//如果玩家1率先达到50分,则玩家1胜利return 1;else if (score2 >= grade)//否则玩家2胜利return 2;}void wall()//画障碍物{for (m = 1; m<fram_width / 3; m++){setfillcolor(BROWN);fillrectangle(m*SIZE, fram_height / 4 * SIZE, m*SIZE + SIZE, fram_height / 4 * SIZE + SIZE);}for (m = 2 * fram_width / 3; m<fram_width; m++){setfillcolor(BROWN);fillrectangle(m*SIZE, fram_height / 2 * SIZE, m*SIZE + SIZE, fram_height / 2 * SIZE + SIZE);}for (m = 1; m<fram_width / 3; m++){setfillcolor(BROWN);fillrectangle(m*SIZE, 3 * fram_height / 4 * SIZE, m*SIZE + SIZE, 3 * fram_height / 4 * SIZE + SIZE);}}void double_score_rule()//分数与规则{settextcolor(WHITE);outtextxy(31 * SIZE, 3 * SIZE, "玩家1:");setfillcolor(GREEN);fillcircle(34 * SIZE + SIZE / 2, 3 * SIZE + SIZE / 2, SIZE / 2);//产生蛇身for (int k = 35; k <38; k++){setfillcolor(RED);fillcircle(k * SIZE + SIZE / 2, 3 * SIZE + SIZE / 2, SIZE / 2);}char count1[5];itoa(score, count1, 10);//将整数转化为字符串settextcolor(WHITE);outtextxy(31 * SIZE, 5 * SIZE, "分数:");setfillcolor(BLACK);solidrectangle(34 * SIZE, 5 * SIZE, 38 * SIZE + SIZE, 5 * SIZE + SIZE);outtextxy(34 * SIZE, 5 * SIZE, count1);settextcolor(WHITE);outtextxy(31 * SIZE, 7 * SIZE, "玩家2:");setfillcolor(BLUE);fillcircle(new_snake.x[0] * SIZE + SIZE / 2, new_snake.y[0] * SIZE + SIZE / 2, SIZE / 2);//产生蛇身fillcircle(34 * SIZE + SIZE / 2, 7 * SIZE + SIZE / 2, SIZE / 2);for (int j = 35; j < 38; j++){setfillcolor(YELLOW);fillcircle(j * SIZE + SIZE / 2, 7 * SIZE + SIZE / 2, SIZE / 2);}char count2[5];itoa(score2, count2, 10);settextcolor(WHITE);outtextxy(31 * SIZE, 9 * SIZE, "分数:");setfillcolor(BLACK);solidrectangle(34 * SIZE, 9 * SIZE, 38 * SIZE + SIZE, 9 * SIZE + SIZE);outtextxy(34 * SIZE, 9 * SIZE, count2);line(30 * SIZE, 11 * SIZE, 40 * SIZE, 11 * SIZE);settextcolor(RED);outtextxy(31 * SIZE, 13 * SIZE, "玩家1:");settextcolor(GREEN);outtextxy(31 * SIZE, 14 * SIZE, " w: 上 s: 下");outtextxy(31 * SIZE, 15 * SIZE, " a: 左 d: 右");settextcolor(RED);outtextxy(31 * SIZE, 17 * SIZE, "玩家2:");settextcolor(GREEN);outtextxy(31 * SIZE, 18 * SIZE, " i: 上 k: 下");outtextxy(31 * SIZE, 19 * SIZE, " j: 左 l: 右");settextcolor(RED);outtextxy(31 * SIZE, 21 * SIZE, "规则:");settextcolor(WHITE);outtextxy(31 * SIZE, 23 * SIZE, "1.率先达到目标分者");outtextxy(31 * SIZE, 24 * SIZE, " 胜利。");outtextxy(31 * SIZE, 25 * SIZE, "2.游戏过程中若碰到");outtextxy(31 * SIZE, 26 * SIZE, " 对方身体,则减15");outtextxy(31 * SIZE, 27 * SIZE, " 分,并在初始位置");outtextxy(31 * SIZE, 28 * SIZE, " 复活");}void score_rule(){char count[5];FILE *fp;fp = fopen("maxscore", "a+");//读取文件中的内容if (fp != NULL){settextcolor(GREEN);while (fgets(maxScore, 5, fp) != NULL)//将文件中的内容写入maxScore数组中outtextxy(35 * SIZE, 5 * SIZE, maxScore);//将最高分显示在画板上fclose(fp);}itoa(score, count, 10);//将整数转化为字符串settextcolor(WHITE);outtextxy(31 * SIZE, 3 * SIZE, "分数:");setfillcolor(BLACK);solidrectangle(34 * SIZE, 3 * SIZE, 38 * SIZE + SIZE, 3 * SIZE + SIZE);outtextxy(34 * SIZE, 3 * SIZE, count);outtextxy(31 * SIZE, 5 * SIZE, "最高分:");line(30 * SIZE, 9 * SIZE, 40 * SIZE, 9 * SIZE);outtextxy(31 * SIZE, 11 * SIZE, " w:上");outtextxy(31 * SIZE, 13 * SIZE, " s:下");outtextxy(31 * SIZE, 15 * SIZE, " a:左");outtextxy(31 * SIZE, 17 * SIZE, " d:右");}void double_initmap(){for (int i = 1; i < fram_width - 1; i++){setfillcolor(BLACK);fillrectangle(i*SIZE, 0, i*SIZE + SIZE, SIZE);setfillcolor(BLACK);fillrectangle(i*SIZE, SIZE*(fram_width - 1), i*SIZE + SIZE, SIZE*(fram_width - 1) + SIZE);}for (int j = 0; j < fram_height; j++){setfillcolor(BLACK);fillrectangle(0, j*SIZE, SIZE, j*SIZE + SIZE);setfillcolor(BLACK);fillrectangle(SIZE*(fram_height - 1), j*SIZE, SIZE*(fram_height - 1) + SIZE, j*SIZE + SIZE);}}void initmap(){//产生围栏for (int i = 1; i < fram_width - 1; i++){setfillcolor(BLACK);fillrectangle(i*SIZE, 0, i*SIZE + SIZE, SIZE);setfillcolor(BLACK);fillrectangle(i*SIZE, SIZE*(fram_width - 1), i*SIZE + SIZE, SIZE*(fram_width - 1) + SIZE);}for (int j = 0; j < fram_height; j++){setfillcolor(BROWN);fillrectangle(0, j*SIZE, SIZE, j*SIZE + SIZE);setfillcolor(BROWN);fillrectangle(SIZE*(fram_height - 1), j*SIZE, SIZE*(fram_height - 1) + SIZE, j*SIZE + SIZE);}}int double_die1(){for (int i = 1; i<new_snake.len; i++){if (snake.x[0] == new_snake.x[i] && snake.y[0] == new_snake.y[i]){return 1;}}return 0;}int double_die2(){for (int i = 1; i<snake.len; i++){if (new_snake.x[0] == snake.x[i] && new_snake.y[0] == snake.y[i]){return 1;}}return 0;}int die(){for (int i = 1; i<snake.len; i++){if (snake.x[0] == snake.x[i] && snake.y[0] == snake.y[i]){return 1;}}for (m = 1; m<fram_width / 3; m++){if ((snake.x[0] == m && snake.y[0] == fram_height / 4) || (snake.x[0] == m && snake.y[0] == 3 * fram_height / 4)){return 1;}}for (m = 2 * fram_width / 3; m<fram_width; m++){if (snake.x[0] == m && snake.y[0] == fram_height / 2){return 1;}}if (snake.x[0] == 0 || snake.x[0] == fram_width - 1){return 1;}return 0;}void menu(){char str[100];InputBox(str, 100, "请选择:\n\n 1.传统模式\n\n 2.双人PK\n\n 3.退出游戏", "蛇蛇大作战", "", 250, 100, false);if (strcmp(str, "1") == 0){PlaySound("F:\\Snake_bgm\\bgm1.WAV", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);start();initmap();wall();score_rule();srand(time(NULL));play();}else if (strcmp(str, "2") == 0){PlaySound("F:\\Snake_bgm\\double_play.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);start();double_initmap();srand(time(NULL));double_play();}else if (strcmp(str, "3") == 0){exit(0);}}void double_play()//开始双人PK游戏{char str[5];int len;int grade;while(1){int flag=1;InputBox(str, 5, "请输入目标分数(1~1000)\n只能输入数字", "蛇蛇大作战", "", 200, 100, false);len=strlen(str);str[len]='\0';if(str[0]==NULL)continue;for(int i=0;i<len;i++)if(str[i]<'0'||str[i]>'9'){flag=0;break;}if(!flag)continue;grade=StringToInt(str,len);if(grade>0&&grade<=1000)break;}settextcolor(WHITE);outtextxy(31 * SIZE, 1 * SIZE, "目标分数:");settextcolor(BROWN);outtextxy(36 * SIZE, 1 * SIZE, str);char k = 'a';char t = LEFT2; //k和t分别记录蛇前一时刻移动的方向new_snake.count = 0;snake.count = 0;score = 0;score2 = 0;new_chushihua();chushihua(); //初始化int move1 = 0, move2 = 0;//标记按键的归属char key, key1 = LEFT, key2 = LEFT2;//初始方向double_getfood();//产生食物while (1){double_eatfood();//判断是否吃到食物double_move2();double_move1();//移动蛇move1 = 0;move2 = 0;if (kbhit())//如果有按键{key = getch();//获取按键值switch (key)//判断按键{case UP2:case DOWN2:case LEFT2:case RIGHT2:key2 = key; move2 = 1; break;//如果按键属于玩家2,move2=1;case UP:case DOWN:case LEFT:case RIGHT:key1 = key; move1 = 1; break;//如果按键属于玩家1,move1=1;}}if (move1 == 1)//如果move1=1,即按键属于玩家1{if (k == LEFT && key1 == RIGHT) //防止反向咬到自己key1 = LEFT;else if (k == UP && key1 == DOWN)key1 = UP;else if (k == RIGHT && key1 == LEFT)key1 = RIGHT;else if (k == DOWN && key1 == UP)key1 = DOWN;turn(key1);//转向}if (move2 == 1)//如果move2=1,即按键属于玩家2{if (t == UP2 && key2 == DOWN2) //防止反向咬到自己key2 = UP2;else if (t == DOWN2 && key2 == UP2)key2 = DOWN2;else if (t == LEFT2 && key2 == RIGHT2)key2 = LEFT2;else if (t == RIGHT2 && key2 == LEFT2)key2 = RIGHT2;double_turn(key2);//转向}if (move2 == 0)//如果按键属于玩家1,则玩家2的蛇继续维持上一时刻的方向double_turn(t);if (move1 == 0)//如果按键属于玩家2,则玩家1的蛇继续维持上一时刻的方向turn(k);k = key1;t = key2;//获取上一时刻的方向if (double_die1())//判断玩家1是否死亡{if (score >= 15)//如果分数大于15分score -= 15;else//如果分数小于15分,则分数清零score = 0;for (m = 0; m<snake.len; m++)//死亡后,将遗体用背景色覆盖{setfillcolor(BLACK);solidrectangle(snake.x[m] * SIZE, snake.y[m] * SIZE, snake.x[m] * SIZE + SIZE, snake.y[m] * SIZE + SIZE);}k=key1=LEFT;chushihua();//初始化蛇}if (double_die2())//如果玩家2死亡{if (score2 >= 15)score2 -= 15;elsescore2 = 0;for (m = 0; m<new_snake.len; m++){setfillcolor(BLACK);solidrectangle(new_snake.x[m] * SIZE, new_snake.y[m] * SIZE, new_snake.x[m] * SIZE + SIZE, new_snake.y[m] * SIZE + SIZE);}t=key2=LEFT2;new_chushihua();}double_print();//画蛇double_initmap();double_score_rule();if (win(grade) == 1)//如果玩家1胜利{PlaySound("F:\\Snake_bgm\\win.WAV", NULL, SND_FILENAME | SND_ASYNC);settextcolor(YELLOW);LOGFONT f;gettextstyle(&f); // 获取当前字体设置f.lfHeight = 48; // 设?米痔甯叨任? 48_tcscpy(f.lfFaceName, _T("黑体")); // 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿 settextstyle(&f); // 设置字体样式outtextxy(8 * SIZE, 12 * SIZE, _T("玩家1胜利!"));outtextxy(8 * SIZE, 15 * SIZE, _T("按空格键继续!"));while (getch() != ' '){;}break;}else if (win(grade) == 2)//如果玩家2胜利{PlaySound("F:\\Snake_bgm\\win.WAV", NULL, SND_FILENAME | SND_ASYNC);settextcolor(YELLOW);LOGFONT f;gettextstyle(&f); // 获取当前字体设置f.lfHeight = 48; // 设?米痔甯叨任? 48_tcscpy(f.lfFaceName, _T("黑体")); // 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿 settextstyle(&f); // 设置字体样式outtextxy(8 * SIZE, 12 * SIZE, _T("玩家2胜利!"));outtextxy(8 * SIZE, 15 * SIZE, _T("按空格键继续!"));while (getch() != ' '){;}break;}Sleep(150);}}void play() //开始传统模式游戏{char k = 'a';//k记录前一时刻移动的方向char ch = 'a';snake.count = 0;score = 0;chushihua();getfood();while (1){if (kbhit()){while (1)//如果按其他键,则暂停{ch = getch();if (ch == 'w' || ch == 'a' || ch == 's' || ch == 'd')break;elsecontinue;}}eatfood();move();if (k == 'a'&&ch == 'd') //防止反向咬到自己ch = 'a';else if (k == 'w'&&ch == 's')ch = 'w';else if (k == 'd'&&ch == 'a')ch = 'd';else if (k == 's'&&ch == 'w')ch = 's';turn(ch);k = ch;if (die()){PlaySound("F:\\Snake_bgm\\gameover.WAV", NULL, SND_FILENAME | SND_ASYNC);settextcolor(YELLOW);LOGFONT f;gettextstyle(&f); // 获取当前字体设置f.lfHeight = 48; // 设?米痔甯叨任? 48_tcscpy(f.lfFaceName, _T("黑体")); // 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿 settextstyle(&f); // 设置字体样式outtextxy(8 * SIZE, 12 * SIZE, _T("Game Over!"));outtextxy(8 * SIZE, 15 * SIZE, _T("按空格键继续!"));FILE *fp;int len;len = strlen(maxScore);maxScore[len] = '\0';int maxscore;char ms[5];maxscore = StringToInt(maxScore, len);//将字符串转化为整数if (score>maxscore)//如果破纪录{fp = fopen("maxscore", "w");//将新纪录写入文件,并将文件中的原内容清空if (fp != NULL){itoa(score, ms, 10);fputs(ms, fp);}fclose(fp);}while (getch() != ' '){;}break;}print();initmap();//画边框wall();//画障碍物score_rule();//显示分数和规则Sleep(snake.speed);//速度}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。