目录

设计一个简单的推箱子游戏

功能设计要求:

代码实现

基础代码要求

基本数据定义

主要函数

Windows_Init函数

Windows_Show函数

void Flash_Frame()函数

代码整合

代码优化方向

第一次发布文章,写的可能有点多,想直接看码的可以跳到代码整合目录,程序中也有注释,也可以移步用C语言实现推箱子小游戏基础程序plus_Cheat_陈十一的博客-CSDN博客,全新推出的优化过的plus代码

设计一个简单的推箱子游戏

该游戏是通过控制人的走向来移动箱子,箱子只能向前推,不能向后拉,且一次只能推动一个箱子。

功能设计要求:

  1. 人机操控平台:启动程序后,系统提供给用户一个操作界面,以便用户有效操作游戏。
  2. 创建并绘制地图:推箱子游戏需要创建不同的地图以增加游戏的趣味性。
  3. 选择地图:系统应提供两个及以上不同难度的地图以供用户选择。
  4. 移动操作:本游戏主要通过人或人和箱子的移动来进行的。系统接收用户输入一个字符(按键)来控制人的走向,并且可以在允许的情况下推动箱子。
  5. 移动步数和得分:移动步数是统计从开始游戏到游戏结束(通关)所走的总步数,在游戏过程中这是实时变化的。得分是统计每将一个箱子移动到目的地所获得的分数,只有当把所有箱子移动到指定目标位置后游戏结束(通关)。
  6. 游戏操作说明:系统给用户提供地图元素组成、操作规则等信息

代码实现

基础代码要求

基本数据定义

代码实现主要使用graphics.h和conio.h库实现人机交互等。

用死循环对键盘进行轮询检测键盘输入。

代码初期参考第9章 推箱子 - CodeBus,初学graphics.h。

下面介绍本程序中运用到的graphics.h中的一些函数。#include <stdio.h>

#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <conio.h>
#define Box_Size 60//每个格子所占像素大小
#define Box_Num 9//格子数//记录玩家位置
struct Player
{int x;int y;
};
Player player;
enum Element{empty,wall,role,target,box,achieve,data_bg,role_target};//empty=0表示空地,wall=1表示墙,role=2玩家位置,target=3目标位置,box=4箱子位置,achieeve=5成功位置(箱子位置与目标位置重合时),data_bg=6数据背景,role_target=7当role与target重合时
int origin_windows[Round_Num][Box_Num][Box_Num+1] = {{{1,1,1,1,1,1,1,1,1,6},{1,1,0,0,0,1,1,1,1,6},{1,1,0,0,0,1,0,0,1,6},{1,1,1,0,0,0,0,3,1,6},{1,1,1,0,1,1,1,3,1,6},{1,0,4,0,1,1,1,3,1,6},{1,0,4,4,1,1,1,1,1,6},{1,2,0,0,1,1,1,1,1,6},{1,1,1,1,1,1,1,1,1,6},},
};

enum Element方便书写已经后续查验代码时使用

//第一关卡地图int First_Round[Box_Num][Box_Num+1];/*
* targetNum目标数目
* achievementNum成功数目
* steps记录步数
* Mode 切换模式,用于重玩
*/
int targetNum = 0, achievementNum = 0, steps, Mode = 0;

主要函数

int main()
{Windows_Init();while (1){if (Mode == 0)Windows_Show();else{Windows_Init();Mode = 0;}Flash_Frame();};return 0;
}

先确定主要实现流程:窗口初始化->通过First_Round数组元素进行游戏场景展示->轮询键盘->改变First_Round数组元素->重新进行场景展示->...->游戏结束

则定义函数
void Windows_Init(void);//窗口及数据初始化
void Windows_Show(void);//展示游戏窗口
void Flash_Frame(void);//轮询键盘

Windows_Init函数

void Windows_Init(void)
{initgraph(Box_Num * Box_Size+80, Box_Num * Box_Size);setbkcolor(RGB(255, 255, 255));BeginBatchDraw();int i, j;targetNum = 0;//遍历第一关卡for (i = 0; i < Box_Num; i++){for (j = 0; j < Box_Num; j++){First_Round[i][j] = origin_windows[0][i][j];//将所有关卡中的某一关赋给本轮游戏的关卡数组if (origin_windows[0][i][j] == role){player.x = i;player.y = j;}else if (origin_windows[0][i][j] == target)targetNum++;}}achievementNum = 0;steps = 0;
}

