最近因工作需要,打算自己写一个项目管理系统轻量化版,开始学习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
|