C语言 VC6.0控制台编写一个贪吃蛇游戏

2023-05-16

最近看到有人发布贪吃蛇的编码实现,想到了自己多年之前也实现过一个,发布在这里,做一下回忆。

C语言面向过程编码,基本功能实现以函数为单位,重点就是各个函数的设计和实现。

本篇使用VC6.0来实现,因为我大二大概就是2012年的时候,上手就使用了这个工具。直接上代码吧:

自定义的函数实现:

//文件名:map.cpp
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include "map.h"
#include <time.h>

int a[H][W];	//游戏区域
int s[H*W][2];	//蛇的动态长度
int sLength;	//蛇的初始长度
int direction;   //蛇的方向
int score=0;	  //分数记录
bool eated = false;


void init()    //界面初始化
{	
	srand((unsigned)time(NULL));
	//设置光标隐藏
	CONSOLE_CURSOR_INFO cursor_info = {1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);	
	int i,j;
	for(i=0;i<H;i++)
	{
		a[i][0]=1;
		a[i][W-1]=1;
	}
	for(j=0;j<W;j++)
	{
		a[0][j]=1;
		a[H-1][j]=1;
	}
	sLength=4;
	s[0][0]=H/2;
	s[0][1]=W/2;
	for(i=1;i<4;i++)
	{
		s[i][0]=s[0][0]+i;
		s[i][1]=s[0][1];
	}
	direction=UP;
}

void gotoxy(int i,int j)	//移动光标到指定点
{
	COORD position={j,i};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
}

void drawmap()	//画地图
{
	int i,j;
	for(i=0;i<H;i++)
	{
		for(j=0;j<W;j++)
		{
			if(a[i][j]==0)
				printf(" ");
			else
				printf("*");
		}
		printf("\n");
	}
}

void drawSnake()	//画蛇
{
	int i;
	for(i=0;i<sLength;i++)
	{
		gotoxy(s[i][0],s[i][1]);
		printf("@");
	}
}

void move()
{
	int i;
	gotoxy(s[sLength-1][0],s[sLength-1][1]);
	printf(" ");
	if(eated)
	{
		sLength++;
		eated=false;
	}
	for(i=sLength-1;i>0;i--)
	{
		s[i][0]=s[i-1][0];
		s[i][1]=s[i-1][1];
	}
	switch(direction)
	{
	case UP:
		s[0][0]--;
		break;
	case DOWN:
		s[0][0]++;
		break;
	case LEFT:
		s[0][1]--;
		break;
	case RIGHT:
		s[0][1]++;
		break;
	}
}

void key()
{
	if(_kbhit()!=0)
	{
		char in;
		while(!_kbhit()==0)
			in = _getch();
		switch(in)
		{
		case 'W':
		case 'w':
			if(direction!=DOWN)
				direction=UP;
			break;
		case 'S':
		case 's':
			if(direction!=UP)
				direction=DOWN;
			break;
		case 'A':
		case 'a':
			if(direction!=RIGHT)
				direction=LEFT;
			break;
		case 'D':
		case 'd':
			if(direction!=LEFT)
				direction=RIGHT;
			break;
		case 'P':
		case 'p':
			gotoxy(H,0);
			system("pause");
			gotoxy(H,0);
			printf(" ");
				break;
		}
	}
}

int check(int ii,int jj)	//判断这个点是否可以投放食物
{
	if(a[ii][jj]==1)
		return 0;
	int i;
	for(i=0;i<sLength;i++)
	{
		if(ii==s[i][0]&&jj==s[i][1])
			return 0;
	}
	if(ii==0||ii==H-1||jj==0||jj==W-1)
		return 0;
	return 1;
}

void food()			//投放食物函数
{
	int i,j;
	do
	{
		i=rand()%H;
		j=rand()&W;
	}while(check(i,j)==0);
	a[i][j]=-1;
	gotoxy(i,j);
	printf("$");
}

