作品名称:贪吃蛇大作战
版本历史和日期:V1.0 - 2024年2月11日
简介:
贪吃蛇大作战是一个基于EasyX图形库的经典贪吃蛇游戏。玩家通过键盘控制贪吃蛇的移动方向,目标是吃掉屏幕上随机生成的食物点,每吃掉一个食物点,蛇身就会增长一节。游戏提供三种模式:无屏障模式、有屏障模式以及读档继续模式。在有屏障模式中,贪吃蛇如果撞到屏幕边缘则游戏结束;在无屏障模式中,贪吃蛇可以穿越屏幕边缘,实现无限循环。此外,无屏障模式还提供了经典和迷宫两种难度选择,以适应不同水平的玩家。游戏过程中,会实时统计并显示玩家的分数,同时屏幕上最多会出现100个食物点。
游戏背景:
贪吃蛇大作战的故事背景设定在一个充满食物的神秘世界里。玩家扮演一条小蛇,需要通过吃掉食物来不断成长,同时避开各种危险和挑战。随着蛇身的不断增长,游戏难度也会逐渐提升,考验玩家的反应速度和策略规划能力。
核心玩法:
- 玩家通过键盘控制贪吃蛇的移动方向(上、下、左、右)。
- 贪吃蛇需要吃掉屏幕上的食物点来增长身体。
- 吃到食物后,蛇身会增加一节,同时生成新的食物点。
- 在有屏障模式中,贪吃蛇如果撞到屏幕边缘则游戏结束。
- 在无屏障模式中,贪吃蛇可以穿越屏幕边缘,实现无限循环。
- 经典难度下,食物点随机生成;迷宫难度下,食物点按照特定规则分布,需要玩家解开迷宫才能吃到食物。
角色:
- 贪吃蛇:游戏主角,通过吃掉食物点来增长身体。
- 食物点:分布在屏幕上的小圆形图案,贪吃蛇需要吃掉它们来增长身体。
关卡设计:
- 无屏障模式:分为经典和迷宫两种难度。经典难度下,食物点随机生成;迷宫难度下,食物点按照特定规则分布。
- 有屏障模式:贪吃蛇不能碰到屏幕边缘,增加了游戏的挑战性。
控制和用户界面:
- 游戏通过键盘控制贪吃蛇的移动方向,操作简单直观。
- 游戏界面清晰明了,显示玩家的分数、剩余食物点数量以及当前的游戏模式等信息。
音乐和声效:
- 游戏过程中会播放轻松愉快的背景音乐,营造轻松愉快的游戏氛围。
- 吃到食物点时会有相应的音效提示,增加游戏的趣味性。
视觉艺术风格:
游戏采用简洁明快的视觉风格,色彩鲜艳且对比强烈。贪吃蛇和食物点的设计简洁可爱,符合游戏轻松愉快的氛围。
技术需求:
- 使用EasyX图形库进行游戏开发,实现图形界面的绘制和键盘输入的处理。
- 需要实现贪吃蛇的移动逻辑、食物点的生成逻辑以及游戏结束条件的判断逻辑等。
- 游戏过程中需要实时统计并显示玩家的分数和剩余食物点数量等信息。
开发计划:
- 预计开发周期为X个月,分为需求分析、设计、编码、测试和发布等阶段。
- 在开发过程中会定期进行代码审查和测试,确保游戏的稳定性和可玩性。
预算和资源:
- 需要一台配置较高的计算机用于开发和测试。
- 需要安装EasyX图形库和相应的编程环境(如Visual Studio)。
- 需要投入适量的时间和精力进行游戏开发和优化。
风险评估:
- 可能遇到的技术难题包括实现复杂的游戏逻辑和优化游戏性能等。
- 应对策略包括提前进行技术预研、合理规划开发进度以及定期进行代码优化等。
游戏截图:
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <conio.h>
#include <string.h>
#include <time.h>
#include <process.h>
#include <graphics.h>
#include <mmsystem.h>
#pragma comment(lib,"Winmm.lib")// 引用 Windows Multimedia API
LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam);
int Msg(HWND hwnd, TCHAR *szText, TCHAR *szCaption, UINT uType);
void randfood_resisttime(void *);
void Create_Food(int mod);
void Show_Map();
void Show_Score();
void Button();
void Check_Head(int x, int y);
void Move();
void StartGame();
void OnInit();
int gamespeed();
int getscorestep();//获得每次吃食物后的加分
void Cre_Hard_wallpos();//无屏障困难模式 产生wall
void Creat_game();//产生游戏要素
void Save_game();//存档
void Read_game();//读档
完整代码:
tcs.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <conio.h>
#include <string.h>
#include <time.h>
#include <process.h>
#include <graphics.h>
#include <mmsystem.h>
#pragma comment(lib,"Winmm.lib")// 引用 Windows Multimedia API
LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam);
int Msg(HWND hwnd, TCHAR *szText, TCHAR *szCaption, UINT uType);
void randfood_resisttime(void *);
void Create_Food(int mod);
void Show_Map();
void Show_Score();
void Button();
void Check_Head(int x, int y);
void Move();
void StartGame();
void OnInit();
int gamespeed();
int getscorestep();//获得每次吃食物后的加分
void Cre_Hard_wallpos();//无屏障困难模式 产生wall
void Creat_game();//产生游戏要素
void Save_game();//存档
void Read_game();//读档
tcs.cpp
#include "tcs.h"
#define L 20 //地图的长
#define H 20 //地图的高
int GameMap[L + 2][H + 2] = { 0 }; //游戏地图
int key; //按键保存
int sum = 1; //蛇的长度, 游戏结束(自吃或碰墙)
int dx[4] = { -1, 1, 0, 0 }; //左、右、上、下的方向
int dy[4] = { 0, 0, -1, 1 };
int res;//模式选择结果
int score = 0;//总分数
int pauseflag = 0;//暂停标志 pauseflag为1则暂停
int resist_time = -1;//加分食物剩余时间
int parfoodx, parfoody;//随机加分食物位置坐标
#define R 10 //显示的圆的半径
#define Wall 4 //墙
#define Shead 3 //蛇头
#define Sbody 2 //蛇身
#define Sfood 1 //食物
#define Sfood_par -1//特殊加分食物
#define Snode 0 //在地图中为空
#define GameLevel 5//GameLevel越小速度越快 每吃到GameLevel个食物游戏速度增加
struct Snake //蛇的每个节点的数据类型
{
int x, y; //蛇的每个节点在地图中的位置
int now; //保存当前节点的方向, 0,1,2,3分别为左右上下
}Snake[L * H];
LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
HWND hwnd = (HWND)wParam;
if (nCode == HCBT_ACTIVATE)
{
if (nCode == HCBT_ACTIVATE)
{
SetDlgItemText((HWND)wParam, IDYES, "&继续");
SetDlgItemText((HWND)wParam, IDNO, "&存档并退出");
SetDlgItemText((HWND)wParam, IDOK, "&经典");
SetDlgItemText((HWND)wParam, IDCANCEL, "&迷宫");
SetDlgItemText((HWND)wParam, IDABORT, "&有屏障");
SetDlgItemText((HWND)wParam, IDRETRY, "&无屏障");
SetDlgItemText((HWND)wParam, IDIGNORE, "&读档并开始");
}
}
return 0;
}
int Msg(HWND hwnd, TCHAR *szText, TCHAR *szCaption, UINT uType)
{
int ret;
HHOOK hHook = SetWindowsHookEx(WH_CBT, CBTHookProc, NULL, GetCurrentThreadId());
ret = MessageBox(hwnd, szText, szCaption, uType);
UnhookWindowsHookEx(hHook);
return ret;
}
void randfood_resisttime(void *)
{
while (1)
{
Sleep(1000);
if (pauseflag == 0)
{
if (resist_time == 0)
{
GameMap[parfoodx][parfoody] = Snode;
resist_time = -1;
Show_Map();
}
if (resist_time > 0)
resist_time--;
}
}
}
void Create_Food(int mod)
{
srand(