鱼C论坛

 找回密码
 立即注册
查看: 6436|回复: 22

[技术交流] 学了大半个月c,写了个贪吃蛇,来炫炫

[复制链接]
发表于 2016-1-23 12:40:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ligen超越 于 2016-1-23 17:54 编辑

希望大神改进下啦,从键盘获取字符,到操控蛇运动,这个困扰了我很久,准备多线程的,但是还没学,所以用了很笨的方法;
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #include <stdlib.h>
  5. #include <conio.h>
  6. #include <windows.h>

  7. #define kd 20//坐标长度


  8. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  9. void chushi();//初始化画数据
  10. void print_ditu();//打印地图
  11. void move(int n);//移动 (移动方向)
  12. char jieshou();//接受字符输入,直到接受到字符才返回;
  13. void scgz();//生产随机果子
  14. int qdqfx();//取当前方向
  15. int jiance(int n);//检测当前移动是否正确   返回0,这个非法移动,返回1,移动是正确的 ,返回-1游戏失败

  16. char ditu[kd][kd];//地图信息
  17. int snake_x[kd*kd];//蛇x坐标数组
  18. int snake_y[kd*kd];//蛇y坐标数组
  19. int len;//蛇的长度
  20. int food[2];//果子坐标

  21. int fx[8]={-1,0,1,0,0,-1,0,1};//方向坐标
  22. int fxn;//当前方向
  23. int sd;//控制速度哦,积分越多,速度越快

  24. void chushi(){//初始地图蛇,果子,方向数据
  25.         //蛇的位置初始化
  26.         snake_x[0]=10;
  27.         snake_y[0]=10;
  28.         snake_x[1]=9;
  29.         snake_y[1]=10;
  30.         snake_x[2]=8;
  31.         snake_y[2]=10;
  32.         len=3;//蛇的开始长度
  33.         scgz();//生产随机果子        
  34.         fxn=2;//初始方向是向右边

  35.         system("cls");//清屏专用
  36.         printf("请选择难度,1简单,2普通,3难,4很难\n");
  37.         char nd=jieshou();
  38.         if(nd=='1'){
  39.                 sd=800;
  40.         }else if(nd=='2'){
  41.                 sd=600;
  42.         }else if(nd=='3'){
  43.                 sd=400;
  44.         }else if(nd=='4'){
  45.                 sd=200;
  46.         }else{
  47.                 sd=500;//没有正确选择的初始一个中度的难度
  48.         }
  49. }

  50. int main(int argc, char** argv) {

  51.         chushi();//初始化一些数据
  52.          
  53.                  
  54.         while(1){
  55.                
  56.                 system("cls");//清屏专用
  57.                 print_ditu();//打印地图
  58.                 printf("请用A D W S 调控!“+”加号键盘为暂停和继续\n");
  59.                 printf("你当前的积分为:%d\n",(len-3)*10);
  60.                
  61.                 Sleep(sd);
  62.                 //printf("果子坐标为:%d,%d\n",food[0],food[1]);
  63.                 int yx;//取当前状态
  64.                 yx=        qdqfx();
  65.                 if(yx==4){//游戏暂停哦
  66.                         printf("请安“+”加号键继续!!");
  67.                         while(jieshou()!='+'){//游戏继续啦
  68.                         }
  69.                 }else{
  70.                         int zt;//取当前控制符的状态 赋值给临时变量
  71.                         zt=jiance(yx);
  72.                        
  73.                         if(zt==-1){//移动失败
  74.                                 system("cls");//清屏专用
  75.                                 printf("游戏失败啦!你当前的积分为:%d\n",(len-3)*10);
  76.                                 printf("继续游戏请按“1”,其他键退出");
  77.                                 char yy;
  78.                                 yy=jieshou();
  79.                        
  80.                                 if(yy=='1'){       
  81.                                         chushi();//初始化数据,再重头开始
  82.                                         continue;
  83.                                 } else{
  84.                                         break;
  85.                                 }
  86.                        
  87.                         }else if(zt==1 || zt==0){//移动正常
  88.                                 move(fxn);
  89.                         }else if(zt==2){//吃到了果子
  90.                        
  91.                                 len=len+1;
  92.                                 for(int i=0;i<len-1;i++){
  93.                                         snake_x[len-i-1]=snake_x[len-i-2];
  94.                                         snake_y[len-i-1]=snake_y[len-i-2];       
  95.                                 }
  96.                                 snake_x[0]=food[0];
  97.                                 snake_y[0]=food[1];
  98.                                 scgz();
  99.                                 //这边的难度可以自己设计,具体的我没有深究过
  100.                                 sd=sd*19/20;
  101.                         }                       
  102.                 }       
  103.                
  104.                
  105.                
  106.                
  107.         }
  108.         return 0;               
  109. }       

  110. void print_ditu(){//打印地图哦!
  111.        
  112.         // 初始化地图
  113.         for(int y=0;y<kd;y++){
  114.                 for(int x=0;x<kd;x++){
  115.                         ditu[x][y]='.';
  116.                 }
  117.         }

  118.         ditu[snake_x[0]][snake_y[0]]='; //初始蛇的坐标
  119.         for(int i=1;i<len;i++){     
  120.                 ditu[snake_x[i]][snake_y[i]]='0';
  121.         }
  122.        
  123.         ditu[food[0]][food[1]]='F';//初始化果子坐标

  124.         //打印地图
  125.         for(int y=0;y<kd;y++){
  126.                 for(int x=0;x<kd;x++){
  127.                         printf("%c ",ditu[x][y]);                       
  128.                 }
  129.                 printf("\n");
  130.         }               
  131. }

  132. int qdqfx(){//取当前方向坐标
  133.         char f='\0';
  134.         int n=kbhit();
  135.     if(n){
  136.             f=getch();
  137.                 while(kbhit()){
  138.                         getch();
  139.                 }
  140.         }
  141.         n=-1;
  142.         if(f=='a'){
  143.                 n=0;
  144.         }else if(f=='w'){
  145.                 n=1;
  146.         }else if(f=='d'){
  147.                 n=2;
  148.         }else if(f=='s'){
  149.                 n=3;
  150.         }else if(f=='\0'){
  151.                 n=fxn;//还是原来的fxn方向
  152.         }else if(f=='+'){
  153.                 n=4;//这个是暂停继续
  154.         }else{
  155.                 n=fxn;
  156.         }
  157.         return n;
  158. }

  159. void move(int n){
  160.         //针对蛇的坐标移动
  161.         if(n>=0){
  162.                
  163.                 for(int i=0;i<len-1;i++){
  164.                         snake_x[len-i-1]=snake_x[len-i-2];
  165.                         snake_y[len-i-1]=snake_y[len-i-2];
  166.                        
  167.                 }       
  168.                
  169.                 snake_x[0]=fx[n]+snake_x[1];
  170.                 snake_y[0]=fx[n+4]+snake_y[1];
  171.                        
  172.                
  173.         }
  174. }

  175. char jieshou(){//接受字符输入,直到接受到字符才返回; //BUG多多,这一块不知道怎么解决
  176.         while( !kbhit() ){
  177.                 Sleep(2);       
  178.         }
  179.         char ls=getch();
  180.        
  181.         while(kbhit()){
  182.                         getch();
  183.                 }
  184.         return ls;
  185.        
  186. }

  187. void scgz(){//生产随机果子
  188.        
  189.         int x,y;//零时的值
  190.         int z;//是否成功生产
  191.         int send=(int)time(NULL);
  192.         srand(send);//置随机种子
  193.         while(1){
  194.                 x=rand()%(kd-1);
  195.                 y=rand()%(kd-1);

  196.                 for(int i=0;i<len;i++){
  197.                         if(snake_x[i]==x && snake_y[i]==y ) {
  198.                                 z=0;
  199.                                 break;
  200.                         }else if( x==food[0] && y==food[1]){
  201.                                 z=0;
  202.                                 break;
  203.                         }else{
  204.                                 z=1;
  205.                         }
  206.                 }       
  207.                 if(z==1){
  208.                         food[0]=x;
  209.                         food[1]=y;
  210.                 //        printf("dsfsdf果子坐标为:%d,%d\n",food[0],food[1]);
  211.                         break;
  212.                 }               
  213.         }       
  214. }

  215. int jiance(int n){//返回0,这个非法移动,返回1,移动是正确的 ,返回-1游戏失败  返回2吃到了果子
  216.         //printf("n的值为:%d\n",n);
  217.        
  218.         int t=1;//看状态
  219.         int s; //临时值
  220.        
  221.         s=n-fxn;

  222.         if(s<0){//取绝对值
  223.                 s=-s;
  224.         }
  225.         //printf("s的值为:%d, n的值为:%d,fxn的值为:%d\n",s,n,fxn);
  226.         if(s==2){
  227.                 t=0;
  228.         }else{
  229.                 //printf("n的值为:%d\n",n);
  230.                 int x=snake_x[0];
  231.                 int y=snake_y[0];       
  232.        
  233.                 x=x+fx[n];
  234.                 y=y+fx[n+4];

  235.                 for(int i=0;i<len;i++){//判断是否在蛇身上
  236.                         if(x==snake_x[i] && y==snake_y[i]){
  237.                                 t=-1;
  238.                                 break;
  239.                         }
  240.                 }
  241.                 //printf("x的值为:%d,y的值为:y%d\n",x,y);
  242.                 if(!(x>=0 && x<kd && y>=0 && y<kd)){//判断是否在边界
  243.                         t=-1;
  244.                 }       
  245.                 if(x==food[0] && y==food[1]){//判断是否在果子上面
  246.                          t=2;
  247.                 }               
  248.         }
  249.        
  250.         if(t==1 || t==2){
  251.                 fxn=n;
  252.         }       
  253.        
  254.         return t;       
  255. }
