简介
最近在学习c语言时,看到其他文章中推箱子的小游戏。于是我突发奇想的制作出了一款纯c语言,WIndows平台下的小游戏。
演示
环境及源代码
程序是在WIndows x64 系统平台上使用gcc-12.2.0版本编译器所编译的。
main.c
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define ARRY_X_LENGTH 20 // 边框宽度
#define ARRY_Y_LENGTH 50 // 边框高度
// 刷新地图函数
int* loading(char (*loadingArry)[ARRY_Y_LENGTH]);
// 生成地图函数
void loadingMap(char (*loadingArry)[ARRY_Y_LENGTH]);
// 随机果实生成
void RandomFruitEvent(char (*loadingArry)[ARRY_Y_LENGTH]);
// 随机毒果实生成
void RandomPoisonousFruitEvent(char (*loadingArry)[ARRY_Y_LENGTH]);
// 移动事件
int moveEvent(char input, int *coordinate, char (*loadingArry)[ARRY_Y_LENGTH]);
// 游戏成功
void GameVictory(int fraction, int stepNumber, double duration);
// 主菜单
void menu();
int main()
{
// 地图二维数组,游戏中所有位置数据都存放在此
char loadingArry[ARRY_X_LENGTH][ARRY_Y_LENGTH] = {};
loadingMap(loadingArry); // 加载地图
menu(); // 主菜单
int fraction = 0; // 游戏积分
int stepNumber; // 步数
char input; // 获取用户输入
clock_t start_time = clock();
while (input != 'q')
{
int *coordinate;
coordinate = loading(loadingArry);
input = _getch();
system("cls");
// printf("(%d, %d)", coordinate[0], coordinate[1]);
fraction += moveEvent(input, coordinate, loadingArry);
printf("当前分数:%d\n", fraction);
if (fraction == 100 || fraction < 0)
{
break;
} else if ((fraction % 10) == 0 && fraction != 0) {
// 生成果实
for (int i = 0; i < 10; i++)
{
RandomFruitEvent(loadingArry);
}
// 生成一个毒果实
RandomPoisonousFruitEvent(loadingArry);
}
stepNumber++;
}
clock_t stop_time = clock();
system("cls");
// 游戏积分判断输赢
if (fraction < 0) {
printf("Game Over!\n");
return 0;
} else if (fraction >= 100) {
double duration = ((double)(stop_time-start_time))/CLK_TCK;
GameVictory(fraction, stepNumber, duration);
}
return 0;
}
// 随机生成果实'o',并写入二维数组中
void RandomFruitEvent(char (*loadingArry)[ARRY_Y_LENGTH])
{
int randomX = rand()%(ARRY_X_LENGTH - 2) + 1;
int randomY = rand()%(ARRY_Y_LENGTH - 2) + 1;
if (loadingArry[randomX][randomY] != '*')
{
loadingArry[randomX][randomY] = 'o';
} else {
RandomFruitEvent(loadingArry);
}
}
// 随机生成毒果实
void RandomPoisonousFruitEvent(char (*loadingArry)[ARRY_Y_LENGTH])
{
int randomX = rand()%(ARRY_X_LENGTH - 2) + 1;
int randomY = rand()%(ARRY_Y_LENGTH - 2) + 1;
if (loadingArry[randomX][randomY] != '*')
{
loadingArry[randomX][randomY] = '0';
} else {
RandomPoisonousFruitEvent(loadingArry);
}
}
// 刷新界面地图
int* loading(char (*loadingArry)[ARRY_Y_LENGTH])
{
static int coordinate[2];
for (int i = 0; i < ARRY_X_LENGTH; i++)
{
for (int j = 0; j < ARRY_Y_LENGTH; j++)
{
char Arrychar = loadingArry[i][j];
if (Arrychar == '*')
{
coordinate[0] = i;
coordinate[1] = j;
}
printf("%c", Arrychar);
}
printf("\n");
}
return coordinate;
}
// 加载地图
void loadingMap(char (*loadingArry)[ARRY_Y_LENGTH])
{
int randomX = rand()%(ARRY_X_LENGTH - 2) + 1;
int randomY = rand()%(ARRY_Y_LENGTH - 2) + 1;
for (int i = 0; i < ARRY_X_LENGTH; i++)
{
for (int j = 0; j < ARRY_Y_LENGTH; j++)
{
loadingArry[0][j] = '=';
loadingArry[ARRY_X_LENGTH-1][j] = '=';
if (i<ARRY_X_LENGTH-1 && i>0)
{
if (j == ARRY_Y_LENGTH-1 || j == 0)
{
loadingArry[i][j] = '|';
}
}
if (i>0 && i<ARRY_X_LENGTH-1)
{
if (j != ARRY_Y_LENGTH-1 || j == 1)
{
loadingArry[i][j] = ' ';
}
}
}
}
loadingArry[randomX][randomY] = '*';
// printf("* = (%d, %d)\n", randomX, randomY);
for (int i = 0; i < 100; i++)
{
RandomFruitEvent(loadingArry);
}
}
// 移动事件,其中包括:触发毒果实,普通果实
int moveEvent(char input, int *coordinate, char (*loadingArry)[ARRY_Y_LENGTH])
{
int fraction = 0;
switch (input)
{
case 'w':
if (loadingArry[coordinate[0]-1][coordinate[1]] != '=')
{
if (loadingArry[coordinate[0]-1][coordinate[1]] == 'o')
{
fraction++;
} else if (loadingArry[coordinate[0]-1][coordinate[1]] == '0') {
fraction -= 10;
}
loadingArry[coordinate[0]][coordinate[1]] = ' ';
coordinate[0]--;
}
break;
case 's':
if (loadingArry[coordinate[0]+1][coordinate[1]] != '=')
{
if (loadingArry[coordinate[0]+1][coordinate[1]] == 'o')
{
fraction++;
} else if (loadingArry[coordinate[0]+1][coordinate[1]] == '0') {
fraction -= 10;
}
loadingArry[coordinate[0]][coordinate[1]] = ' ';
coordinate[0]++;
}
break;
case 'a':
if (loadingArry[coordinate[0]][coordinate[1]-1] != '|')
{
if (loadingArry[coordinate[0]][coordinate[1]-1] == 'o')
{
fraction++;
} else if (loadingArry[coordinate[0]][coordinate[1]-1] == '0') {
fraction -= 10;
}
loadingArry[coordinate[0]][coordinate[1]] = ' ';
coordinate[1]--;
}
break;
case 'd':
if (loadingArry[coordinate[0]][coordinate[1]+1] != '|')
{
if (loadingArry[coordinate[0]][coordinate[1]+1] == 'o')
{
fraction++;
} else if (loadingArry[coordinate[0]-1][coordinate[1]+1] == '0') {
fraction -= 10;
}
loadingArry[coordinate[0]][coordinate[1]] = ' ';
coordinate[1]++;
}
break;
}
loadingArry[coordinate[0]][coordinate[1]] = '*';
return fraction;
}
void GameVictory(int fraction, int stepNumber, double duration)
{
printf("Congratulations! Game Victory! | ");
printf("恭喜你!游戏胜利!\n");
printf("分数:%d\n", fraction);
printf("总步数:%d\n", stepNumber);
printf("挑战时长:%lf\n", duration);
}
void menu()
{
printf("启动游戏中...\n提示:按 q 键可以直接退出游戏。\n\n");
printf("操作:上(w) 下(s) 左(a) 右(d)\n");
printf("o:果子 0:毒果子\n");
printf("吃到毒果子会扣其积分:10\n");
printf("=================================\n");
}
这就是全部内容了,有问题可以来我的群找我:706128290