控制台小游戏——贪吃蛇

网上看到的一个贪吃蛇程序,修复了一些bug(如可以直接转反方向,苹果与蛇重叠,撞到自身不会死亡等),下面是源代码。

--------------------------------------------------------------------------------------------------

  1 #include<iostream>
  2 #include<windows.h>
  3 #include<time.h>
  4 #include<stdlib.h>
  5 #include<conio.h>
  6 #define N 21
  7 using namespace std;
  8 //移动光标
  9 void gotoxy(int x,int y)
 10 {
 11     COORD pos;
 12     pos.X=2*x;
 13     pos.Y=y;
 14     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
 15 }
 16 //调整颜色
 17 void color(int a)
 18 {
 19     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
 20 }
 21 //初始化函数
 22 void init(int apple[2])
 23 {
 24     int i,j;
 25     int wall[N+2][N+2]={{0}};
 26     for(i=1;i<=N;i++)
 27     {
 28         for(j=1;j<=N;j++)
 29         wall[i][j]=1;
 30     }
 31     color(11);
 32     for(i=0;i<N+2;i++)
 33     {
 34         for(j=0;j<N+2;j++)
 35         {
 36             if(wall[i][j])
 37             cout<<"■";
 38             else cout<<"□" ;
 39         }
 40         cout<<endl;
 41     }
 42     gotoxy(N+3,1);
 43     color(20);
 44     cout<<"按 W S A D 移动方向"<<endl;
 45     gotoxy(N+3,2);
 46     color(20);
 47     cout<<"按任意键暂停"<<endl;
 48     gotoxy(N+3,3);
 49     color(20);
 50     cout<<"得分:"<<endl;
 51     apple[0]=rand()%(N-2)+2;
 52     apple[1]=rand()%(N-2)+2;
 53     gotoxy(apple[0],apple[1]);
 54     color(12);
 55     cout<<"●"<<endl;
 56 }
 57 int main()
 58 {
 59     int i,j;
 60     int** snake=NULL;
 61     int apple[2];
 62     int score=0;
 63     int tail[2];
 64     int len=3;
 65     char ch=‘p‘;
 66     srand((unsigned)time(NULL));
 67     init(apple);
 68     snake=(int**)realloc(snake,sizeof(int*)*len);
 69     for(i=0;i<len;i++)
 70     snake[i]=(int*)malloc(sizeof(int)*2);
 71     for(i=0;i<len;i++)
 72     {
 73         snake[i][0]=N/2;
 74         snake[i][1]=N/2+i;
 75         gotoxy(snake[i][0],snake[i][1]);
 76         color(14);
 77         cout<<"★"<<endl;
 78     }
 79     //进入消息循环
 80     while(1)
 81     {
 82         tail[0]=snake[len-1][0];
 83         tail[1]=snake[len-1][1];
 84         gotoxy(tail[0],tail[1]);
 85         color(11);
 86         cout<<"■"<<endl;
 87         for(i=len-1;i>0;i--)
 88         {
 89             snake[i][0]=snake[i-1][0];
 90             snake[i][1]=snake[i-1][1];
 91             gotoxy(snake[i][0],snake[i][1]);
 92             color(14);
 93             cout<<"★"<<endl;
 94         }
 95         char origch=ch;
 96         if(kbhit())
 97         {
 98             gotoxy(0,N+2);
 99             ch=getche();
100         }
101         if((origch==‘w‘&&ch==‘s‘)||(origch==‘s‘&&ch==‘w‘)||(origch==‘a‘&&ch==‘d‘)||(origch==‘d‘&&ch==‘a‘))
102         ch=origch;
103         switch(ch)
104         {
105             case ‘w‘:snake[0][1]--;break;
106             case ‘s‘:snake[0][1]++;break;
107             case ‘a‘:snake[0][0]--;break;
108             case ‘d‘:snake[0][0]++;break;
109             default: break;
110         }
111         int i;
112         //撞到自身失败
113         for(i=1;i<len;i++)
114         {
115             if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1]&&len>3)
116             {
117                 gotoxy(N/2,N/2);
118                 color(30);
119                 cout<<"失败!!!"<<endl;
120                 for(i=0;i<len;i++)
121                 free(snake[i]);
122                 Sleep(INFINITE);
123                 exit(0);
124             }
125         }
126         gotoxy(snake[0][0],snake[0][1]);
127         color(14);
128         cout<<"★"<<endl;
129         Sleep(abs(200-0.5*score));
130         //吃掉苹果后蛇分数加1,蛇长加1
131         if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])
132         {
133             score++;
134             len++;
135             snake=(int**)realloc(snake,sizeof(int*)*len);
136             snake[len-1]=(int*)malloc(sizeof(int)*2);
137             int flag=1;
138             do
139             {
140                 flag=1;
141                 apple[0]=rand()%(N-2)+2;
142                 apple[1]=rand()%(N-2)+2;
143                 for(i=0;i<len;i++)
144                 {
145                     if(apple[0]==snake[i][0]&&apple[1]==snake[i][1])
146                     flag=0;
147                 }
148             }
149             while(!flag);
150             gotoxy(apple[0],apple[1]);
151             color(12);
152             cout<<"●"<<endl;
153             gotoxy(N+5,3);
154             color(20);
155             cout<<score<<endl;
156         }
157         //撞到围墙后失败
158         if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)
159         {
160             gotoxy(N/2,N/2);
161             color(30);
162             cout<<"失败!!!"<<endl;
163             for(i=0;i<len;i++)
164             free(snake[i]);
165             Sleep(INFINITE);
166             exit(0);
167         }
168
169     }
170     return 0;
171 }
时间: 2024-08-28 06:48:09

