minigui简单实现贪吃蛇代码

本文档详细介绍了如何使用Minigui库编写一个简单的贪吃蛇游戏,包括游戏边界绘制、蛇的移动和增长、食物的随机生成、边界和碰撞检测以及菜单功能实现。代码涵盖游戏循环、键盘控制、菜单选项如重新开始和难度选择,并提供了完整的源代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

1、画出边界

2、蛇的移动,初始蛇头和蛇的生长

3、食物的随机生成,用到rand函数,头文件#include

4、判断是否出界和头与身体相撞

5、菜单,实现了重新开始,和难度选择

5、最终代码


前言

所需头文件

#include <stdio.h>
#include <stdlib.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include <string.h>

minigui写的一个简单的贪吃蛇代码,如有不足之处,请谅解!

1、画出边界

void edge(){
	MoveTo(hdc,10,10);
	LineTo(hdc,10,510);
	MoveTo(hdc,510,10);
	LineTo(hdc,510,510);
	MoveTo(hdc,10,10);
	LineTo(hdc,510,10);
	MoveTo(hdc,10,510);
	LineTo(hdc,510,510);
}

2、蛇的移动,初始蛇头和蛇的生长

#define  Left	1000 //左
#define  right	1001//右
#define  upper	1002//上
#define  lower	1003//下
void motion()
{
	if(length==0){
	FillBox(hdc,place[0][0],place[0][1],10,10);//初始蛇头
	}
	place_1[0]=place[length][0];
	place_1[1]=place[length][1];//蛇尾坐标
	place_2[0]=place[0][0];
	place_2[1]=place[0][1];//蛇头坐标
	if(seep==1 && end_1!=1){
		if(direction==right){//向右
			place[0][0]+=10;
			FillBox(hdc,place[0][0],place[0][1],10,10);
			seep=0;
		}
		if(direction==Left){//向左
			place[0][0]-=10;
			FillBox(hdc,place[0][0],place[0][1],10,10);
			seep=0;
		}
		if(direction==upper){//向上
			place[0][1]-=10;
			FillBox(hdc,place[0][0],place[0][1],10,10);
			seep=0;
		}
		if(direction==lower){//向下
			place[0][1]+=10;
			FillBox(hdc,place[0][0],place[0][1],10,10);
			seep=0;
		}
		for(int i=1;place[i][0]!=0;i++){//蛇体移动
			place_3[0]=place[i][0];
			place_3[1]=place[i][1];
			place[i][0]=place_2[0];
			place[i][1]=place_2[1];
			FillBox(hdc,place[i][0],place[i][1],10,10);
			place_2[0]=place_3[0];
			place_2[1]=place_3[1];
		}
	
	if(add>0 && end_1!=1){//蛇的生长
		FillBox(hdc,place_1[0],place_1[1],10,10);
		length+=1;
		place[length][0]=place_1[0];
		place[length][1]=place_1[1];
		add-=1;
	}
	}
}

3、食物的随机生成,用到rand函数,头文件#include <stdlib.h>

产生随机数范围:[x,y]

int a=x+rand()%(y-x+1);

void food_1(){
	if(eat==0 ){
		food[0]=1+rand()%50;
		food[1]=1+rand()%50;
		while(1){//判断食物是否与蛇重合
			for(int i=1;place[i][0]!=0;i++){
				if(place[i][0]==food[0]*10 || place[i][1]==food[1]*10){
					food[0]=1+rand()%50;
					food[1]=1+rand()%50;
					sign=1;
					break;
				}
				else 
					sign=0;
			}
			if(sign==0){
				break;
			}
		}
		FillBox(hdc,10*food[0],food[1]*10,10,10);
		eat=1;
	}
	//蛇头是否吃到食物
	if(place[0][0]==food[0]*10 && place[0][1]==food[1]*10 && eat==1){
		add+=1;
		score+=1;
		eat=0;
	}
	if(end_1!=1){
		FillBox(hdc,10*food[0],food[1]*10,10,10);
	}
	
}

4、判断是否出界和头与身体相撞