复制代码
jdfw.gif

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zlh + 1 + 1 目测楼主很厉害啊

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-23 13:15:05 | 显示全部楼层
楼主的代码在VS中编译不通过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 13:54:20 | 显示全部楼层
黑龍 发表于 2016-1-23 13:15
楼主的代码在VS中编译不通过

这个我在Dev-c++里面调试的了,VC还不会了!!不知道格式是怎么样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 14:12:54 | 显示全部楼层
ligen超越 发表于 2016-1-23 13:54
这个我在Dev-c++里面调试的了,VC还不会了!!不知道格式是怎么样的

我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 14:25:23 | 显示全部楼层
黑龍 发表于 2016-1-23 14:12
我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧

只要知道他移动的方向就可以知道下一个点的位置啊,每次只能移动一格
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 14:28:16 | 显示全部楼层
ligen超越 发表于 2016-1-23 14:25
只要知道他移动的方向就可以知道下一个点的位置啊,每次只能移动一格

那他是怎么移动的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 14:28:16 | 显示全部楼层
ligen超越 发表于 2016-1-23 14:25
只要知道他移动的方向就可以知道下一个点的位置啊,每次只能移动一格

那他是怎么移动的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 14:42:11 | 显示全部楼层
黑龍 发表于 2016-1-23 14:28
那他是怎么移动的呢