控制台小游戏——贪吃蛇的相关文章

控制台小游戏-贪吃蛇,c++和c#版

说是c++版,其实只是用到了c++的cout和cin而已.这是我做的第二个控制台游戏,基本上每一行代码都加上了注释. 游戏嘛,我觉得重要的是了解他的思想,所以后期学了面向对象之后这个游戏的代码我也没有重新封装. 下面请看图 代码如下:我是用dev c++写的 1 //注释. ---星辰 2 3 #include <iostream> 4 #include<Windows.h> 5 #include<ctime> 6 #include<cstdlib> 7 #

自己第一个控制台的游戏——贪吃蛇

一直想自己写个游戏玩玩,好像很厉害的样子,终于今天下定决心写了个最经典的休闲的小游戏--贪吃蛇,当然也有借鉴别人的程序,但是整个代码都是和别人不一样的,直接上代码吧: #include <conio.h> #include <iostream> #include <vector> #include <time.h> using namespace std; #define ROW 22 #define COL 22 struct Point { char c

Pascal小游戏 贪吃蛇

一段未完成的Pascal贪吃蛇 说这段代码未完成其实是没有源代码格式化,FP中一行最多只有255字符宽. uses crt; const screenwidth=50; screenheight=24; wallchar='#'; snakechar='*'; ; type point=record x,y:integer; end; var snake:array [0..500] of point; map:array [0..screenwidth,0..screenheight] of

java小游戏贪吃蛇大作战:来一起回顾童年回忆!

Java小项目之贪吃蛇 跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早上贵子,从不掉发! 贪吃蛇,绝对是很多朋友的童年记忆.几乎没有人会说没玩过这款小游戏,因为不管在小灵通手机,直板手机,还是半智能手机,甚至是现在的5G手机,都能看见这款游戏的身影.虽然游戏一直在进化,画面,风格,操作方式越来越精细,但是游戏本质的玩法是没变的,例如蛇不断变大,碰到墙壁会死亡等设定.这篇文章来分享java小游戏贪吃蛇:部分代码展示:这个贪吃蛇小游戏,玩法和操控,都是比较完善的,大家感兴趣的可

这是现代软件工程课结对作业 ——小游戏“贪吃蛇”

Github代码链接 https://github.com/liangjianming/jieduizuoye 实验简介: 本次实验为合作实验 实验分工: 本次选择了经典的游戏贪吃蛇,相信大家都玩过,这次实验分工是这样的: 实验的逻辑框架为讨论之后得出: 如果顺利吃掉食物即为成功,并输出成功,如果撞到自己和墙即为失败,输出游戏失败,添加了一些简单的游戏界面,游戏监听器和线程等, 定义食物是随机的,由 random() 决定, 并控制了窗口大小坐标: 十位*60为横坐标 weix=(int)(fo

小游戏●贪吃蛇1(利用二维数组制作)

利用二维数组编写简单贪吃蛇小游戏,由于是初学C#,用的是单线程,所以蛇不会自动前进 代码及简要分析如下: 1 //定义地图,0为空,1为墙,2为蛇,3为食物 2 int[,] map = new int[15, 15]{ 3 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 4 {1,2,0,0,0,0,0,0,0,0,0,0,0,0,1}, 5 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 6 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

手把手教学h5小游戏 - 贪吃蛇

简单的小游戏制作,代码量只有两三百行.游戏可自行扩展延申. 源码已发布至github,喜欢的点个小星星,源码入口:game-snake 游戏已发布,游戏入口:http://snake.game.yanjd.top 第一步 - 制作想法 游戏如何实现是首要想的,这里我的想法如下: 利用canvas进行绘制地图(格子装). 利用canvas绘制蛇,就是占用地图格子.让蛇移动,即:更新蛇坐标,重新绘制. 创建四个方向按钮,控制蛇接下来的方向. 随机在地图上绘制出果子,蛇移动时"吃"到果子,增

JS的小游戏&quot;贪吃蛇&quot;

贪吃蛇儿时的回忆,今天刚好学习到这了,就刚好做了一个,也是学习了吧,需要掌握的知识: 1,JS函数的熟练掌握, 2,JS数组的应用, 3,JS小部分AJAX的学习 4,JS中的splice.shift等一些函数的应用, 基本上就这些吧,下面提重点部分: 前端的页面,这里可自行布局,我这边提供一个我自己的布局: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org

Java小游戏贪吃蛇

package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java.awt.Container;import java.awt.Graphics;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.Arrays;import java.util.Itera