利用C/C++实现较完整贪吃蛇游戏

记得在大一时刚学习c/c++语言,学到一半突然想用这门语言做一些小游戏出来,首先想到的便是贪吃蛇。于是本人利用空余时间写出了这么一个简单的小游戏。

由于当时的我还没有能力构造出用户界面,故直接使用dos界面运行。那么问题来了,如何让一个字符在dos界面上自由移动???对于这个问题我采用的解决方案是实现gotoxy函数来控制指针位置从而实现字符的移动。那么我们就先来实现这个函数。

gotoxy 函数并非系统函数,我将其储存于 gotoxy.h 的头文件中方便调用。

gotoxy.h

#include <windows.h>
void gotoxy(int x,int y)
{
 COORD pos;
 pos.X = x - 1;
 pos.Y = y - 1;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

现在我们已经能够利用 gotoxy 函数对指针进行控制,那么实现字符的移动则只需将原来位置的字符清除,然后利用此函数移动指针到想去的坐标后打印字符即可。

在对此函数进行测试的时候,我发现了一个重要的问题,因为代码是一行一行的运行,那么在等待我输入方向的时候,其他代码是无法执行的,这意味这我的蛇只能是我给一下方向它移动一下,那么该如何使得字符在等待我输出方向的同时自行移动呢???对于这个问题有两个解决方案:一、创建线程(对于当时的我来说线程还很陌生) 二、利用 kbhit() 非阻塞函数(百度一下,你就知道)。当然我选择的是第二个方案,再配合使用 getch() 函数即可完美实现方向的输入。

该游戏的两个难点都解决了,话不多说 ↓

(由于没有涉及什么算法,加之年少,代码显得过于冗长)

这里主要运用到的知识有这些:结构体,srand(), rand(), kbhit(), getch(), Sleep().

/*******************http://blog.csdn.net/lcsy000**********************/ 

#include<iostream>
#include"gotoxy.h"
#include<windows.h>
#include<conio.h>
#include<time.h>
using namespace std;
char direction_a,direction_b;  //方向a、b,用于方向的限制
int scores,num,fool_x,fool_y,speed=100; //得分、num用于蛇身起步、食物x坐标、食物y坐标
bool end;    //结束标记
struct node    //蛇身结点
{
 int x,y;
 node *next;
}*head=NULL,*p,*tail; 

void init();    //初始化开始界面
void start();    //游戏开始入场
void init_snake();   //初始化蛇身
void delete_snake();   //删除蛇身
void control();    //方向控制
void move();    //蛇身移动
void limit();    //方向限制
void panduan();    //配合limit限制方向
void fool();    //食物的出现以及食物被吞
void isEnd();    //结束判断
void zhuangwei();   //撞尾判断
void zhuangqiang();   //撞墙判断 

int main ()
{
 srand((unsigned)time(NULL));
 init();
 cin>>direction_a;
 if(direction_a!='y'&&direction_a!='Y')
 return 0;
 do
 {
 system("cls");   //清除屏幕
 end=false;
 start();
 delete_snake();
 init_snake();
 scores=0;
 num=0;
 fool_x=(rand() % (79-2+1))+ 2;
 fool_y=(rand() % (22-2+1))+ 2;
 gotoxy(fool_x,fool_y);
 cout<<"0";
 direction_a=getch();
 while(direction_a!='d'&&direction_a!='s'&&direction_a!='w') direction_a=getch();
 while(true)
 {
  if(num&&direction_a!='d'&&direction_a!='s'&&direction_a!='w'&&direction_a!='a')
  {
  direction_a=direction_b;
  }
  control();
  fool();
  Sleep(speed);
  if(kbhit())   //kbhit 非阻塞函数
  {
  direction_a=getch(); //使用 getch 函数获取键盘输入
  limit();
  }
  panduan();
  num=1;
  zhuangqiang();
  zhuangwei();
  if(end) break;
 }
 }while(direction_a=='y'||direction_a=='Y');
 return 0;
}
void init()
{
 gotoxy(35,8);
 cout<<"★贪 吃 蛇★";
 gotoxy(36,10);
 cout<<"开始请输入y:";
}
void start()
{
 for(int i=0;i<=79;i++)
 {
  Sleep(10);
  cout<<"*";
  gotoxy(i+1,24);
  cout<<"*";
  gotoxy(i+2,1);
 }
 gotoxy(1,2);
 for(int i=0;i<=21;i++)
 {
  Sleep(20);
  cout<<"*";
  for(int j=0;j<=77;j++) cout<<" ";
  cout<<"*";
 }
}
void init_snake()
{
 int n=3;
 head=new node;
 tail=head;
 head->x=40;
 head->y=12;
 while(n--)
 {
 p=new node;
 tail->next=p;
 p->x=tail->x-1;
 p->y=tail->y;
 tail=p;
 }
 tail->next=NULL;
 node *q=head->next;
 gotoxy(head->x,head->y);
 cout<<'#';
 while(q!=NULL)
 {
 gotoxy(q->x,q->y);
 cout<<'*';
 q=q->next;
 }
}
void delete_snake()
{
 while(head!=NULL)
 {
 node *q=head;
 head=q->next;
 delete q;
 }
}
void move()
{
 gotoxy(tail->x,tail->y);
 cout<<" ";
 gotoxy(head->next->x,head->next->y);
 cout<<'*';
 gotoxy(head->x,head->y);
 cout<<'#';
 node *q=tail;
 tail=head;
 while(tail->next!=q)
 {
 tail=tail->next;
 }
 tail->next=NULL;
 delete q;
}
void control()
{
 node *q=new node;
 q->next=head;
 q->x=head->x;
 q->y=head->y;
 head=q;
 switch(direction_a)
 {
 case 'w': head->y--;break;
 case 's': head->y++;break;
 case 'a': head->x--;break;
 case 'd': head->x++;break;
 default : break;
 }
 move();
}
void limit()
{ 

 if(direction_b=='s'&&direction_a=='w') direction_a='s';
 if(direction_b=='w'&&direction_a=='s') direction_a='w';
 if(direction_b=='a'&&direction_a=='d') direction_a='a';
 if(direction_b=='d'&&direction_a=='a') direction_a='d';
}
void panduan()
{
 if(direction_a=='s') direction_b='s';
 if(direction_a=='w') direction_b='w';
 if(direction_a=='d') direction_b='d';
 if(direction_a=='a') direction_b='a';
}
void fool()
{
 node *q;
 if(head->x==fool_x&&head->y==fool_y)
 {
 fool_x=(rand() % (79-2+1))+ 2;
 fool_y=(rand() % (22-2+1))+ 2;
 gotoxy(fool_x,fool_y);
 cout<<"0";
 num=0;
 scores++;
 node *q=new node;
 q->x=tail->x;
 q->y=tail->y;
 tail->next=q;
 tail=q;
 tail->next=NULL;
 }
 q=head;
 while(q!=NULL)
 {
 if(q->x==fool_x&q->y==fool_y)
 {
  fool_x=(rand() % (79-2+1))+ 2;
  fool_y=(rand() % (22-2+1))+ 2;
  gotoxy(fool_x,fool_y);
  cout<<"*";
  q=head;
  continue;
 }
 q=q->next;
 }
}
void isEnd()
{
 end=true;
 Sleep(600);
 system("cls");
 gotoxy(35,8);
 cout<<"您 输 啦 ~";
 gotoxy(33,10);
 cout<<"您的分数为: "<<scores;
 gotoxy(31,12);
 cout<<"重新开始请输入y:";
 cin>>direction_a;
}
void zhuangwei()
{
 node *q=head->next;
 while(q!=NULL)
 {
 if(head->x==q->x&&head->y==q->y)
 {
  isEnd();
  break;
 }
 q=q->next;
 }
}
void zhuangqiang()
{
 if(head->x==80||head->x==1||head->y==24||head->y==1)
 isEnd();
}

效果图:

由于考虑到游戏的各种 BUG 故自定义函数很多,有兴趣的朋友可以自行改动一些函数对比效果。

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

您可能感兴趣的文章:

  • C/C++实现贪吃蛇逐步运动效果
  • C++基于控制台实现的贪吃蛇小游戏
  • 贪吃蛇游戏C++命令行版实例代码
  • C语言实现贪吃蛇游戏
  • C++实现简单贪吃蛇游戏
(0)

相关推荐

  • C语言实现贪吃蛇游戏

    最近整理下电脑,看到了自己在上个学期打的贪吃蛇游戏的c代码,觉得真的是略微有点冗长,但是实现起来应该也算是比较好理解,于是把自己的代码搬上来,网络上写贪吃蛇的c语言的文章很多,我这篇也仅是给大家作为一个参考而已. 我的代码是在Windows下运行的,因为需要用到windows.h这个库. 然后也做了一个简单的ai模式,这在没有障碍物的情况下前期还是蛮不错的,但是到了后期蛇变长了之后就会有bug了. 好了,直接上代码吧: 1)头文件和宏定义 #include<stdio.h> #include&

  • C++实现简单贪吃蛇游戏

    我大概在一个多月前把自己上学期写的c代码的贪吃蛇游戏push到csdn上,并且说c风格的贪吃蛇写起来有些麻烦(贪吃蛇游戏的c语言实现),准备用面向对象的c++再写一遍.现在我们专业恰好刚教完了c++,学校也布置了一道简单的贪吃蛇的编程题目,实现下来,的确觉得c++的思路清晰很多,所以再次把c++的代码push上来,供大家对比参考:) 直接上代码,c++把整个游戏拆分成几个文件,分开上,有一定的c++基础的同学应该可以很容易看懂. 1.全局头文件(global.hpp) #ifndef _GLOB

  • C++基于控制台实现的贪吃蛇小游戏

    本文实例讲述了C++基于控制台实现的贪吃蛇小游戏.分享给大家供大家参考.具体实现方法如下: #include <windows.h> #include <time.h> #include <stdio.h> #define MAX 100 #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 #define MOVING 5 #define STOP 0 HANDLE hMain_Out = NULL; H

  • C/C++实现贪吃蛇逐步运动效果

    本文实例为大家分享了C/C++实现贪吃蛇逐步运动效果的代码,供大家参考,具体内容如下 主要使用结构数组和结构指针,再用easyx图形库进行的绘图,以供讨论和学习 #include <conio.h> //建立储存蛇身的结构体 struct snack { int x; int y; }; //决定方向 int fangxiang=3;//w=0,s=1,a=2,d=3 // 按键变量 char anjian=0; //调整坐标关系 int tiaozheng(struct snack *a);

  • 贪吃蛇游戏C++命令行版实例代码

    本文实例讲述了贪吃蛇游戏C++命令行版的实现代码,是非常经典的游戏.分享给大家供大家参考.具体实现方法如下: 众所周知,贪吃蛇游戏是经典的计算机游戏. 游戏描述如下: 1. 贪吃蛇可以自动直线前进,或者玩家可以通过方向键操纵贪吃蛇上下左右前进,每次前进一格. 2. 贪吃蛇在规定的区域内活动,当: ①贪吃蛇触碰到墙壁时: ②贪吃蛇的蛇头触碰到蛇身或者蛇尾时: ③玩家的键盘输入不是方向键时: 命令行显示"Game Over!"并且退出游戏. 3. 贪吃蛇活动的区域内每次随机产生一颗&quo

  • 利用C/C++实现较完整贪吃蛇游戏

    记得在大一时刚学习c/c++语言,学到一半突然想用这门语言做一些小游戏出来,首先想到的便是贪吃蛇.于是本人利用空余时间写出了这么一个简单的小游戏. 由于当时的我还没有能力构造出用户界面,故直接使用dos界面运行.那么问题来了,如何让一个字符在dos界面上自由移动???对于这个问题我采用的解决方案是实现gotoxy函数来控制指针位置从而实现字符的移动.那么我们就先来实现这个函数. gotoxy 函数并非系统函数,我将其储存于 gotoxy.h 的头文件中方便调用. gotoxy.h #includ

  • 利用python实现简易版的贪吃蛇游戏(面向python小白)

    引言 作为python 小白,总是觉得自己要做好百分之二百的准备,才能开始写程序.以至于常常整天在那看各种语法教程,学了几个月还是只会print('hello world'). 这样做效率太低,正确的做法,是到身边找问题,然后编程实现.比如说,我学了高等数学,我是不是应该考虑下如何去用编程实现求导或者积分操作,如果想不出怎么办,是不是应该 baidu 一下,别人是如何实现数值积分或是符号积分的.我们每天买东西都要用到加减甚至乘除,那么我是否能编写个简单的计算器,如果命令行太丑的话,我是否能够快速

  • 利用C/C++实现贪吃蛇游戏

    利用C/C++实现贪吃蛇 (注意:本文章仅供参考,第一次写博客还请多多指教.理解本文章需要easyx和c++等基础知识,并且需要了解贪吃蛇游戏机制) 贪吃蛇机制介绍 相信绝大多数人都曾玩过或者了解过贪吃蛇这款经典的游戏.贪吃蛇顾名思义,就是让蛇尽可能的吃食物.玩家可通过方向键或自定义键来控制蛇头的方向,使它吃到地图出现的随机食物.蛇每吃到一个食物,自身便会增长.当蛇碰到地图的边界或是蛇碰到自身,蛇便会死亡,游戏便结束. 机制大概了解过后,我们将考虑如何实现这类游戏. 设计与分析 首先,我们分析游

  • JavaScript TypeScript实现贪吃蛇游戏完整详细流程

    目录 项目背景及简介 多模块需求分析 场景模块需求 食物类模块需求 记分牌模块需求 蛇类模块需求 控制模块需求 项目搭建 ts转译为js代码 package.json包配置文件 webpack.config.js打包工具配置 项目结构搭建 html文件 css文件(这里使用的是less) 项目页面 多模块搭建 完成Food(食物)类 完成ScorePanel(记分牌)类 完成Snake(蛇)类 完成GameControl(控制)类 完成index类(启动项目) 项目启动 总结 项目背景及简介 t

  • 利用TypeScript编写贪吃蛇游戏

    目录 Explanation 1. tsconfig.json配置 2. HTML & CSS 布局相关 3. TS核心逻辑 项目源码链接 先来康康效果图 我接下来将讲解相关配置和代码,源码链接放在最底下了,在GitHub上. Explanation 1. tsconfig.json配置 { "compilerOptions": { "target": "ES2015", "module": "ES2015&

  • 基于C语言实现的贪吃蛇游戏完整实例代码

    本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助. 贪吃蛇完整实现代码如下: #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <dos.h> #define NULL 0 #define UP 18432 #define DOWN 20480 #define LEFT 19200 #defi

  • JS实现的贪吃蛇游戏完整实例

    本文实例讲述了JS实现的贪吃蛇游戏.分享给大家供大家参考,具体如下: 思想: 1.设计蛇:属性有宽.高.方向.状态(有多少节),方法:显示,跑 2.设计食物:属性宽.高 3.显示蛇:根据状态向地图里加元素 4.蛇跑起来:下一节到前一节的位置,蛇头根据方向变,删除原来的蛇,新建蛇:当出界时,死亡,初始化:当蛇头吃到自己的时候,死亡,初始化 5.食物被吃掉,蛇加一节,去掉原来的食物,生成新的食物 6.添加定时器,绑定按键 完整示例: <!doctype html> <html lang=&q

  • python实战之利用pygame实现贪吃蛇游戏(二)

    一.前言 在上一篇博客中,我们实现了基本的界面搭建,这次实现一下逻辑部分. 二.创建蛇 首先,先分析一下蛇的移动,不然我们一定会吃亏的(别问,问就是自己写了一堆无效代码). 蛇的移动其实并没有想象中那样复杂,每一个模块都需要有一个方向,按照方向进行移动. 其实实际上就是一个出队的感觉,即每一个元素都取代上一个元素的位置,然后再按照贪吃蛇当前的方向,移动一下头节点即可. snake.py: """"

  • python实战之利用pygame实现贪吃蛇游戏(一)

    一.前言 之前尝试了自己用pygame写井字棋,这次玩的是贪吃蛇系列. 个人感觉模块可能会比较大,所以选择将函数和主要逻辑代码分在了两个文件中. fuc为函数模块,存储了事件感应和刷新界面等部分. main模块则是游戏的核心. 二.搭建界面 这里我就不重复了,可以先看一下这篇博客 其中界面的基本要素都有. main.py import pygame from fuc import * # 基本属性 lattice_wh = 20 #长宽 snake_color = (84, 255, 159)

  • Python利用手势识别实现贪吃蛇游戏

    目录 一.前言 二.项目介绍 1.游戏的操作方式 2.开发的过程中的注意事项 三.游戏的实现要点 1.选择第三方库 2.找到关键点并标记 3.创建一个类来保存关于游戏的所有功能 4.定义函数进行不断更新 四.总体代码 一.前言 想必大家都玩过贪吃蛇的游戏吧:通过操纵蛇的移动方向能够让蛇吃到随机出现的食物,吃到的食物越多,蛇就会变得越长,但如果不小心撞到了自己,那么蛇就会死亡,game over!! 我们玩过的贪吃蛇游戏一般都是在手机或者游戏机上进行的,通过方向键操纵蛇的移动,那么我们是否可以直接

随机推荐