C语言经典小游戏之----推箱子

简介: C语言经典小游戏之----推箱子

  在进行推箱子的实验中,可以使用对应的API函数来改变对应箱子的颜色,也需要根据,人在移动的过程中,可以通过方向键,并改变对应的颜色,从而实现控制人物的目的。


      代码实现如下:

1.#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<conio.h>
int x = 0, y = 0;
//存储当前使用的地图
int map[10][10] = { 0 };
//地图 1
int map_1[10][10] = {
  { 0,0,1,1,1,0,0,0 },
{ 0,0,1,4,1,0,0,0 },
{ 0,0,1,0,1,1,1,1 },
{ 1,1,1,0,0,2,4,1 },
{ 1,4,2,2,0,1,1,1 },
{ 1,1,1,3,2,1,0,0 },
{ 0,0,0,1,4,1,0,0 },
{ 0,0,0,1,1,1,0,0 }
};
//地图 2
int map_2[10][10] = {
  { 0,0,0,1,1,1,1,1,1,1 },
{ 0,0,1,1,0,0,1,0,3,1 },
{ 0,0,1,0,0,0,1,0,0,1 },
{ 0,0,1,2,0,2,0,2,0,1 },
{ 0,0,1,0,2,1,1,0,0,1 },
{ 1,1,1,0,2,0,1,0,1,1 },
{ 1,4,4,4,4,4,0,0,1,0 },
{ 1,1,1,1,1,1,1,1,1,0 },
};
//判断游戏是否挑战成功
int finish();
//控制小人移动
void move(int x1, int y1, int x2, int y2);
//根据二维数组,渲染地图
int render();
//查找小人所在的当前位置
void find();
//根据用户输入,确定用户选择哪张地图
void setmap(int n);
//设置文本显示时的颜色
void color(int m);
int main() {
  int n;
  char dir;
  char c;
  printf("**************推箱子游戏欢迎您***************\n"
    "*                                           *\n"
    "*         -----------------------           *\n"
    "*   |    Powered By c.biancheng.net    |    *\n"
    "*         -----------------------           *\n"
    "*                                           *\n"
    "*             ♀:自己的位置                 *\n"
    "*             ☆:箱子要到的的位置           *\n"
    "*             ■:箱子的位置                 *\n"
    "*                                           *\n"
    "*         |       游戏规则       |          *\n"
    "*                                           *\n"
    "*          控制♀将■推到☆的位置           *\n"
    "*          按 wasd 控制♀的移动             *\n"
    "*          按   r  重新开始游戏             *\n"
    "*          按   q      退出游戏             *\n"
    "*********************************************\n");
  color(0xA);
  printf("请选择关卡:(1/2)(0:退出游戏):");
  while (scanf("%d", &n)) {
    getchar();
    //n==0,游戏退出
    if (n == 0) {
      printf("game over\n");
      break;
    }
    system("cls");//清空命令行窗口中显示的所有信息
    if (n == 1 || n == 2) {
      setmap(n);//根据 n 的值,设置当前地图
      render();//根据所选地图,在命令行窗口中将其渲染出来
           //游戏开始,用户输入字符w/a/s/d,控制小人移动
      while ((dir = getch()) != EOF) {
        system("cls");//移动之前,删除原有命令行中的地图
        find();//移动之前,需找到当前小人所在的位置
             //根据 dir 字符的值,控制小人的移动,以及设置重新开始和退出选项的操作
        switch (dir) {
        case 'w':move(x - 1, y, x - 2, y); break;
        case 's':move(x + 1, y, x + 2, y); break;
        case 'a':move(x, y - 1, x, y - 2); break;
        case 'd':move(x, y + 1, x, y + 2); break;
        case 'r':setmap(n); break;
        case 'q':return 0;
        }
        //重新渲染人移动后的场景
        render();
        //每次移动,判断是否挑战成功
        if (finish()) {
          printf("游戏胜利,请重新选择关卡(1/2)(0:退出游戏):");
          break;
        }
      }
    }
    else {
      printf("输入有误,请重新输入\n");
      printf("请选择关卡:(1/2)(0:退出游戏):");
    }
  }
  system("pause");
  return 0;
}
// 按w的时候的输出结果
void move(int x1, int y1, int x2, int y2) {
  if (map[x][y] == 3) //找到自己的位置
  {
    //人前边是箱子,箱子在空格上
    if (map[x1][y1] == 2) {
      //箱子前边是空格
      if (map[x2][y2] == 0) {
        map[x][y] = 0;
        map[x1][y1] = 3;
        map[x2][y2] = 2;
      }
      //箱子前边是位置
      if (map[x2][y2] == 4) {
        map[x][y] = 0;
        map[x1][y1] = 3;
        map[x2][y2] = 5;
      }
    }
    //人前是箱子,箱子在位置上
    if (map[x1][y1] == 5) {
      //箱子前边是空格
      if (map[x2][y2] == 0) {
        map[x][y] = 0;
        map[x1][y1] = 6;
        map[x2][y2] = 2;
      }
      //箱子前边是位置
      if (map[x2][y2] == 4) {
        map[x][y] = 0;
        map[x1][y1] = 6;
        map[x2][y2] = 5;
      }
    }
    //人前为空格
    if (map[x1][y1] == 0) {
      map[x1][y1] = 3;
      map[x][y] = 0;
    }
    if (map[x1][y1] == 4) {
      map[x][y] = 0;
      map[x1][y1] = 6;
    }
  }
  if (map[x][y] == 6) //人在位置上
  {
    //位置前是箱子,箱子在空格上
    if (map[x1][y1] == 2) {
      //箱子前是空格
      if (map[x2][y2] == 0) {
        map[x][y] = 4;
        map[x1][y1] = 3;
        map[x2][y2] = 2;
      }
      //箱子前是位置
      if (map[x2][y2] == 4) {
        map[x][y] = 4;
        map[x1][y1] = 3;
        map[x2][y2] = 5;
      }
    }
    //位置前是箱子,箱子在位置上
    if (map[x1][y1] == 5) {
      //箱子前是空格
      if (map[x2][y2] == 0) {
        map[x][y] = 4;
        map[x1][y1] = 6;
        map[x2][y2] = 2;
      }
      //箱子前是位置
      if (map[x2][y2] == 4) {
        map[x][y] = 4;
        map[x1][y1] = 6;
        map[x2][y2] = 5;
      }
    }
    //人前面是位置
    if (map[x1][y1] == 4) {
      map[x][y] = 4;
      map[x1][y1] = 6;
    }
    //人前面是空格
    if (map[x1][y1] == 0) {
      map[x][y] = 4;
      map[x1][y1] = 3;
    }
  }
}
void find() {
  for (x = 0; x < 10; x++) {
    for (y = 0; y < 10; y++) {
      if (map[x][y] == 3 || map[x][y] == 6) {
        return;
      }
    }
  }
}
int render() {
  for (x = 0; x<10; x++) {
    for (y = 0; y<10; y++) {
      if (map[x][y] == 1) {
        color(8);
        printf("■"); //输出砖块的样子
      }
      if (map[x][y] == 3) {
        color(3);
        printf("♀"); //输出自己的位置
      }
      if (map[x][y] == 2) {
        color(4);
        printf("■"); //输出箱子
      }
      if (map[x][y] == 4) {
        color(0xE);
        printf("☆"); //输出箱子要到的位置
      }
      if (map[x][y] == 0) {
        color(0xF);
        printf("  "); //输出空白
      }
      if (map[x][y] == 5) {
        color(6);
        printf("★"); //箱子到达目标位置后的图标
      }
      if (map[x][y] == 6) {
        color(3);
        printf("♀");//人达到星星处,要由☆改为♀
      }
    }
    printf("\n");
  }
  return 0;
}
void setmap(int n) {
  if (n == 1) {
    memcpy(map, map_1, sizeof(map_1));
  }
  if (n == 2) {
    memcpy(map, map_2, sizeof(map_2));
  }
}
int finish()
{
  for (x = 0; x < 10; x++) {
    for (y = 0; y < 10; y++) {
      if (map[x][y] == 2)
        return 0;
    }
  }
  return 1;
}
void color(int m) {
  HANDLE consolehend;
  consolehend = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(consolehend, m);
}