bool gameOver()
{
	bool isGameOver = false;
	int sX = s[0][0],sY=s[0][1];  // 蛇头的X坐标和Y坐标
	if(sX==0||sX==H-1||sY==0||sY==W-1)
		isGameOver = true;
	for(int i=1;i<sLength;i++)
	{
		if(s[i][0]==sX&&s[i][1]==sY)
			isGameOver = true;
	}
	return isGameOver;
}

void printfScore()
{
	gotoxy(0,W+2);
	printf("  EatSnake game!");
	gotoxy(1,W+2);
	printf("  JYH制作");
	gotoxy(7,W+2);
	printf("  得分:%d",score);
	gotoxy(3,W+2);
	printf("操作:W:上 S:下");
	gotoxy(4,W+2);
	printf("      A:左 D:右");
	gotoxy(5,W+2);
	printf("      P:暂停");
}

头文件实现:

//文件名 map.h
#ifndef _MAP_H_
#define _MAP_H_

#define H 23
#define W 55
#define WAIT_TIME 500
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3

extern int a[H][W];	//游戏区域
extern int s[H*W][2];	//蛇的动态长度
extern int sLength;	//蛇的初始长度
extern int direction;   //蛇的方向
extern int score;
extern bool eated;

void init();
void drawmap();
void drawSnake();
void key();
void move();
int check(int ii,int jj);
void food();
bool gameOver();
void printfScore();

#endif

主函数实现:

//文件名:main.cpp
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#include "map.h"

int main()
{
	init();
	drawmap();
	food();
	while(1)
	{
		drawSnake();
		printfScore();
		Sleep(WAIT_TIME);
		key();
		move();
		if(gameOver())
		{
			system("cls");
			printf("Game Over! \n");
			system("pause");
		}
		if(a[s[0][0]][s[0][1]]==-1)
		{
			eated = true;
			score+=10;
			food();
			a[s[0][0]][s[0][1]]=0;
		}
	}
	getchar();

	return 0;
}

运行效果:

不足之处,是只能运行一次,game over之后,需要重新ctrl+F5 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言 VC6.0控制台编写一个贪吃蛇游戏 的相关文章

