首页 > 作文

C语言实现贪吃蛇小黑窗

更新时间:2023-04-04 10:04:02 阅读: 评论:0

本文实例为大家分享了c语言实现贪吃蛇小黑窗的具体代码,供大家参考,具体内容如下

思路:

1.利用整型二维数组保存显示数据,小蛇每移动一次清屏并便利数组做到动态效果。每次移动(清屏)的间隔时间控制了游戏难度,这个时间应不断缩减,直到游戏结束。

2.需要保存小蛇移动的方向,然后写一个函数通过小蛇的移动方向去处理二维数组中的数据,达到移动小蛇的目的。

3.小蛇的移动可分解为两个过程:头部像前方生长一格然后尾部消去一格。如果蛇头吃到食物,尾部无需消去,此时应立即随机生成一个新的食物。

4.游戏开始时小蛇应随机生成在地图某一位置,此时小蛇的默认移动方向也应该是随机的。

5每次移动前应接收玩家由键盘输入的移动方向,如果接收到后,判断合法后将其设为小蛇的默认移动方向,如果玩家未进行任何输入,小蛇应按照默认方向移动。

个人难点:

1.小蛇移动

该函数需要拿到蛇头当时所在的位置坐标和小蛇的移动方向。随后可由蛇头位置往移动方向往前生长一格,即将二维数组中目标移动位置的数据设置为小蛇的数据。消去蛇尾另写一个函数,调用前需先判断是否吃到食物,是否撞到墙壁或者是自身,然后决定是否削去尾部。消去蛇尾需获得蛇尾的位置,所以我们在该函数内加入递归搜索蛇尾的算法:进入函数后先判断此时的位置是否为蛇尾,若不是就将自身位置往后移动一格(将蛇身往后一格的坐标输入给deletetail函数,然后继续此过程),直到遇到蛇尾,然后将其消去(置零)。

具体代码实现如下:

