用 Dev-C++ 编写简单的推箱子小游戏
程序员文章站
2024-03-19 17:00:10
...
前言
以下是显示效果
B站视频讲解:【小游戏】用 Dev-C++ 编写简单的控制台推箱子小游戏
【小游戏】用 Dev-C++ 编写简单的控制台推箱子小游戏
基础版
我们用 #
代表墙
用 空格 代表空地
用 S
代表玩家
用 O
代表箱子
用 *
代表目标位置
地图存储:a[x][y]
以下是代码:
#include <cstdio>
#include <windows.h>
#include <conio.h>
//7*10
char a[20][20]={"##########",
"## ###",
"##O### #",
"# S O O #",
"# **# O ##",
"##**# ##",
"##########"};
void Hide()
{
HANDLE hOut;
CONSOLE_CURSOR_INFO curInfo;
hOut=GetStdHandle(STD_OUTPUT_HANDLE);
curInfo.dwSize=1;
curInfo.bVisible=0;
SetConsoleCursorInfo(hOut,&curInfo);
}
void Welcome()
{
printf("\n\n 推 箱 子");
printf("\n\n 请按任意键开始");
getch();
system("cls");
}
void Set()
{
HANDLE hOut;
COORD pos={0,0};
hOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
}
int main()
{
Hide();
Welcome();
int x=3,y=2;
char ch;
int cnt=0;
for(int i=0;i<=6;i++)
puts(a[i]);
while(1)
{
ch=getch();
if(ch=='s')
{
if(a[x+1][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='S';
}
else if(a[x+1][y]=='O')
{
if(a[x+2][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='S';
a[x+1][y]='O';
}
else if(a[x+2][y]=='*')
{
a[x][y]=' ';
x++;
a[x][y]='S';
a[x+1][y]=' ';
cnt++;
}
}
}
else if(ch=='w')
{
if(a[x-1][y]==' ')
{
a[x][y]=' ';
x--;
a[x][y]='S';
}
else if(a[x-1][y]=='O')
{
if(a[x-2][y]==' ')
{
a[x][y]=' ';
x--;
a[x][y]='S';
a[x-1][y]='O';
}
else if(a[x-2][y]=='*')
{
a[x][y]=' ';
x--;
a[x][y]='S';
a[x-1][y]=' ';
cnt++;
}
}
}
else if(ch=='a')
{
if(a[x][y-1]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='S';
}
else if(a[x][y-1]=='O')
{
if(a[x][y-2]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='S';
a[x][y-1]='O';
}
else if(a[x-2][y]=='*')
{
a[x][y]=' ';
y--;
a[x][y]='S';
a[y-1][y]=' ';
cnt++;
}
}
}
else if(ch=='d')
{
if(a[x][y+1]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='S';
}
else if(a[x][y+1]=='O')
{
if(a[x][y+2]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='S';
a[x][y+1]='O';
}
else if(a[x][y+2]=='*')
{
a[x][y]=' ';
y++;
a[x][y]='S';
a[x][y+1]=' ';
cnt++;
}
}
}
Set();
for(int i=0;i<=6;i++)
puts(a[i]);
if(cnt==4)
break;
}
printf("你赢了!");
Sleep(10000);
return 0;
}
优化版
设置控制台文字和背景的颜色
system("color 0f");
设置默认的控制台前景和背景颜色。
COLOR [attr]
attr 指定控制台输出的颜色属性。
颜色属性由两个十六进制数字指定 -- 第一个
对应于背景,第二个对应于前景。每个数字
可以为以下任何值:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
如果没有给定任何参数,此命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台
窗口、/T 命令行开关或 DefaultColor 注册表
值。
如果尝试使用相同的
前景和背景颜色来执行
COLOR 命令,COLOR 命令会将 ERRORLEVEL 设置为 1。
示例: "COLOR fc" 在亮白色上产生淡红色
以下有些函数的使用方法可以看看其他人的博客
完整代码:
#include <cstdio>
#include <windows.h>
#include <conio.h>
char a[20][20]={"##########",
"## ###",
"##O### #",
"# S O O #",
"# **# O ##",
"##**# ##",
"##########"};
void Prepare()
{
////// 设置颜色 //////
system("color f0");
////// 隐藏光标 //////
HANDLE hOut;
CONSOLE_CURSOR_INFO curInfo;
hOut=GetStdHandle(STD_OUTPUT_HANDLE);
curInfo.dwSize=1;
curInfo.bVisible=0;
SetConsoleCursorInfo(hOut,&curInfo);
////// 设置标题 //////
SetConsoleTitle("推箱子");
}
void Welcome()
{
printf("\n\n 推 箱 子");
printf("\n\n 请按任意键开始");
getch();
system("cls");
}
void Set()
{
HANDLE hOut;
COORD pos={0,0};
hOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
}
int main()
{
Prepare();
Welcome();
int x=3,y=2;
char ch;
int cnt=0;
for(int i=0;i<=6;i++)
puts(a[i]);
while(1)
{
ch=getch();
if(ch==-32)
{
ch=getch();
if(ch==80)
{
if(a[x+1][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='S';
}
else if(a[x+1][y]=='O')
{
if(a[x+2][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='S';
a[x+1][y]='O';
}
else if(a[x+2][y]=='*')
{
a[x][y]=' ';
x++;
a[x][y]='S';
a[x+1][y]=' ';
cnt++;
}
}
}
else if(ch==72)
{
if(a[x-1][y]==' ')
{
a[x][y]=' ';
x--;
a[x][y]='S';
}
else if(a[x-1][y]=='O')
{
if(a[x-2][y]==' ')
{
a[x][y]=' ';
x--;
a[x][y]='S';
a[x-1][y]='O';
}
else if(a[x-2][y]=='*')
{
a[x][y]=' ';
x--;
a[x][y]='S';
a[x-1][y]=' ';
cnt++;
}
}
}
else if(ch==75)
{
if(a[x][y-1]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='S';
}
else if(a[x][y-1]=='O')
{
if(a[x][y-2]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='S';
a[x][y-1]='O';
}
else if(a[x][y-2]=='*')
{
a[x][y]=' ';
y--;
a[x][y]='S';
a[x][y-1]=' ';
cnt++;
}
}
}
else if(ch==77)
{
if(a[x][y+1]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='S';
}
else if(a[x][y+1]=='O')
{
if(a[x][y+2]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='S';
a[x][y+1]='O';
}
else if(a[x][y+2]=='*')
{
a[x][y]=' ';
y++;
a[x][y]='S';
a[x][y+1]=' ';
cnt++;
}
}
}
}
Set();
for(int i=0;i<=6;i++)
puts(a[i]);
if(cnt==4)
break;
}
printf("你赢了!");
Sleep(10000);
return 0;
}