目录
3、食物的随机生成,用到rand函数,头文件#include
前言
所需头文件
#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
效果