initgraph(w,h):设置一个w宽h高的绘图窗口

setbkcolor():设置绘图窗口背景色

BeginBatchDraw():用于开始批量绘图。执行后,任何绘图操作都将暂时不输出到绘图窗口上,直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。

Windows_Show函数

void Windows_Show()
{int i, j;//cleardevice() :清空屏幕,之后会界面内容全部清空,显示为默认背景颜色。cleardevice();//遍历二维关卡数据for (i = 0; i < Box_Num; i++){for (j = 0; j < Box_Num; j++){if (First_Round[i][j] == empty||First_Round[i][j]==data_bg)//空格为白色{//setfillcolor():设置填充绘制图形式所用的颜色。setfillcolor(RGB(255, 255, 255));setlinecolor(RGB(255, 255, 255));fillrectangle(j * Box_Size, i * Box_Size, (j + 1) * Box_Size, (i + 1) * Box_Size);}else if (First_Round[i][j] == wall)//墙的样式{setfillcolor(RGB(0x93, 0x84, 0x5c));setlinecolor(RGB(255, 255, 255));fillrectangle(j * Box_Size, i * Box_Size, (j + 1) * Box_Size, (i + 1) * Box_Size);}else if (First_Round[i][j] == role || First_Round[i][j] == role_target){setfillcolor(RGB(0xf5, 0xc3, 0x42));setlinecolor(RGB(255, 255, 255));fillcircle((j + 0.5) * Box_Size, (i + 0.5) * Box_Size, 0.5 * Box_Size);}else if (First_Round[i][j] == box)//盒子的样式{setfillcolor(RGB(0, 0, 255));setlinecolor(RGB(255, 255, 255));fillrectangle(j * Box_Size, i * Box_Size, (j + 1) * Box_Size, (i + 1) * Box_Size);}else if (First_Round[i][j] == target)//目标点的样式{setfillcolor(RGB(0, 255, 150));setlinecolor(RGB(255, 255, 255));fillrectangle((j + 0.3) * Box_Size, (i + 0.3) * Box_Size, (j + 0.7) * Box_Size, (i + 0.7) * Box_Size);}else if (First_Round[i][j] == achieve)成功的样式{setfillcolor(RGB(15, 99, 60));setlinecolor(RGB(255, 255, 255));fillcircle((j + 0.5) * Box_Size, (i + 0.5) * Box_Size, 0.5 * Box_Size);}}}//OPAQUE不透明//SetBkMode函数来设置DrawText函数的输出方式wchar_t step_str[10];setbkmode(OPAQUE);settextcolor(RGB(0, 0, 0));settextstyle(30, 0, _T("宋体"));outtextxy(Box_Size * Box_Num + 5, 60, _T("steps"));_stprintf_s(step_str, _T("%d"), steps);outtextxy(Box_Size * Box_Num + 5, 90, step_str);//记步wchar_t score_str[10];setbkmode(OPAQUE);settextcolor(RGB(0, 0, 0));settextstyle(30, 0, _T("宋体"));outtextxy(Box_Size*Box_Num+5, 120, _T("score"));_stprintf_s(score_str, _T("%d"), achievementNum);//计分outtextxy(Box_Size * Box_Num + 5, 150, score_str);if (check_lose()){//TRANSPARENT透明setbkmode(TRANSPARENT);settextcolor(RGB(255, 255, 0));settextstyle(80, 0, _T("宋体"));outtextxy(80, 200, _T("lose"));}else if (achievementNum == targetNum){setbkmode(TRANSPARENT);settextcolor(RGB(255, 255, 0));settextstyle(80, 0, _T("宋体"));outtextxy(80, 200, _T("win"));}FlushBatchDraw();
} 

cleardevice() :清空屏幕,之后会界面内容全部清空,显示为默认背景颜色。(一般用在更改背景色后)

setfillcolor(RGB( , , )):设置填充绘制图形式所用的颜色。

setlinecolorRGB()):设置线的填充样式

fillrectangle(x1,y1,x2,y2):长方形,左上顶点(x1,y1),右下顶点(x2,y2)

