吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5604|回复: 44
收起左侧

[C&C++ 原创] C语言小程序——贪吃蛇小游戏

  [复制链接]
cary_云飞扬 发表于 2022-6-13 18:52
       最近因工作需要,打算自己写一个项目管理系统轻量化版,开始学习C++界面编程。当然首先从C开始学习,目前已学完基础阶段,根据黑马32期案例讲解,自己也实现了简易版贪吃蛇小游戏,在老师讲解的版本基础上增加了如下功能:
       1、增加注册玩家功能;
       2、增加了蛇头与蛇身处于同一方向时,蛇不能直接回头的判断;
       3、增加上侧围墙和左侧围墙的打印;
       4、增加了游戏结束后显示当前玩家、玩家总分数、蛇和食物的坐标及蛇的速度;
       5、增加了将玩家信息和成绩写入文件功能;
      不足之处:
       1、可能存在未知BUG,经过少量测试暂未发现;
       2、未添加将所有游戏数据写入文件的功能;
       3、未添加游戏初始化时读取文件中游戏数据和排行榜功能。
[img][/img]
[img][/img]
[img][/img]
[img][/img]
源代码:
1、snake.h
[C] 纯文本查看 复制代码
#ifndef __SNAKE_H__
#define __SNAKE_H__
#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <conio.h>
#include <Windows.h>
#define WIDE 60
#define HIGE 20
int score = 0;//分数
int sleepNum = 500;
int kx = 0;//用户输入方向横坐标
int ky = 0;//用户输入方向纵坐标
int lastX = 0;//蛇尾横坐标
int lastY = 0;//蛇尾纵坐标
char flag[] = { 0 };//游戏是否继续标记,Y或y继续游戏,其他字符结束游戏
char pname[20] = "player01";
//定义食物结构体
struct FOOD
{
	int X;
	int Y;
}food;
//定义蛇身结构体
struct BODY
{
	int X;
	int Y;
};

//定义蛇结构体
struct SNAKE
{
	struct BODY body[WIDE * HIGE];
	int size;//蛇长度

}snake;
//定义玩家结构体
struct PLAYER
{
	char name[10];
	int  score;

}player;

//声明函数
void init_snake();//初始化蛇
void init_food();//初始化食物函数
void print_area();//画墙函数
void set_console(int x, int y);//设置光标函数
void init_UI();//初始化界面
void playGame();//控制蛇函数(玩游戏)
void regist();//注册玩家函数
void version();//版本信息函数
void rePlay(char c[]);//重玩函数
void count();//统计分数


#endif


2、贪吃蛇
[C] 纯文本查看 复制代码
#include "snake.h"