蛇头的坐标是5,5,如果它向右移动,坐标就是6,5,所以只要知道了方向,就能知道他下一个移动的坐标,蛇身移动,尾部坐标都是他原来上一个点的坐标,我刚才看了下别人写的代码,用什么结链表,我现在还没学到那个地方,我觉得我这个处理也蛮简单的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 14:54:23 | 显示全部楼层
我学了那么长时间C,到现在还不会写贪吃蛇,楼主你厉害啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 15:13:45 | 显示全部楼层
ligen超越 发表于 2016-1-23 14:42
蛇头的坐标是5,5,如果它向右移动,坐标就是6,5,所以只要知道了方向,就能知道他下一个移动的坐标,蛇 ...

可你是怎么让蛇移动的呢 不是说坐标 就让蛇移动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 15:29:27 | 显示全部楼层
zlh 发表于 2016-1-23 14:54
我学了那么长时间C,到现在还不会写贪吃蛇,楼主你厉害啊

谢谢夸赞!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 15:31:09 | 显示全部楼层
黑龍 发表于 2016-1-23 15:13
可你是怎么让蛇移动的呢 不是说坐标 就让蛇移动

数据更新(包括蛇的坐标),再重新打印一次,就实现了一次移动啊,就是闪烁!不知道怎么解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 16:17:53 | 显示全部楼层
ligen超越 发表于 2016-1-23 15:31
数据更新(包括蛇的坐标),再重新打印一次,就实现了一次移动啊,就是闪烁!不知道怎么解决了

....我翻遍了你的代码都没看到闪烁
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 17:16:52 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-23 19:26:24 | 显示全部楼层
黑龍 发表于 2016-1-23 14:12
我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧

我也搞不懂怎么让蛇移动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 19:57:31 | 显示全部楼层
zlh 发表于 2016-1-23 19:26
我也搞不懂怎么让蛇移动

我没有在他的代码里看到任何让蛇移动的代码
除了坐标
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 19:57:52 | 显示全部楼层
zlh 发表于 2016-1-23 19:26
我也搞不懂怎么让蛇移动

不过我发现我不太适合写游戏 。。你总这么写游戏 不写写别的软件啥的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 20:26:30 | 显示全部楼层
黑龍 发表于 2016-1-23 19:57
不过我发现我不太适合写游戏 。。你总这么写游戏 不写写别的软件啥的?

我也写过其他的呀,什么学生成绩管理系统之类的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 22:43:46 | 显示全部楼层
写的不错,支持一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-25 14:09:43 | 显示全部楼层
很厉害啊,你是怎么做到这么高效率的,我感觉我学了一段时间C语言都不知道如何写游戏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 19:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表