void judge(HWND hWnd){
	if((place[0][0]>500 || place[0][1]>500 || place[0][0]<20 || place[0][1]<20) && end_1!=1){
		end_1=1;
		MessageBox (hWnd, str, "", MB_OK | MB_ICONINFORMATION);
	}
	for(int i=1;place[i][0]!=0;i++){
		if(place[0][0]==place[i][0] && place[0][1]==place[i][1] && end_1!=1){
			end_1=1;
			MessageBox (hWnd, str, "", MB_OK | MB_ICONINFORMATION);
			break;
		}
	}
}

5、菜单,实现了重新开始,和难度选择

#define  IDM_RE	1005//重新开始
#define  IDM_FILE   1006
#define  IDM_DIF    1007//难度
#define  IDM_ONE    30
#define  IDM_TWO    10
#define  IDM_THREE    5
//子菜单
static HMENU createpmenufile (void)
{
 	HMENU hmnu;
 	MENUITEMINFO mii;
 	
 	memset (&mii, 0, sizeof(MENUITEMINFO));
	mii.type = MFT_STRING;
	mii.id =IDM_FILE;
	mii.typedata = (DWORD)"game";
	hmnu = CreatePopupMenu(&mii);
	  
 	memset (&mii, 0, sizeof(MENUITEMINFO));
 	mii.type = MFT_STRING;
 	mii.state = 0;
 	mii.id =IDM_RE;
 	mii.typedata = (DWORD)"restart";//重新开始
 	InsertMenuItem(hmnu, 0, TRUE, &mii);
 	return hmnu;

}
static HMENU createpmenufile_1 (void)
{
 	HMENU hmnu;
 	MENUITEMINFO mii;
 	
 	memset (&mii, 0, sizeof(MENUITEMINFO));
	mii.type = MFT_STRING;
	mii.id =IDM_DIF;
	mii.typedata = (DWORD)"difficulty";
	hmnu = CreatePopupMenu(&mii);
	  
 	memset (&mii, 0, sizeof(MENUITEMINFO));
 	mii.type = MFT_STRING;
 	mii.state = 0;
 	mii.id =IDM_ONE;
 	mii.typedata = (DWORD)"difficulty 1";//难度1
 	InsertMenuItem(hmnu, 0, TRUE, &mii);
 	
	memset (&mii, 0, sizeof(MENUITEMINFO));
	mii.type = MFT_STRING;
	mii.state = 0;
	mii.id =IDM_TWO;
	mii.typedata = (DWORD)"difficulty 2";//难度2
	InsertMenuItem(hmnu, 1, TRUE, &mii);
	
	memset (&mii, 0, sizeof(MENUITEMINFO));
	mii.type = MFT_STRING;
	mii.state = 0;
	mii.id =IDM_THREE;
	mii.typedata = (DWORD)"difficulty 3";//难度3
	InsertMenuItem(hmnu, 2, TRUE, &mii);
	return hmnu;
}
//主菜单
static HMENU createmenu(void)
{
 	HMENU hmnu;
 	MENUITEMINFO mii;
 	hmnu = CreateMenu();
 	memset (&mii, 0, sizeof(MENUITEMINFO));
 	mii.type = MFT_STRING;
 	mii.id =IDM_FILE;
 	mii.typedata = (DWORD)"game";
 	mii.hsubmenu = createpmenufile ();
 	InsertMenuItem(hmnu, 0, TRUE, &mii);
 
 	memset (&mii, 0, sizeof(MENUITEMINFO));
	mii.type = MFT_STRING;
  	mii.id =IDM_DIF;
  	mii.typedata = (DWORD)"difficulty";
  	mii.hsubmenu = createpmenufile_1 ();
  	InsertMenuItem(hmnu, 1, TRUE, &mii);
 	return hmnu;
}
case MSG_COMMAND:
				switch (wParam) {
					case IDM_RE://重新开始
					 	InvalidateRect(hWnd, NULL, TRUE);
						memset(place, 0, sizeof(place));
						place[0][0]=20;
						place[0][1]=20;
						end_1=0;
						sign=0;
						eat=0;
						add=2;
						seep=0;
						length=0;
						length=0;
						score=0;
						direction=right;
						start=1;
					 	break;
					case IDM_ONE://难度1
						ResetTimer(hWnd,TIME,IDM_ONE);
						difficulty=1;
						break;
					case IDM_TWO://难度2
						ResetTimer(hWnd,TIME,IDM_TWO);
						difficulty=2;
						break;
					case IDM_THREE://难度3
						ResetTimer(hWnd,TIME,IDM_THREE);
						difficulty=3;
						break;
				};
				break;