随机推荐

  • 【性能】【内存】zram解读

    1 背景 nbsp 通过压缩长时间不在前台的进程来节省内存占用 不会像swap一样频繁操作闪存 也可以减少IO操作节省资源 延长闪存寿命 不过内存压缩是一种用时间换空间 的方式 cpu解压缩过程也是需要消耗少量cpu资源 尽管当前andro
  • wifi连接过程抓包

    下面是一次wifi连接过程发送数据的抓包 xff0c 有些包没抓到 xff0c 但还是比较全的 1 4包 xff0c 探测请求 响应过程 STA发出探测请求包Probe ReqAP做出回应 xff0c 发出探测响应包Probe Rsp 5
  • mbedtls学习(6)RSA算法

    RSA算法 RSA算法是一种非对称加密算法 xff0c 特点时加密解密算法不同且加密解密密钥不同 xff0c 即一般公钥加密 xff0c 私钥解密 下面时RSA算法关键参数 n 模数 xff0c 位长度为1024比特或者2048比特e 公开
  • LVGL lv_label标签控件(5)

    lv label 相关API在lv label h中 文本模式 span class token keyword enum span span class token punctuation span span class token co
  • LVGL lv_page页面控件(23)

    lv page 页面控件 xff0c 是由2个lv cont容器控件构成 xff0c 其中一个容器作为lv page页面控件的背景层 xff0c 另一个容器作为lv page页面控件的载体 xff0c 此载体存放其他任何子对象 xff0c
  • FreeRTOS消息队列、信号量、互斥量、递归互斥量实现步骤

    文章目录 消息队列消息队列结构读队列步骤写队列步骤 作用 信号量信号量结构 获取信号量释放信号量 互斥量 xff08 锁 xff09 互斥量结构 获取互斥量释放互斥量 递归互斥量 xff08 递归锁 xff09 获取递归互斥量释放递归互斥量
  • GDB调试宏

    参考 GDB需要调试宏只需用 g3选项编译 g 默认选项 xff0c 同 g2 g0 不生成任何调试信息 xff0c 和编译时不加 g 是一样的 g1 生成最少量的调试信息 xff0c 这些信息足够用来通过backtrace查看调用栈符号信
  • GDB格式化打印结构体

    参考 GDB pretty print set print pretty on GDB 打印数组索引 set print array span class token operator span indexes on 例子 span cla
  • 8080接口

    文章目录 简介引脚写时序读时序 简介 8080接口是由英特尔设计 xff0c 是一种并行 异步 半双工通信协议 xff0c 作用是用于外扩RAM ROM xff0c 后面也用于LCD接口 引脚 写时序 先拉低选中器件 xff0c 如果要写入
  • Centos 7离线安装最新版mysql

    测试环境 CentOS Linux release 7 9 2009 Core 1 准备工作 下载离线安装包 xff1a 1 1 浏览器打开地址 xff1a https dev mysql com downloads mysql 1 2 选
  • C语言UDP socket编程

    C语言UDP socket编程 UDP 服务器步骤如下 xff1a 1 创建等链接套接字fd 61 socket 2 绑定待链接套接字bind fd 服务器ip和端口 3 等待信息recvfrom fd 对端地址 UDP 客户端步骤如下 x
  • MQTT学习笔记(4)报文分析之PUBLISH

    PUBLISH xff08 发布消息 xff09 含义 xff1a 客户端到服务端或者服务端到客户端发布消息控制报文 xff0c 是双向的 一 固定报头 DUP 重发标志 当DUP被设置为0 xff0c 表示客户端或者服务器是第一次发送这个
  • MQTT学习笔记(6)搭建本地MQTT服务器

    目前主流的Broker有以下3个 xff1a Mosquitto xff1a https mosquitto org VerneMQ xff1a https vernemq com EMQTT xff1a http emqtt io 我们使
  • nrf52832学习笔记(4)修改蓝牙名称,掉电不丢失

    这篇主要介绍如何在手机端修改设备参数 xff0c 比如设备名称 且实现掉电不丢失 思路 xff1a 把需要修改的参数发送给设备 xff0c 设备根据uuid来分辨是参数 xff0c 并保存在flash中 xff0c 重启服务 xff0c 这
  • IIC协议总结

    这篇总结下IIC协议 简介 IIC xff0c Inter Integrated Circuit xff0c 集成电路总线 xff0c 需要2根线连接拓扑 xff0c 是半双工 xff0c 适用于 34 字节型 34 设备 特点 拓扑如下
  • ros+gazebo学习(持续更新)

    由于实习需要 xff0c 开始学习ROS的东西 这篇博客主要是记录在ROS 43 gazebo学习中遇到的各种坑 xff08 掩面 xff09 xff0c 希望能对一些也在该领域的同志提供一点小小帮助 安装问题 xff08 gazebo 4
  • TX2 ubuntu18.04 arm64架构 桌面系统为lxde 系统为轻量级 成功安装ros

    如标题所述 xff1a 硬件采用 xff1a TX2 ubuntu18 04 arm64架构 桌面系统为lxde 来安装ros xff0c 安装了两次都意外失败了 xff0c 后来终于找到了问题 在ros wiki 官网 xff08 htt
  • 解决NVIDIA jetson NX 板卡安装镜像之后,SD卡容量变小的问题

    解决NVIDIA jetson NX 板卡安装镜像之后 xff0c SD卡容量变小的问题 问题描述 xff1a 本人使用的SD卡为64G xff0c 安装了一个约30g的 img镜像 xff0c 之后插入NX板卡 xff0c 系统正常启动
  • USB接线定义和链接摄像头

    原文链接 xff1a https www cnblogs com chinalantian articles 2131361 html 写本文的意义在于了解USB的接线定义和实现使用手机数据线读取摄像头图像 USB接口定义 颜色 一般的排列
  • C语言 VC6.0控制台编写一个贪吃蛇游戏

    最近看到有人发布贪吃蛇的编码实现 xff0c 想到了自己多年之前也实现过一个 xff0c 发布在这里 xff0c 做一下回忆 C语言面向过程编码 xff0c 基本功能实现以函数为单位 xff0c 重点就是各个函数的设计和实现 本篇使用VC6