//初始化蛇
void init_snake()
{
	snake.size = 2;
	snake.body[0].X = WIDE / 2;//蛇头横坐标
	snake.body[0].Y = HIGE / 2;//蛇头纵坐标

	snake.body[1].X = WIDE / 2 - 1;//蛇身横坐标
	snake.body[1].Y = HIGE / 2;//蛇身纵坐标
}
//初始化食物函数
void init_food()
{
	food.X = rand() % WIDE;//0-59之间
	food.Y = rand() % HIGE + 5;//0-19之间
	if (food.X == 0 )
	{
		food.X++;		
	}
	else if (food.X == 59)
	{
		food.X--;
	}
	else if (food.Y == 24)
	{
		food.Y--;
	}
	else if (food.Y == 5)
	{
		food.Y += 2;
	}
	
}
//画墙函数
void print_area()
{
	set_console(0,5);
	for (size_t i = 0; i < HIGE; i++)
	{
		for (size_t j = 0; j < WIDE; j++)
		{
			if (i == 0 || i == HIGE - 1 )
			{
				printf("=");
			}
			else if (j == 0 || j == WIDE - 1)
			{
				printf("$");
			}
			else
			{
				printf(" ");
			}
		}
		printf("\n");
	}
	init_snake();//初始化蛇
	init_food();//初始化食物
}
//设置光标函数
void set_console(int x,int y)
{
	//光标位置
	COORD coord = { 0 };
	coord.X = x;
	coord.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//初始化界面
void init_UI()
{
	//画蛇
	for (size_t i = 0; i < snake.size; i++)
	{
		set_console(snake.body[i].X,snake.body[i].Y);
		if (i == 0)
		{
			putchar('@');
		}
		else
		{
			putchar('*');
		}
	}
	//去除蛇尾
	set_console(lastX,lastY);
	putchar(' ');
	//画食物
	set_console(food.X,food.Y);
	putchar('#');
	set_console(0, HIGE + 5);
}
//控制蛇函数(玩游戏)
void playGame()
{
	char key = 'd';

	while (snake.body[0].X > 0 && snake.body[0].X < WIDE - 1
		&& snake.body[0].Y > 5 && snake.body[0].Y < HIGE + 4)
	{
		init_UI();
		//获取蛇的移动方向
		char key_flag = key;
		// 接收用户按键输入  asdw 
		if (_kbhit()) {				// 为真时,说明用户按下按键。
			key = _getch();
		}
		//根据蛇的移动方向,判断用户按键值,保证蛇不能按蛇身反向移动
		switch (key_flag)
		{
		case 'a': if (key == 'd')
		{
			key = key_flag;
		}
				break;
		case 'd': if (key == 'a')
		{
			key = key_flag;
		}
				break;
		case 'w': if (key == 's')
		{
			key = key_flag;
		}
				break;
		case 's': if (key == 'w')
		{
			key = key_flag;
		}
				break;
		default:
			break;
		}
		//根据用户按键进行改变蛇的移动方向
		switch (key)
		{
		case 'w': kx = 0; ky = -1; break;
		case 's': kx = 0; ky = +1; break;
		case 'd': kx = +1; ky = 0; break;
		case 'a': kx = -1; ky = 0; break;
		default:
			break;
		}

		//蛇头撞蛇身
		for (size_t i = 1; i < snake.size; i++)
		{
			if (snake.body[0].X == snake.body[i].X && snake.body[0].Y == snake.body[i].Y)
			{
				return;//游戏结束
			}
		}
		//蛇头撞食物
		if (snake.body[0].X == food.X && snake.body[0].Y == food.Y)
		{
			init_food();//食物消失
			snake.size++;//蛇身增长
			score += 10;//分数增加
			set_console(0, 4);
			printf("当前玩家:%s  游戏得分:%d", pname, score);//显示分数
			//加速
			if (sleepNum > 100 )
			{
				sleepNum -= 100;
			}
			
		}
		lastX = snake.body[snake.size - 1].X;
		lastY = snake.body[snake.size - 1].Y;
		//蛇移动
		for (size_t i = snake.size - 1; i > 0; i--)
		{
			snake.body[i].X = snake.body[i - 1].X;
			snake.body[i].Y = snake.body[i - 1].Y;
		}

		//根据用户按键,修改蛇头坐标
		snake.body[0].X += kx;
		snake.body[0].Y += ky;
		Sleep(sleepNum);
	}
	count();//统计分数
	printf("游戏结束,是否继续(Y/N)?");
	scanf("%s", flag);//接收用户输入
	rePlay(flag);//如果用户输入字符'Y'游戏继续,否则游戏结束
}
//注册玩家函数
void regist()
{
	set_console(WIDE / 2 - 10 , HIGE / 2 - 3);
	printf("请输入玩家名称:");
	scanf("%s", pname);
	for (size_t i = 1; i < WIDE - 1; i++)
	{
		set_console(i, HIGE / 2 - 3);
		putchar(' ');
	}
	set_console(0, 4);
	printf("当前玩家:%s  游戏得分:%d",pname,score);
}
//游戏版本号函数
void version()
{
	set_console(20, 1);
	printf("贪吃蛇小游戏\n");
	set_console(10, 2);
	printf("作者:云飞扬  版本V1.0  2022.6.10");
}
//重玩函数
void rePlay(char c[])
{
	if (flag[0] == 'Y')
	{
		system("cls");
		srand(time(NULL));//播种随机数种子
		score = 0;//清空分数池
		sleepNum = 500;//重新设置速度
		version();//加载游戏版本
		print_area();//画墙
		regist();//注册玩家
		init_UI();//初始化界面
		playGame();//开始玩游戏
		
	}
	else
	{
		printf("游戏结束,欢迎下次在玩!!!\n");
		return;
	}

}
//统计分数函数
void count()
{
	FILE* fp = NULL;
	fp = fopen("信息.ini", "w");
	if (fp == NULL)
	{
		perror("打开文件错误");
		return -1;
	}
	fprintf(fp, "玩家名称:%s,成绩:%d", pname, score);
	fclose(fp);
	printf("贪吃蛇坐标:X=%d,Y=%d\n", snake.body[0].X, snake.body[0].Y);
	printf("食物的坐标:X=%d,Y=%d\n", food.X, food.Y);
	printf("贪吃蛇速度:%d\n", sleepNum);
	printf("当前玩家:%s\n",pname);
	printf("玩家总分数:%d\n", score);
}
int main()
{
	flag[0] = 'Y';
	rePlay(flag);
	system("pause");	
	return 0;

}
.c





贪吃蛇.rar

13.72 KB, 下载次数: 136, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 9吾爱币 +7 热心值 +8 收起 理由
mrtwzchi + 1 + 1 谢谢@Thanks!
MWF009 + 1 + 1 我很赞同!
InasneMoon + 1 谢谢@Thanks!
bjqyzz + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zhaoqingdz + 1 + 1 谢谢@Thanks!
Mr.Xuan + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
AaDai + 1 用心讨论,共获提升!
LGY龙渊 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
落红护花 + 1 + 1 好东西,适合初学者学习

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| cary_云飞扬 发表于 2022-10-28 09:28
bjqyzz 发表于 2022-10-27 19:22
请问有没有C语言的书,入门级的?之前一直觉得C语言没啥用,vb能看见C语言看起来很低端,现在看到C语言很神 ...

https://www.52pojie.cn/forum.php ... 5%B3%F6%B0%E6%C9%E7
这里面翻翻,肯定有你想要的
bjqyzz 发表于 2022-10-27 19:22
请问有没有C语言的书,入门级的?之前一直觉得C语言没啥用,vb能看见C语言看起来很低端,现在看到C语言很神秘据说好多底层语言就是C语言,请问C语言的用途,能看到可视化输出的那种。
lcylidong 发表于 2022-6-13 19:19
fuermoxi 发表于 2022-6-13 19:42
感谢楼主分享
hrmis2003 发表于 2022-6-13 20:45
学习一下,非常感谢了。
tudouzmd 发表于 2022-6-13 21:04
本帖最后由 tudouzmd 于 2022-6-13 21:07 编辑

看到这帖子真是高兴!学习 学习
落红护花 发表于 2022-6-13 22:18
感谢感谢
nicle 发表于 2022-6-13 22:28
游戏结束,欢迎下次在玩


有错别字!
Vinis 发表于 2022-6-13 22:47
额下载了,
Sakura或安 发表于 2022-6-14 00:02
感谢楼主
baofar 发表于 2022-6-14 00:10
感谢感谢,正有需要
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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