5、最终代码

#include <stdio.h>
#include <stdlib.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include <string.h>

#define  Left	1000 //左
#define  right	1001//右
#define  upper	1002//上
#define  lower	1003//下
#define  TIME   1004//时间
#define  IDM_RE	1005//重新开始
#define  IDM_FILE   1006
#define  IDM_DIF    1007//难度
#define  IDM_ONE    30
#define  IDM_TWO    10
#define  IDM_THREE    5

int place[100][2]={{20,20}};
int direction,seep=0;
static BITMAP pic;
HDC hdc;
int food[2],place_1[2],place_2[2],place_3[2],length=0;
int difficulty,score,add=2;
int end_1,sign,start,eat=0;
char str_1[2][50],str[100]={"game over"};

//判断是否出界和头与身体相撞
void judge(HWND hWnd){
	if((place[0][0]>500 || place[0][1]>500 || place[0][0]<20 || place[0][1]<20) && end_1!=1){
		end_1=1;
		//MessageBox (hWnd, str, "", MB_OK | MB_ICONINFORMATION);
	}
	for(int i=1;place[i][0]!=0;i++){
		if(place[0][0]==place[i][0] && place[0][1]==place[i][1] && end_1!=1){
			end_1=1;
			//MessageBox (hWnd, str, "", MB_OK | MB_ICONINFORMATION);
			break;
		}
	}
}
//蛇的移动
void motion()
{
	if(length==0){
	FillBox(hdc,place[0][0],place[0][1],10,10);//初始蛇头
	}
	place_1[0]=place[length][0];
	place_1[1]=place[length][1];//蛇尾坐标
	place_2[0]=place[0][0];
	place_2[1]=place[0][1];//蛇头坐标
	if(seep==1 && end_1!=1){
		if(direction==right){//向右
			place[0][0]+=10;
			FillBox(hdc,place[0][0],place[0][1],10,10);
			seep=0;
		}
		if(direction==Left){//向左
			place[0][0]-=10;
			FillBox(hdc,place[0][0],place[0][1],10,10);
			seep=0;
		}
		if(direction==upper){//向上
			place[0][1]-=10;
			FillBox(hdc,place[0][0],place[0][1],10,10);
			seep=0;
		}
		if(direction==lower){//向下
			place[0][1]+=10;
			FillBox(hdc,place[0][0],place[0][1],10,10);
			seep=0;
		}
		for(int i=1;place[i][0]!=0;i++){//蛇体移动
			place_3[0]=place[i][0];
			place_3[1]=place[i][1];
			place[i][0]=place_2[0];
			place[i][1]=place_2[1];
			FillBox(hdc,place[i][0],place[i][1],10,10);
			place_2[0]=place_3[0];
			place_2[1]=place_3[1];
		}
	
	if(add>0 && end_1!=1){//蛇的生长
		FillBox(hdc,place_1[0],place_1[1],10,10);
		length+=1;
		place[length][0]=place_1[0];
		place[length][1]=place_1[1];
		add-=1;
	}
	}
}
//食物的随机生成
void food_1(){
	if(eat==0 ){
		food[0]=1+rand()%50;
		food[1]=1+rand()%50;
		while(1){//判断食物是否与蛇重合
			for(int i=1;place[i][0]!=0;i++){
				if(place[i][0]==food[0]*10 || place[i][1]==food[1]*10){
					food[0]=1+rand()%50;
					food[1]=1+rand()%50;
					sign=1;
					break;
				}
				else 
					sign=0;
			}
			if(sign==0){
				break;
			}
		}
		FillBox(hdc,10*food[0],food[1]*10,10,10);
		eat=1;
	}
	//蛇头是否吃到食物
	if(place[0][0]==food[0]*10 && place[0][1]==food[1]*10 && eat==1){
		add+=1;
		score+=1;
		eat=0;
	}
	if(end_1!=1){
		FillBox(hdc,10*food[0],food[1]*10,10,10);
	}
}
//边界
void edge(){
	MoveTo(hdc,10,10);
	LineTo(hdc,10,510);
	MoveTo(hdc,510,10);
	LineTo(hdc,510,510);
	MoveTo(hdc,10,10);
	LineTo(hdc,510,10);
	MoveTo(hdc,10,510);
	LineTo(hdc,510,510);
}
//子菜单
static HMENU createpmenufile (void)
{
 	HMENU hmnu;
 	MENUITEMINFO mii;
 	
 	memset (&mii, 0, sizeof(MENUITEMINFO));
	mii.type = MFT_STRING;
	mii.id =IDM_FILE;
	mii.typedata = (DWORD)"game";
	hmnu = CreatePopupMenu(&mii);
	  
 	memset (&mii, 0, sizeof(MENUITEMINFO));
 	mii.type = MFT_STRING;
 	mii.state = 0;
 	mii.id =IDM_RE;
 	mii.typedata = (DWORD)"restart";//重新开始
 	InsertMenuItem(hmnu, 0, TRUE, &mii);
 	return hmnu;

}
static HMENU createpmenufile_1 (void)
{
 	HMENU hmnu;
 	MENUITEMINFO mii;
 	
 	memset (&mii, 0, sizeof(MENUITEMINFO));
	mii.type = MFT_STRING;
	mii.id =IDM_DIF;
	mii.typedata = (DWORD)"difficulty";
	hmnu = CreatePopupMenu(&mii);
	  
 	memset (&mii, 0, sizeof(MENUITEMINFO));
 	mii.type = MFT_STRING;
 	mii.state = 0;
 	mii.id =IDM_ONE;
 	mii.typedata = (DWORD)"difficulty 1";//难度1
 	InsertMenuItem(hmnu, 0, TRUE, &mii);
 	
	memset (&mii, 0, sizeof(MENUITEMINFO));
	mii.type = MFT_STRING;
	mii.state = 0;
	mii.id =IDM_TWO;
	mii.typedata = (DWORD)"difficulty 2";//难度2
	InsertMenuItem(hmnu, 1, TRUE, &mii);
	
	memset (&mii, 0, sizeof(MENUITEMINFO));
	mii.type = MFT_STRING;
	mii.state = 0;
	mii.id =IDM_THREE;
	mii.typedata = (DWORD)"difficulty 3";//难度3
	InsertMenuItem(hmnu, 2, TRUE, &mii);
	return hmnu;
}
//主菜单
static HMENU createmenu(void)
{
 	HMENU hmnu;
 	MENUITEMINFO mii;
 	hmnu = CreateMenu();
 	memset (&mii, 0, sizeof(MENUITEMINFO));
 	mii.type = MFT_STRING;
 	mii.id =IDM_FILE;
 	mii.typedata = (DWORD)"game";
 	mii.hsubmenu = createpmenufile ();
 	InsertMenuItem(hmnu, 0, TRUE, &mii);
 
 	memset (&mii, 0, sizeof(MENUITEMINFO));
	mii.type = MFT_STRING;
  	mii.id =IDM_DIF;
  	mii.typedata = (DWORD)"difficulty";
  	mii.hsubmenu = createpmenufile_1 ();
  	InsertMenuItem(hmnu, 1, TRUE, &mii);
 	return hmnu;
}