对应的实验现象如下:

94b96d4c17374c4bbd02237a97f50834.png

总结:在编写C语言代码的过程中,理解对应API函数的真正使用方法,加深对函数的理解。

目录
相关文章
|
27天前
|
C语言 C++
【C语言】编写“猜数字“小游戏
【C语言】编写“猜数字“小游戏
|
2月前
|
定位技术 API C语言
C语言——实现贪吃蛇小游戏
本文介绍了一个基于Windows控制台的贪吃蛇游戏的实现方法。首先,需调整控制台界面以便更好地显示游戏。接着,文章详细描述了如何使用Win32 API函数如`COORD`、`GetStdHandle`、`GetConsoleCursorInfo`等来控制控制台的光标和窗口属性。此外,还介绍了如何利用`GetAsyncKeyState`函数实现键盘监听功能。文中还涉及了`&lt;locale.h&gt;`库的使用,以支持本地化字符显示。
54 1
C语言——实现贪吃蛇小游戏
|
2月前
|
存储 安全 算法
C 语言——实现扫雷小游戏
本文介绍了使用二维数组创建棋盘并实现扫雷游戏的方法。首先,通过初始化数组创建一个9x9的棋盘,并添加行列标识以便操作。接着,利用随机数在棋盘上布置雷。最后,通过判断玩家输入的坐标来实现扫雷功能,包括显示雷的数量和处理游戏胜利或失败的情况。文中提供了完整的代码实现。
42 1
C 语言——实现扫雷小游戏
|
1月前
|
C语言 定位技术 API
【C语言】实践:贪吃蛇小游戏(附源码)(二)
【C语言】实践:贪吃蛇小游戏(附源码)
【C语言】实践:贪吃蛇小游戏(附源码)(二)
|
1月前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
1月前
|
C语言
【C语言】实践:贪吃蛇小游戏(附源码)(三)
【C语言】实践:贪吃蛇小游戏(附源码)
|
1月前
|
存储 API C语言
【C语言】实践:贪吃蛇小游戏(附源码)(一)
【C语言】实践:贪吃蛇小游戏(附源码)
|
1月前
|
C语言
C语言贪吃蛇小游戏来啦!
C语言贪吃蛇小游戏来啦!
28 0
|
4月前
|
存储 编译器 C语言
|
4月前
|
存储 C语言
【C语言】猜数字小游戏
C语言实现猜数字小游戏
43 2
【C语言】猜数字小游戏