C语言easyx 贪吃蛇大作战,没有模仿,只有超越

作品名称:贪吃蛇大作战

版本历史和日期: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(
  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用easyx实现的简单贪吃蛇游戏C语言代码: ```c #include <graphics.h> #include <conio.h> #include <time.h> #define WIDTH 640 // 窗口宽度 #define HEIGHT 480 // 窗口高度 #define SIZE 20 // 贪吃蛇每个正方形的边长 #define MAX_LENGTH (WIDTH / SIZE) * (HEIGHT / SIZE) // 贪吃蛇最大长度 struct Snake { int x, y; // 贪吃蛇头部坐标 int length; // 贪吃蛇长度 int direction; // 贪吃蛇运动方向 int body[MAX_LENGTH][2]; // 贪吃蛇身体各个部分的坐标 } snake; struct Food { int x, y; // 食物坐标 } food; void init(); // 初始化函数 void drawSnake(); // 绘制贪吃蛇 void moveSnake(); // 移动贪吃蛇 void generateFood(); // 生成食物 bool isHitWall(); // 判断是否撞墙 bool isHitBody(); // 判断是否撞身体 bool isEatFood(); // 判断是否吃到食物 int main() { init(); while (1) { moveSnake(); if (isHitWall() || isHitBody()) { break; } if (isEatFood()) { generateFood(); } cleardevice(); drawSnake(); Sleep(100); } closegraph(); return 0; } void init() { initgraph(WIDTH, HEIGHT); setbkcolor(WHITE); setfillcolor(BLACK); setcolor(BLACK); snake.x = WIDTH / 2; snake.y = HEIGHT / 2; snake.length = 3; snake.direction = VK_RIGHT; for (int i = 0; i < snake.length; i++) { snake.body[i][0] = snake.x - i * SIZE; snake.body[i][1] = snake.y; } generateFood(); } void drawSnake() { for (int i = 0; i < snake.length; i++) { fillrectangle(snake.body[i][0], snake.body[i][1], snake.body[i][0] + SIZE, snake.body[i][1] + SIZE); } setfillcolor(RED); fillrectangle(food.x, food.y, food.x + SIZE, food.y + SIZE); setfillcolor(BLACK); } void moveSnake() { for (int i = snake.length - 1; i > 0; i--) { snake.body[i][0] = snake.body[i - 1][0]; snake.body[i][1] = snake.body[i - 1][1]; } switch (snake.direction) { case VK_UP: snake.y -= SIZE; break; case VK_DOWN: snake.y += SIZE; break; case VK_LEFT: snake.x -= SIZE; break; case VK_RIGHT: snake.x += SIZE; break; } snake.body[0][0] = snake.x; snake.body[0][1] = snake.y; } void generateFood() { srand((unsigned int)time(NULL)); bool flag = true; while (flag) { flag = false; food.x = SIZE * (1 + rand() % (WIDTH / SIZE - 2)); food.y = SIZE * (1 + rand() % (HEIGHT / SIZE - 2)); for (int i = 0; i < snake.length; i++) { if (food.x == snake.body[i][0] && food.y == snake.body[i][1]) { flag = true; break; } } } } bool isHitWall() { if (snake.x < SIZE || snake.x > WIDTH - 2 * SIZE || snake.y < SIZE || snake.y > HEIGHT - 2 * SIZE) { return true; } else { return false; } } bool isHitBody() { for (int i = 1; i < snake.length; i++) { if (snake.body[i][0] == snake.x && snake.body[i][1] == snake.y) { return true; } } return false; } bool isEatFood() { if (snake.x == food.x && snake.y == food.y) { snake.length++; snake.body[snake.length - 1][0] = snake.body[snake.length - 2][0]; snake.body[snake.length - 1][1] = snake.body[snake.length - 2][1]; return true; } else { return false; } } ``` 在该代码中,我们使用了`graphics.h`和`conio.h`两个头文件来实现图形界面和键盘输入的功能。其中,`init()`函数负责初始化贪吃蛇和食物的位置、长度、方向等信息,`drawSnake()`函数负责绘制贪吃蛇和食物,`moveSnake()`函数负责移动贪吃蛇,`generateFood()`函数负责随机生成食物,并判断其是否与贪吃蛇身体重叠,`isHitWall()`函数和`isHitBody()`函数分别用于判断贪吃蛇是否撞墙和撞身体,`isEatFood()`函数用于判断贪吃蛇是否吃到了食物。在主函数中,我们使用一个循环不断移动贪吃蛇,并根据不同情况终止游戏。 在编写完代码后,我们需要在编译选项中添加`-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32`这些库文件,才能正常编译和运行程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天若有情673

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值