setbkmode():设置text的输出属性,OPAQUE不透明,TRANSPARENT透明

settextcolor(RGB()):设置text颜色

        #其中RGB()也可为0xff000000,分组形式为0x|ff|000000,ff为透明度,000000为RGB

settextstyle(cHeight,cWidth,ctype);cHeight指定高度,cWidth字符的平均宽度(0为自适应),ctype字体名称

outtextxy(x,y,s),在起始位置为(x,y)处输出s

        #参考EasyX 文档 - outtextxy,s的具体字符类型可以在程序实现过程中尝试

#例如当我们为outtextxy传入char s[10]的参数时,会报

无法将参数 1 从“char [10]”转换为“wchar_t *const ”

的错误,此时将char s更改为wchar_t s;

#使用_stprintf_s(s, _T("%d"), Num);来将数字转为wchar_t类型的字符串。

FlushBatchDraw():执行未完成的绘制任务

随后根据First_Round中不同的元素属性绘制不同的图案

void Flash_Frame()函数

在此函数中进行键盘轮询以及对关卡数组进行相应的改变

使用conio.h库与键盘进行交互

先写一个上移操作

    char input;int role_x,role_y;//当收到键盘操作时,人物即将移动到的点位//_kbhit检查当前是否有键盘输入,若有则返回一个非0值,否则返回0   if (_kbhit() && (achievementNum < targetNum)){//getch从键盘读取单个字符。 但它不使用任何缓冲区,因此输入的字符会立即返回,无需等待回车键。input = _getch();steps++;switch (input){case('w')://上移role_x=player.x-1;if (First_Round[role_x][player.y] == empty){if (First_Round[player.x][player.y] == role)//如果此处是roleFirst_Round[player.x][player.y] = empty;else//如果此处是role_targetFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y] = role;player.x = role_x;}else if (First_Round[role_x][player.y] == target){if (First_Round[player.x][player.y] == role)//如果此处是roleFirst_Round[player.x][player.y] = empty;else//如果此处是role_targetFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y] = role_target;player.x = role_x;}else if ((First_Round[role_x][player.y] == box|| First_Round[role_x][player.y] == achieve) && (First_Round[role_x - 1][player.y] == empty|| First_Round[role_x - 1][player.y] == target))//判断有wall{if (First_Round[role_x][player.y] == box){if (First_Round[player.x][player.y] == role)//如果此处是roleFirst_Round[player.x][player.y] = empty;else//如果此处是role_targetFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y] = role;player.x = role_x;if (First_Round[role_x - 1][player.y] == target)//如果box和target重叠,合为achieve{First_Round[role_x - 1][player.y] = achieve;achievementNum++;}elseFirst_Round[role_x - 1][player.y] = box;}else if(First_Round[role_x][player.y] == achieve){achievementNum--;if (First_Round[player.x][player.y] == role)//此位置是玩家位置First_Round[player.x][player.y] = empty;//此位置变为空else //此位置是role_targetFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y] = role_target; //将box从target中推走,则此位置变成role_targetplayer.x = role_x;if (First_Round[role_x - 1][player.y] == target)//如果box和target重叠,合为achieve{First_Round[role_x - 1][player.y] = achieve;achievementNum++;}elseFirst_Round[role_x - 1][player.y] = box;}}break;

此函数没有新内容,看码就行

并且类推写出左右下移,放入switch中

        case('r'):Mode = 1;break;

r用于重玩游戏

代码整合