int movesnake(int trend, int* px, int* py, int data[row][col], int* t){ int ret = 1;//默认前进成功 //printf("trend=%d\n", trend); switch (trend) { ca 1:*py -= 1; break;//向上 ca 2:*px -= 1; break;//向左 ca 3:*py += 1; break;//向下 ca 4:*px += 1; break;//向右 }//找到即将前进的坐标 if (data[*py][*px] == 6) {  data[*py][*px] = trend;  creatfood(data);  *t *= 0.9; }//如果蛇头要前进的格子是食物,向前长一格,尾部不变; el if (data[*py][*px] == 0) {  data[*py][*px] = 巴菲特写给股东的信trend;//向前长一格  deletetail(*px, *py, data);//消去最后的尾巴 } el {  ret = 0;  printf("前进失败\n"); }//前进失败 return ret;}int deletetail(int x, int y, int data[row][col]){ //printtest(data); if (data[y][x] <= 4 && data[y][x] >= 1) {  switch (data[y][x]) {  ca 1:   if (deletetail(x, y + 1, data) == 0) {    data[y][x] = 0;   }   break;  ca 2:   if (deletetail(x + 1, y, data) == 0) {    data[y][x] = 0;   }   break;  ca 3:   if (deletetail(x, y - 1, data) == 0) {    data[y][x] = 0;   }   break;  ca 4:   if (deletetail(x - 1, y, data) == 0) {    data[y][x] = 0;   }   break;  }  return 1; } el {  return 0; }}

2.输入

在实际代码实现的过程中,我发现scanf函数无法实现需求,理由是程序执行到scanf语句时,会停留在该位置,直到scanf函数扫描到输入后,程序才会继续进行。经学习查阅,决定使用kbhit函数扫描此时键盘缓冲区中是否有数据:如果有就读取第一个数据,并将后面的数据清空,避免后面使用该数据,若没有数据,缓冲区不做任何处理,程序也应当继续执行。

使用kbhit函数前应“#include<conio.h>”。清理缓冲区运用的是getch()循环。代码如下:

int input() { int trend = 0; if (kbhit()) {  char trend_ = getch();  while (kbhit()) {   getch();  }//清空缓冲区  //printf("已接收到%c ", trend_);  switch (trend_) {  ca 'w':trend = 1; break;  ca 'a':trend = 2; break;  ca 's':trend = 3; break;  ca 'd':trend = 4; break;  default:printf("请输入w,a,s,d以控制前进方向!!\n");   break;  } } el {  printf("请输入w,a,s,d以控制前进方向!!\n"); } return trend;}

完整源代码:

#pragma once#pragma warning(disable : 4996)#include<stdio.h>#include<time.h>#include<stdlib.h>#include<windows.h>#include<conio.h>#define row 30#define col 30#define time 300int game();int menu();int input();int creathead(int* px, int* py, int data[row][col]);void creatfood(int data[row][col]);int movesnake(int trend, int* px, int* py, int data[row][col], int* t);int deletetail(int x, int y, int data[row][col]);void printshow(int data[row][col]);int gameover(int score);void printtest(int data[row][col]);
#include"main.h"int main(){ int ret = 1; while (ret) {  int choo = menu();  int score = 0;  switch (choo) {  ca 1:   score = game();   ret = gameover(score);   break;  ca 2:   system("cls");   printf("==========================================================\n");   printf("           游戏说明              \n");   printf(" 1.输入‘w'‘a'‘s'‘d'以控制小蛇的移动。\n");   printf(" 2.小蛇在固定时间内只移动一次,如一个时间段内输入多个方向\n则以第一次输入为准。\n");   printf(" 3.不能撞到墙壁或者是自身。\n");   printf(" 4.小蛇移动速度会在吃到食物后加快,直到游戏结束。\n");   printf(" 输入“1”继续...........\n");   printf("==========================================================\n");   int ok = 0;   scanf("%d", &ok);   if (ok) {    system("cls");    break;   }  ca 3:   ret = 0;   break;  } }}
#include"main.h"int game(){ int data[row][col] = { 0 }; int time_ = time; for (int i = 0; i < col; i++) {  for (int j = 0; j < row; j++) {   if (i == 0 || i == col - 1) {    data[i][j] = 5;//边界墙   }   if (j == 0 || j == row - 1) {    data[i][j] = 5;//边界墙   }  } }//初始化数据存储数组 //printshow(data); int x = 0, y = 0; int trend = creathead(&x, &y, data); //生成蛇头 creatfood(data);//生成食物 int ret = 1; while (ret) {  system("cls");  printshow(data);  sleep(time_);  int trend_ = input();  if (trend_ != 0) {   trend = trend_;  }  ret = movesnake重大新闻事件(trend, &x, &y, data, &time_); } int score = 0; for (int i = 0; i < row; i++) {  for (int j = 0; j < col; j++) {   if (data[i][j] <= 4 && data[i][j] >= 1) {    score++;   }  } } return score;}int menu(){ int choo = 0; while (1) {  printf("==========================\n");  printf("===欢迎进入贪吃蛇游戏!===\n");  printf("===  1、经典模式   ===\n");  printf("===  2、游戏说明   ===\n");  printf("===  3、退出游戏   ===\n");  printf("=== 请输入您的选项... ===\n");  printf("==========================\n");  scanf("%d", &choo);  if (choo == 1 || choo == 2 || choo == 3) {   break;  } } return choo;}int movesnake(int trend, int* px, int* py, int data[row][col], int* t){ int ret = 1;//默认前进成功 //printf("trend=%d\n", trend); switch (trend) { ca 1:*py -= 1; break;//向上 ca 2:*px -= 1; break;//向左 ca 3:*py += 1; break;//向下 ca 4:*px += 1; break;//向右 }//找到即将前进的坐标 if (data[*py][*px] == 6) {  data[*py][*px] = trend;  creatfood(data);  *t *= 0.9; }//如果蛇头要前进的格子是食物,向前长一格,尾部不变; el if (data[*py][*px] == 0) {  data[*py][*px] = trend;//向前长一格  deletetail(*px, *py, data);//消去最后的尾巴 } el {  ret = 0;  printf("前进失败\n"); }//前进失败 return ret;}void creatfood(int data[row][col]){ srand(time(多媒体计算机null)); while (1) {  int x = rand() % (col - 2) + 1;  int y = rand() % (row - 2) + 1;  if (data[y][x] == 0) {   data[y][x] = 6;   break;  } }}int deletetail(int x, int y, int data[row][col]){ //printtest(data); if (data[y][x] <= 4 && data[y][x] >= 1) {  switch (data[y][x]) {  ca 1:   if (deletetail(x, y + 1, data) == 0) {    data[y][x] = 0;   }   break;  ca 2:   if (deletetail(x + 1, y, data) == 0) {    data[y][x] = 0;   }   break;  ca 3:   if (deletetail(x, y - 1, data) == 0) {    data[y][x] = 0;   }   break;  ca 4:   if (deletetail(x - 1, y, data) == 0) {    data[y][x] = 0;   }   break;  }  return 1; } el {  return 0; }}int input() { int trend = 0; if (kbhit()) {  char trend_ = getch();  while (kbhit()) {   getch();  }//清空缓冲区  //printf("已接收到%c ", trend_);  switch (trend_) {  ca 'w':trend = 1; break;  ca 'a':trend = 2; break;  ca 's':trend = 3; break;  ca 'd':trend = 4; break;  default:printf("请输入w,a,s,d以控制前进方向!!\n");   break;  } } el {  printf("请输入w,a,s,d以控制前进方向!!\n"); } return trend;}void printshow(int data[row][col]){ for (int i = 0; i < row; i++) {  for (int j = 0; j < col; j++) {   if (data[i][j] == 0) {    printf(" ");   }   if (data[i][j] == 5) {    printf("■");   }   if (data[i][j] >= 1 && data[i][j] <= 4) {    printf("□");   }   if (data[i][j] == 6) {    printf("●");   }  }  printf("\n"); }}int creathead(int* px, int* py, int data[row][col]){ srand(time(null)); while (1) {  *px = rand() % (col - 8) + 4; 19朵粉玫瑰代表什么 *py = rand() % (row - 8) + 4;  if (data[*py][*px] == 0) {   break;  } }//蛇头只能刷新在空格位置 //x,y始终为蛇头的坐标 int trend = rand() % 4 + 1;//1:上,2:左,3:下,4:右 data[*py][*px] = trend; switch (trend) { ca 1:data[*py + 1][*px] = 1;  data[*py + 2][*px] = 1; break; ca 2:data[*py][*px + 1] = 2;  data[*py][*px + 2] = 2; break; ca 3:data[*py - 1][*px] = 3;  data[*py - 2][*px] = 3; break; ca 4:data[*py][*px - 1] = 4;  data[*py][*px - 2] = 4; break; } return trend;}void printtest(int data[row][col]){ printf("\n"); for (int i = 0; i < row; i++) {  for (int j = 0; j < col; j++) {   pr拼搏精神intf("%d ", data[i][j]);  }  printf("\n"); }}int gameover(int score){ system("cls"); printf("==============================================\n"); printf("游戏结束,您的小蛇最终长到了%d米长...\n", score); printf("输入1重新开始,输入其它退出游戏...\n"); int ret = 0; scanf("%d", &ret); if (ret == 1) {  return 1; } el {  return 0; }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。

本文发布于:2023-04-04 10:04:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/e6cb8b3631ca14664234ca9c0dd0f9ed.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:C语言实现贪吃蛇小黑窗.doc

本文 PDF 下载地址:C语言实现贪吃蛇小黑窗.pdf

标签:小蛇   蛇头   函数   方向
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图