static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) {
	int i, j;
	LoadBitmap (HDC_SCREEN, &pic, "2.bmp");//加载图片
	SetTimer (hWnd,TIME,IDM_ONE);//设置初始速度
	switch (message) {

		case MSG_TIMER://时间消息
			if (wParam == TIME)
			    InvalidateRect(hWnd, NULL, TRUE);
			    seep=1;
			break;
			
		case MSG_KEYDOWN://键盘消息
			switch (wParam) {
		 		case SCANCODE_CURSORBLOCKLEFT://左移键
		 			if(direction!=right){
						direction=Left;
					}
		 			break;
		 		case SCANCODE_CURSORBLOCKRIGHT://右移键
		 			if(direction!=Left){
					 	direction=right;
					 }		 			
		 			break;	
		 		case SCANCODE_CURSORBLOCKUP://上移键
		 			if(direction!=lower){
					 	direction=upper;
					 }		 			
		 			break;
		 		case SCANCODE_CURSORBLOCKDOWN://下移键盘
		 			if(direction!=upper){
					 	direction=lower;
					 }		 			
		 			break;
			} 
			break;
			
			case MSG_COMMAND:
				switch (wParam) {
					case IDM_RE://重新开始
					 	InvalidateRect(hWnd, NULL, TRUE);
						memset(place, 0, sizeof(place));
						place[0][0]=20;
						place[0][1]=20;
						end_1=0;
						sign=0;
						eat=0;
						add=2;
						seep=0;
						length=0;
						length=0;
						score=0;
						direction=right;
						start=1;
					 	break;
					case IDM_ONE://难度1
						ResetTimer(hWnd,TIME,IDM_ONE);
						difficulty=1;
						break;
					case IDM_TWO://难度2
						ResetTimer(hWnd,TIME,IDM_TWO);
						difficulty=2;
						break;
					case IDM_THREE://难度3
						ResetTimer(hWnd,TIME,IDM_THREE);
						difficulty=3;
						break;
				};
				break;
		    
		case MSG_PAINT:
			hdc = BeginPaint (hWnd);
			FillBoxWithBitmap (hdc, 0, 0,600,600, &pic);//填充背景
			SetBrushColor(hdc, COLOR_black);
			edge();//边界
			motion();//移动
			food_1();//食物
			judge(hWnd);//判断
			sprintf(str_1[0]," score: %d",score);
			TextOut (hdc, 510,50,str_1[0]);//显示分数
			sprintf(str_1[1]," difficulty: %d",difficulty);
			TextOut (hdc, 510,100,str_1[1]);//显示难度
			EndPaint (hWnd, hdc);
			return 0;
			

		case MSG_CLOSE://销毁窗口和控件
			DestroyAllControls (hWnd);
			DestroyMainWindow (hWnd);
			PostQuitMessage (hWnd);
			return 0;
	}
	return DefaultMainWinProc (hWnd, message, wParam, lParam);
}