#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>#define Box_Size 60
#define Box_Num 9
#define Round_Num 3//记录玩家位置
struct Player
{int x;int y;
};
Player player,playernext;enum Element{empty,wall,role,target,box,achieve,data_bg,role_target};
//1表示墙,0表示空地,2表示玩家位置,3目标位置,4箱子位置
int origin_windows[Round_Num][Box_Num][Box_Num+1] = {{{1,1,1,1,1,1,1,1,1,6},{1,1,0,0,0,1,1,1,1,6},{1,1,0,0,0,1,0,0,1,6},{1,1,1,0,0,0,0,3,1,6},{1,1,1,0,1,1,1,3,1,6},{1,0,4,0,1,1,1,3,1,6},{1,0,4,4,1,1,1,1,1,6},{1,2,0,0,1,1,1,1,1,6},{1,1,1,1,1,1,1,1,1,6},},
};int last_step[Box_Num][Box_Num+1],First_Round[Box_Num][Box_Num+1];int targetNum = 0, achievementNum = 0, steps, Mode = 0;int check_lose()
{int i, j;for (i = 1; i < Box_Num - 1; i++){for (j = 1; j < Box_Num - 1; j++){if (First_Round[i][j] == box && (First_Round[i + 1][j] == wall && First_Round[i][j + 1] == wall || First_Round[i - 1][j] == wall && First_Round[i][j - 1] == wall))return 1;}}return 0;
}void Windows_Init(void)
{initgraph(Box_Num * Box_Size+80, Box_Num * Box_Size);setbkcolor(RGB(255, 255, 255));BeginBatchDraw();int i, j;targetNum = 0;//遍历第一关卡for (i = 0; i < Box_Num; i++){for (j = 0; j < Box_Num; j++){First_Round[i][j] = origin_windows[0][i][j];//将所有关卡中的某一关赋给本轮游戏的关卡数组if (origin_windows[0][i][j] == role){player.x = i;player.y = j;}else if (origin_windows[0][i][j] == target)targetNum++;}}achievementNum = 0;steps = 0;
}void Windows_Show()
{int i, j;//cleardevice() :清空屏幕,之后会界面内容全部清空,显示为默认背景颜色。cleardevice();//遍历二维关卡数据for (i = 0; i < Box_Num; i++){for (j = 0; j < Box_Num; j++){if (First_Round[i][j] == empty||First_Round[i][j]==data_bg){//setfillcolor():设置填充绘制图形式所用的颜色。setfillcolor(RGB(255, 255, 255));setlinecolor(RGB(255, 255, 255));fillrectangle(j * Box_Size, i * Box_Size, (j + 1) * Box_Size, (i + 1) * Box_Size);}else if (First_Round[i][j] == wall){setfillcolor(RGB(0x93, 0x84, 0x5c));setlinecolor(RGB(255, 255, 255));fillrectangle(j * Box_Size, i * Box_Size, (j + 1) * Box_Size, (i + 1) * Box_Size);}else if (First_Round[i][j] == role || First_Round[i][j] == role_target){setfillcolor(RGB(0xf5, 0xc3, 0x42));setlinecolor(RGB(255, 255, 255));fillcircle((j + 0.5) * Box_Size, (i + 0.5) * Box_Size, 0.5 * Box_Size);}else if (First_Round[i][j] == box){setfillcolor(RGB(0, 0, 255));setlinecolor(RGB(255, 255, 255));fillrectangle(j * Box_Size, i * Box_Size, (j + 1) * Box_Size, (i + 1) * Box_Size);}else if (First_Round[i][j] == target){setfillcolor(RGB(0, 255, 150));setlinecolor(RGB(255, 255, 255));fillrectangle((j + 0.3) * Box_Size, (i + 0.3) * Box_Size, (j + 0.7) * Box_Size, (i + 0.7) * Box_Size);}else if (First_Round[i][j] == achieve){setfillcolor(RGB(15, 99, 60));setlinecolor(RGB(255, 255, 255));fillcircle((j + 0.5) * Box_Size, (i + 0.5) * Box_Size, 0.5 * Box_Size);}}}//OPAQUE不透明//SetBkMode函数来设置DrawText函数的输出方式wchar_t step_str[10];setbkmode(OPAQUE);settextcolor(RGB(0, 0, 0));settextstyle(30, 0, _T("宋体"));outtextxy(Box_Size * Box_Num + 5, 60, _T("steps"));_stprintf_s(step_str, _T("%d"), steps);outtextxy(Box_Size * Box_Num + 5, 90, step_str);wchar_t score_str[10];setbkmode(OPAQUE);settextcolor(RGB(0, 0, 0));settextstyle(30, 0, _T("宋体"));outtextxy(Box_Size*Box_Num+5, 120, _T("score"));_stprintf_s(score_str, _T("%d"), achievementNum);outtextxy(Box_Size * Box_Num + 5, 150, score_str);if (check_lose()){//TRANSPARENT透明setbkmode(TRANSPARENT);settextcolor(RGB(255, 255, 0));settextstyle(80, 0, _T("宋体"));outtextxy(80, 200, _T("lose"));}else if (achievementNum == targetNum){setbkmode(TRANSPARENT);settextcolor(RGB(255, 255, 0));settextstyle(80, 0, _T("宋体"));outtextxy(80, 200, _T("win"));}FlushBatchDraw();
} void Flash_Frame()
{char input;int role_x,role_y;//当收到键盘操作时,人物即将移动到的点位//_kbhit检查当前是否有键盘输入,若有则返回一个非0值,否则返回0if (_kbhit() && (achievementNum < targetNum)){//getch从键盘读取单个字符。 但它不使用任何缓冲区,因此输入的字符会立即返回,无需等待回车键。input = _getch();steps++;switch (input){case('w')://上移role_x=player.x-1;if (First_Round[role_x][player.y] == empty){if (First_Round[player.x][player.y] == role)//如果此处是roleFirst_Round[player.x][player.y] = empty;else//如果此处是role_targetFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y] = role;player.x = role_x;}else if (First_Round[role_x][player.y] == target){if (First_Round[player.x][player.y] == role)//如果此处是roleFirst_Round[player.x][player.y] = empty;else//如果此处是role_targetFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y] = role_target;player.x = role_x;}else if ((First_Round[role_x][player.y] == box|| First_Round[role_x][player.y] == achieve) && (First_Round[role_x - 1][player.y] == empty|| First_Round[role_x - 1][player.y] == target))//判断有wall{if (First_Round[role_x][player.y] == box){if (First_Round[player.x][player.y] == role)//如果此处是roleFirst_Round[player.x][player.y] = empty;else//如果此处是role_targetFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y] = role;player.x = role_x;if (First_Round[role_x - 1][player.y] == target)//如果box和target重叠,合为achieve{First_Round[role_x - 1][player.y] = achieve;achievementNum++;}elseFirst_Round[role_x - 1][player.y] = box;}else if(First_Round[role_x][player.y] == achieve){achievementNum--;if (First_Round[player.x][player.y] == role)//此位置是玩家位置First_Round[player.x][player.y] = empty;//此位置变为空else //此位置是role_targetFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y] = role_target; //将box从target中推走,则此位置变成role_targetplayer.x = role_x;if (First_Round[role_x - 1][player.y] == target)//如果box和target重叠,合为achieve{First_Round[role_x - 1][player.y] = achieve;achievementNum++;}elseFirst_Round[role_x - 1][player.y] = box;}}break;case('s')://下移role_x = player.x + 1;if (First_Round[role_x][player.y] == empty){if (First_Round[player.x][player.y] == role)First_Round[player.x][player.y] = empty;elseFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y] = role;player.x = role_x;}else if (First_Round[role_x][player.y] == target){if (First_Round[player.x][player.y] == role)//如果此处是roleFirst_Round[player.x][player.y] = empty;else//如果此处是role_targetFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y] = role_target;player.x = role_x;}else if ((First_Round[role_x][player.y] == box || First_Round[role_x][player.y] == achieve) && (First_Round[role_x + 1][player.y] == empty || First_Round[role_x + 1][player.y] == target)){if (First_Round[role_x][player.y] == box){if (First_Round[player.x][player.y] == role)First_Round[player.x][player.y] = empty;elseFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y]=role;player.x = role_x;if (First_Round[role_x + 1][player.y] == target)//如果box和target重叠,合为achieve{First_Round[role_x + 1][player.y] = achieve;achievementNum++;}elseFirst_Round[role_x + 1][player.y] = box;}else if (First_Round[role_x][player.y] == achieve){achievementNum--;if (First_Round[player.x][player.y] == role)//此位置是玩家位置First_Round[player.x][player.y] = empty;//此位置变为空else //此位置是role_targetFirst_Round[player.x][player.y] = target;First_Round[role_x][player.y] = role_target; //将box从target中推走,则此位置变成role_targetplayer.x = role_x;if (First_Round[role_x + 1][player.y] == target)//如果box和target重叠,合为achieve{First_Round[role_x + 1][player.y] = achieve;achievementNum++;}elseFirst_Round[role_x + 1][player.y] = box;}}break;case('a')://左移role_y = player.y - 1;if (First_Round[player.x][role_y] == empty){if (First_Round[player.x][player.y] == role)First_Round[player.x][player.y] = empty;elseFirst_Round[player.x][player.y] = target;First_Round[player.x][role_y] = role;player.y = role_y;}else if (First_Round[player.x][role_y] == target){if (First_Round[player.x][player.y] == role)First_Round[player.x][player.y] = empty;elseFirst_Round[player.x][player.y] = target;First_Round[player.x][role_y] = role_target;player.y = role_y;}else if ((First_Round[player.x][role_y] == box || First_Round[player.x][role_y] == achieve)&& (First_Round[player.x][role_y-1] == empty || First_Round[player.x][role_y - 1] == target)){if (First_Round[player.x][role_y] == box){if (First_Round[player.x][player.y] == role)First_Round[player.x][player.y] = empty;elseFirst_Round[player.x][player.y] = target;First_Round[player.x][role_y] = role;player.y = role_y;}else if (First_Round[player.x][role_y] == achieve){achievementNum--;if (First_Round[player.x][player.y] == role)//此位置是玩家位置First_Round[player.x][player.y] = empty;//此位置变为空else if (First_Round[player.x][player.y] == role_target)First_Round[player.x][player.y] = target;First_Round[player.x][role_y] = role_target;}if (First_Round[player.x][role_y - 1] == target)//如果box和target重叠,合为achieve{First_Round[player.x][role_y - 1] = achieve;achievementNum++;}elseFirst_Round[player.x][role_y - 1] = box;}break;case('d')://右移role_y = player.y + 1;if (First_Round[player.x][role_y] == empty){if (First_Round[player.x][player.y] == role)First_Round[player.x][player.y] = empty;elseFirst_Round[player.x][player.y] = target;First_Round[player.x][role_y] = role;player.y = role_y;}else if (First_Round[player.x][role_y] == target){if (First_Round[player.x][player.y] == role)First_Round[player.x][player.y] = empty;elseFirst_Round[player.x][player.y] = target;First_Round[player.x][role_y] = role_target;player.y = role_y;}else if ((First_Round[player.x][role_y] == box || First_Round[player.x][role_y] == achieve)&& (First_Round[player.x][role_y + 1] == empty || First_Round[player.x][role_y + 1] == target)){if (First_Round[player.x][role_y] == box){if (First_Round[player.x][player.y] == role)First_Round[player.x][player.y] = empty;elseFirst_Round[player.x][player.y] = target;First_Round[player.x][role_y] = role;player.y = role_y;}else{achievementNum--;if (First_Round[player.x][player.y] == role)First_Round[player.x][player.y] = empty;elseFirst_Round[player.x][player.y] = target;First_Round[player.x][role_y] = role_target;player.y = role_y;}if (First_Round[player.x][role_y + 1] == target)//如果box和target重叠,合为achieve{First_Round[player.x][role_y + 1] = achieve;achievementNum++;}elseFirst_Round[player.x][role_y + 1] = box;}break;case('r'):Mode = 1;break;default:break;}}
}int main()
{Windows_Init();while (1){if (Mode == 0)Windows_Show();else{Windows_Init();Mode = 0; }Flash_Frame();};return 0;
}

