C语言小游戏 源码 推箱子
Posted 流星蝴蝶没有剑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言小游戏 源码 推箱子相关的知识,希望对你有一定的参考价值。
C语言小游戏 - 推箱子
其他窗口操作:汉字对应的ASCLL
引入窗口控制头文件
windwos.h
定义游戏中所有实物
" ", "■", "", "☆", "□", "▲", "", "★", "▲";
将游戏中所有的实物赋予不同的颜色
0, FOREGROUND_RED, -1, FOREGROUND_GREEN, FOREGROUND_GREEN, FOREGROUND_GREEN, -1, BACKGROUND_GREEN, FOREGROUND_GREEN
// 输出终端字符的颜色
void Color (int m)
HANDLE consolehwnd;/*创建句柄*/
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);/*实例化句柄*/
SetConsoleTextAttribute(consolehwnd, m);
将文件中的数据地图存储到数组中
while(!feof(fp))
fscanf(fp,"%d",&map[mapRow][mapCol++]);
if(mapCol%LIE==0)
mapRow++;
mapCol=0;
在地图中绘制各种实物
case 0: // 空
case 1: // 墙
case 3: // 目的地
case 4: // 箱子
case 5: // 人
case 7: // 箱子+目的地
case 8: //人+目的地
Color(mapBrickColor[now]); // 设置颜色
printf(mapBrickChar[now]); // 输出字符
break;
选择关卡
case 1:
case 2:
case 3:
case 4:
case 5:
case 6: // 关卡选择
char s[30] = "";
sprintf(s, path, k);
if((fp=fopen(s,"rt"))==NULL)
return 2;
以上均为废话,为了凑字数
代码中有注释
推箱子源码
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
// C99或C11模式【所以文件后缀.c改为.cpp】
#define f(i, a, b) for(int (i)=(a);(i)<(b);(i)++)
//地图为10列对应txt文本中的内容:墙为1 空地为0 箱子为4 人为5 目的地为3
#define LIE 10
// 定义一些地图中的符号:空位置、墙、目的地、箱子、人 、箱子+目的地、人+目的地
const char mapBrickChar[][5] = " ", "■", "", "☆", "□", "▲", "", "★", "▲";
// 每个字符对应的颜色颜色点进去看
const int mapBrickColor[] = 0, FOREGROUND_RED, -1, FOREGROUND_GREEN, FOREGROUND_GREEN, FOREGROUND_GREEN, -1, BACKGROUND_GREEN, FOREGROUND_GREEN;
int map[20][LIE]; // 存地图
char path[30] = "./关卡%d.txt"; // 关卡路径
int k; // 保存关卡
int mapRow=0; // 地图的长度
int mapCol=0; // 遍历地图时作为索引使用,无使用价值
// 人的坐标
int ROW, COL;
// 输出终端字符的颜色
void Color (int m)
HANDLE consolehwnd;/*创建句柄*/
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);/*实例化句柄*/
SetConsoleTextAttribute(consolehwnd, m);
int createmap() // 读取并保存地图
scanf("%d",&k);
FILE *fp;
switch (k)
case 0: // 输入0退出
return 1;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6: // 关卡选择
char s[30] = "";
sprintf(s, path, k);
if((fp=fopen(s,"rt"))==NULL)
return 2;
break;
mapRow = mapCol = 0;
while(!feof(fp))
fscanf(fp,"%d",&map[mapRow][mapCol++]);
if(mapCol%LIE==0)
mapRow++;
mapCol=0;
if(fclose(fp)) return 2;
return 0;
// 绘制地图
void DrawMap()
system("cls");
printf("方向键控制上下左右,r重新游戏,t退出游戏\\n");
f(i, 0,mapRow)
f (j, 0, LIE)
int now = map[i][j]; // 当前位置代号
switch (now)
case 0: // 空
case 1: // 墙
case 3: // 目的地
case 4: // 箱子
case 5: // 人
case 7: // 箱子+目的地
case 8: //人+目的地
Color(mapBrickColor[now]); // 设置颜色
printf(mapBrickChar[now]); // 输出字符
break;
printf("\\n");
//获取到当前人的下标 时刻都能够确定人的下标
void getPersonPosition()
int row, col; //人的行和列
f(i, 0, mapRow) //控制变量 0-6
f(j, 0, LIE) //控制变量 0-9
if (map[i][j] == 5||map[i][j] == 8)
row = i; //i 0-6
col = j; //j 0-9
if(ROW!=row||COL!=col)
Color(15);
printf("(%d,%d)\\n", row, col);
ROW = row;
COL = col;
// 修改地图数据
int PlayGame()
int flag=0; // 标记人是否移动过
getPersonPosition();
char input; //定义一个字符变量
input = getch(); //变量接受键盘的输入
switch (input)
case 72: //上
if (map[ROW - 1][COL] == 0||map[ROW-1][COL]==3) //如果人的前面是空地或者目的地
map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8
map[ROW - 1][COL] += 5;
flag=-1;
else if (map[ROW - 1][COL] == 4 || map[ROW - 1][COL] == 7) //人的前面是箱子
if (map[ROW - 2][COL] == 0 || map[ROW - 2][COL] == 3) //箱子的前面是空地
map[ROW - 2][COL] += 4;
map[ROW - 1][COL] += (5-4);
map[ROW][COL] -= 5;
flag=-1;
break;
case 80: //下
if (map[ROW + 1][COL] == 0 || map[ROW + 1][COL] == 3) //如果人的前面是空地或者目的地
map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8
map[ROW + 1][COL] += 5;
flag=-2;
else if (map[ROW + 1][COL] == 4 || map[ROW + 1][COL] == 7) //人的前面是箱子
if (map[ROW + 2][COL] == 0 || map[ROW + 2][COL] == 3) //箱子的前面是空地
map[ROW + 2][COL] += 4;
map[ROW + 1][COL] += 1;
map[ROW][COL] -= 5;
flag=-2;
break;
case 75: //左
if (map[ROW][COL - 1] == 0 || map[ROW][COL - 1] == 3) //如果人的前面是空地或者目的地
map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8
map[ROW][COL - 1] += 5;
flag=-3;
else if (map[ROW][COL - 1] == 4 || map[ROW][COL - 1] == 7) //人的前面是箱子
if (map[ROW][COL - 2] == 0 || map[ROW][COL - 2] == 3) //箱子的前面是空地
map[ROW][COL - 2] += 4;
map[ROW][COL - 1] += 1;
map[ROW][COL] -= 5;
flag=-3;
break;
case 77: //右
if (map[ROW][COL + 1] == 0 || map[ROW][COL + 1] == 3) //如果人的前面是空地或者目的地
map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8
map[ROW][COL + 1] += 5;
flag=-4;
else if (map[ROW][COL + 1] == 4 || map[ROW][COL + 1] == 7) //人的前面是箱子
if (map[ROW][COL + 2] == 0 || map[ROW][COL + 2] == 3) //箱子的前面是空地
map[ROW][COL + 2] += 4;
map[ROW][COL + 1] += 1;
map[ROW][COL] -= 5;
flag=-4;
break;
case 'r': // 重新开始
mapRow=0;
mapCol=0;
ROW=0;
COL=0;
flag=-10;
createmap();
break;
case 't': // 退出游戏
return 1;
break;
return flag;
// 判断是否成功
int success()
f(i, 0, mapRow)
f(j, 0, LIE)
if (map[i][j]==3) // 是否还有目的地没变成箱子
return 0;
return 1;
int main()
// 屁:脚本打开网页
ShellExecute(NULL,"open","https://blog.csdn.net/qq_44009311",NULL,NULL,SW_SHOWNORMAL);
while(1)
printf("请选择关卡\\n");
printf("退出'0':Logout\\n");
printf("关卡'1':非常简单\\n");
printf("关卡'2':简单\\n");
printf("关卡'3':常规\\n");
printf("关卡'4':困哪\\n");
printf("关卡'5':较难\\n");
printf("关卡'6':非常困难\\n");
// 读取并保存地图数据
int t = createmap();
if(t != 0) return 0; //0正常、 返回1:输入0退出、返回2:文件打开失败
DrawMap();
while (1)
// 修改地图
int tp = PlayGame();
if(tp > 0) // 退出游戏
Color(10);
printf("退出!\\n");
break;
else if(tp==0)
else
if(success()) // 成功
Color(10);
printf("成功!\\n");
system("pause");
break;
DrawMap();
system("cls");
return 0;
关卡1.txt
0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 3 1 0 0 0
1 1 1 1 1 4 1 1 1 1
1 3 0 0 4 5 4 0 3 1
1 1 1 1 1 4 1 1 1 1
0 0 0 0 1 3 1 0 0 0
0 0 0 0 1 1 1 0 0 0
关卡2.txt
0 1 1 1 1 1 1 1 0 0
0 1 3 3 3 3 0 1 0 0
1 1 1 3 3 3 4 1 1 1
1 0 0 4 1 4 0 4 0 1
1 0 4 4 0 0 1 4 0 1
1 0 0 0 5 1 0 0 0 1
1 1 1 1 0 0 0 1 1 1
0 0 0 1 1 1 1 1 0 0
关卡3.txt
0 0 1 1 1 1 1 1 0 0
1 1 1 0 0 0 1 1 1 1
1 0 0 0 4 0 4 0 0 1
1 0 4 0 0 0 4 5 0 1
1 1 1 4 4 1 1 1 1 1
0 0 1 0 0 3 3 1 0 0
0 0 1 3 3 3 3 1 0 0
0 0 1 1 1 1 1 1 0 0
关卡4.txt
1 1 1 1 1 1 1 1 1 0
1 0 0 0 1 1 0 0 1 0
1 0 1 0 4 0 4 0 1 0
1 0 0 7 3 1 0 0 1 0
1 1 0 1 3 0 3 1 1 0
1 1 4 1 1 1 5 1 1 1
1 0 0 0 0 0 4 0 0 1
1 0 0 0 1 1 0 1 0 1
1 1 1 1 1 1 0 0 0 1
0 0 0 0 0 1 1 1 1 1
关卡5.txt
0 0 0 0 0 1 1 1 1 1
0 1 1 1 1 1 0 0 0 1
0 1 0 3 3 0 4 1 0 1
0 1 0 1 3 7 0 0 0 1
1 1 0 7 3 1 0 5 1 1
1 0 4 0 0 4 4 0 1 0
1 0 0 0 1 1 0 0 1 0
1 1 1 1 1 1 1 1 1 0
关卡6.txt
0 1 1 1 1 0 0 0 0 0
0 1 0 0 1 1 1 1 1 0
1 1 4 0 1 1 0 0 1 0
1 0 0 4 5 4 0 0 1 0
1 0 0 0 1 1 4 0 1 0
1 1 1 3 1 1 0 1 1 1
0 1 3 3 3 4 0 4 0 1
0 1 1 3 3 0 0 0 0 1
0 0 1 1 1 1 1 1 1 1
以上是关于C语言小游戏 源码 推箱子的主要内容,如果未能解决你的问题,请参考以下文章