int MiniGUIMain (int argc, const char* argv[]) {
	MSG Msg;
	HWND hMainWnd;
	MAINWINCREATE CreateInfo;
	direction=right;
	score=0;//分数初始化
	difficulty=1;//难度初始化
#ifdef _LITE_VERSION
	SetDesktopRect(0, 0, 800, 600);
#endif
	CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
	CreateInfo.dwExStyle = WS_EX_NONE;
	CreateInfo.spCaption = "HelloWorld";
	CreateInfo.hMenu =createmenu();
	CreateInfo.hCursor = GetSystemCursor(0);
	CreateInfo.hIcon = 0;
	CreateInfo.MainWindowProc = HelloWinProc;
	CreateInfo.lx = 0;
	CreateInfo.ty = 0;
	CreateInfo.rx = 600;
	CreateInfo.by = 600;
	CreateInfo.iBkColor = COLOR_lightwhite;
	CreateInfo.dwAddData = 0;
	CreateInfo.hHosting = HWND_DESKTOP;
	hMainWnd = CreateMainWindow (&CreateInfo);
	if (hMainWnd == HWND_INVALID)
		return -1;
	ShowWindow(hMainWnd, SW_SHOWNORMAL);
	while (GetMessage(&Msg, hMainWnd)) {
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}
	MainWindowThreadCleanup (hMainWnd);
	UnloadBitmap(&pic);//此函数用于卸载指定的位图
	return 0;
}
#ifndef _LITE_VERSION
#include <minigui/dti.c>
#endif

 效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值