代码整合

成果展示

代码优化方向

此程序代码过于冗长,并且进行了许多重复操作,并且功能不完善,注意到steps不是有效步数,achievementNum和score是等价的。

那么可以:模块化程序+定义重复操作的函数

可以利用转置矩阵+上移操作来替换switch中的大量代码,例如左移操作便是将原矩阵顺时针旋转90后进行上移操作,再转回去便成功完成左移操作。

更新后续用C语言实现推箱子小游戏基础程序plus_Cheat_陈十一的博客-CSDN博客

用C语言实现推箱子小游戏基础程序相关推荐

  1. 用C语言实现推箱子小游戏基础程序plus

    目录 设计一个简单的推箱子游戏 功能设计要求: 代码实现 数据定义头文件data_def.h 窗口设置头文件WindowsSet.h WindowsSet.cpp 上移函数 矩阵旋转函数 游戏帧 菜单 ...

  2. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  3. C语言实现推箱子小游戏

    一.设计目的 用简单的C语言知识制作的推箱子游戏,通过上下左右键将所有箱子移动到目标位置. 2.让我们更好地了解和巩固C语言知识,并实际运用,同时运用一些不太常见的知识点. 二.功能描述 1.模块功能 ...

  4. 控制台推箱子小游戏C语言

    自己开发的C语言控制台推箱子小游戏,基于二维数组实现,功能不多但是游戏整体较为完整,因为技术有限,所以代码暂未优化且整体显得较为臃肿,整体架构简单,代码全自主设计编写,仅作交流学习,还望大佬多多指点. ...

  5. PLC也能制作小游戏----Codesys编写推箱子小游戏

    1.序言 前文已介绍,Codesys编程软件拥有的各种编译方式,以及强大的可视化功能,完全可以实现类似的小游戏程序编写,让疲惫的工控人员在调机的空闲之余可以休闲下,本文编写另一个小游戏,也是十几年前的 ...

  6. 用 Dev-C++ 编写简单的推箱子小游戏

    用 Dev-C++ 编写简单的推箱子小游戏 前言 基础版 优化版 前言 以下是显示效果 B站视频讲解:[小游戏]用 Dev-C++ 编写简单的控制台推箱子小游戏 [小游戏]用 Dev-C++ 编写简单 ...

  7. 大一C语言课程设计之推箱子小游戏

    大一C语言课程设计之推箱子小游戏 先看一下效果 因为技术原因,开发说明没有加进去 按任意键以后 )] 同时响起来 你笑起来真好看的bgm 胜利界面会弹出一个弹出框 私信我或者加我qq:65245534 ...

  8. c 语言推箱子vs,C语言推箱子小游戏教程

    作者GitHub-Pages个人主页 本教程GitHub-Pages链接 本教程百度云下载地址 本教程编写于2016/11/22 Dawson Lee edited this page on Beij ...

  9. 简单的c语言推箱子程序,完整版本的推箱子小游戏,最简单的纯C语言打造

    /*推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 左 ...

  10. c#推箱子小游戏代码_推箱子小游戏V1.0制作

    小游戏实践 推箱子简易版 大家好,我是努力学习争取成为优秀的Game Producer的路人猿,今天来一起做一个推箱子的简易版本V1.0!下面跟我一起做吧~ 我们用到的软件如下: 编辑类 Visual ...

最新文章

  1. SQL Server 索引和表体系结构(聚集索引)
  2. 2021年春季学期-信号与系统-第五次作业参考答案-第四小题
  3. visual studio 不能创建biztalk 项目
  4. 连接器篇(二) 高频系列
  5. 使用matlab编译器生成EXE文件
  6. 【算法竞赛学习】气象海洋预测-Task4 模型建立之 TCNN+RNN
  7. 【招聘(北京)】.NETCORE开发工程师(微服务方向)
  8. 【转载】简直可爱极了的即时通讯
  9. opencv c语言教程,OpenCV图像处理视频教程——入门篇(一)
  10. centos7.5 安装配置supervisor管理python进程(也就是服务)
  11. PHP控制网页过期时间的代码!
  12. SSH远程管理、参数讲解、xshell使用、scp,sftp,ssh命令(ssh两种方式的密钥验证方...
  13. linux xampp图形界面,linux下安装xampp,XAMPP目录结构
  14. 双十一大战收官:荣耀反超苹果,以新思维新模式傲视群雄
  15. 234.回文链表(力扣leetcode) 博主可答疑该问题
  16. 正版破解软件下载站大全(转载
  17. 良葛格学习笔记输入输入一章中的PushbackInputStream的补充
  18. 蚁群算法讲解python
  19. 同步四进制加法计数器(JK)
  20. 《数值分析》李庆扬 03 曲线拟合的最小二乘法

热门文章

  1. java实用工具之XOM
  2. 奇点云数据中台技术汇(三)| DataSimba系列之计算引擎篇
  3. 模拟实现strlen
  4. CTF unserialize3
  5. Mysql,姓名按笔画排序
  6. python第六周拼图_python – 解决n-queen拼图
  7. 计算机英语口语面试自我介绍,面试英文口语自我介绍(精选8篇)
  8. MapReducer的map和reducer的几种写法模板以及自定义数据类型
  9. TX2081ALBJ3超低功耗半导体指纹识别模组 智能锁 指纹考勤打卡 指纹门禁系统应用
  10. YOLOX: Exceeding YOLO Series in 2021 论文阅读笔记