黑马程序员技术交流社区
标题:
C语言编写农场主捉鸡游戏
[打印本页]
作者:
984326157
时间:
2015-7-14 01:07
标题:
C语言编写农场主捉鸡游戏
本帖最后由 984326157 于 2015-7-14 01:06 编辑
根据《算法谜题》一书中的捉鸡一题,改编成游戏并使用C语言编程实现,如下:
农场主捉鸡游戏玩法介绍: # # # # # # # #
# # # # # C # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
F # # # # # # #
1)场地是8X8的,农场主初始位置在最左下角(F),鸡的位置在场地上的位置随机分配(C)
2)游戏开始后,玩家选择农场主先走还是鸡先走,玩家代表农场主去捉鸡,鸡自动移动;农场主和鸡交替走,农场主和鸡都可以移动到上下左右方向上邻近的一步,不能走对角,当农场主移动到鸡所在的位置,或者鸡自投罗网跑到农场主的位置时,农场主赢,游戏结束
3)如果选择正确的话(即选择农场主先走还是鸡先走),农场主最多14步可捉到鸡,如果14步还捉不到,宣布游戏失败!
4)W、S、A、D控制农场主(F)的上、下、左、右移动
辛苦了半天,终于把游戏完成,自己试玩了一下,还可以。本游戏如果选择错误(即鸡先走或人先走),游戏很可能会失败的哦,请大家讨论如何选择鸡先走还是人先走能百分之百捉住鸡?
代码:
[hide=d365]
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
//定义变量
int count = 14;//倒计时,14步,14步贷不到鸡游戏失败
int famerX,famerY,//记录农场主的位置
cockX,cockY;//记录公鸡的位置
char fORc;//记录谁先走,'F'农场主先走,‘C’公鸡先走
/**
* 打印地图功能
*
* @param map 地图数组
*/
void printMap(char map[8][8]){
for (int i=0; i<8; i++) {
for (int j = 0; j<8; j++) {
printf(" %c",map[i][j]);
}
printf("\n");
}
printf("\n");
}
/**
初始化地图
*/
void initMap(char map[8][8]){
//1)使用#填充地图
for (int i=0; i<8; i++) {
for (int j = 0; j<8; j++) {
map[i][j] = '#';
}
}
//2)初始化农场主位置左下角(7,0)
famerX = 7,famerY = 0;
//放入农场主
map[famerX][famerY] = 'F';
//3)随机初始化鸡的位置,鸡的位置不能和农场主的位置重合
srand((unsigned)time(NULL));//用时间做种,每次产生随机数不一样
//产生随机数
cockX = rand()%8;
cockY = rand()%8;
while (cockX == famerX && cockY == famerY) {
//如果公鸡和农场主的位置重合则重新分配公鸡的位置
cockX = rand()%8;
cockY = rand()%8;
}
map[cockX][cockY] = 'C';
}
int fEc(){
if (famerX == cockX && famerY == cockY) {
return 1;
}
return 0;
}
/**
* 移动函数
*
* @param map 盘面数组
* @param direction 移动方向
* @param x 当前X坐标
* @param y 当前Y坐标
*/
void Move(char map[8][8],char direction,int *x,int *y)
{
char temp;
switch (direction) {
case 'a':
case 'A':
//向左移动一格,y值减一
if (*y>0) {
temp = map[*x][*y];
map[*x][*y] = map[*x][*y-1];
map[*x][*y-1] = temp;
(*y)--;
if (fEc()) {
map[*x][*y] = 'X';
map[*x][*y+1] = '#';
}
}
break;
case 'd':
case 'D':
//向右移动一格,y值加一
if (*y<7) {
temp = map[*x][*y];
map[*x][*y] = map[*x][*y+1];
map[*x][*y+1] = temp;
(*y)++;
if (fEc()) {
map[*x][*y] = 'X';
map[*x][*y-1] = '#';
}
}
break;
case 'w':
case 'W':
//向上移动一格,x值减一
if (*x>0) {
temp = map[*x][*y];
map[*x][*y] = map[*x-1][*y];
map[*x-1][*y] = temp;
(*x)--;
if (fEc()) {
map[*x][*y] = 'X';
map[*x+1][*y] = '#';
}
}
break;
case 's':
case 'S':
//向下移动一格,x值加一
if (*x<7) {
temp = map[*x][*y];
map[*x][*y] = map[*x+1][*y];
map[*x+1][*y] = temp;
(*x)++;
if (fEc()) {
map[*x][*y] = 'X';
map[*x-1][*y] = '#';
}
}
break;
default:
break;
}
}
/**
* 公鸡自动移动
*
* @param map 地图
*/
void cockMove(char map[8][8]){
srand((unsigned)time(NULL));//用时间做种,每次产生随机数不一样
//产生随机数
int suiji = rand()%4;
// printf("%d",suiji);
switch (suiji) {
case 0:
Move(map, 'w',&cockX,&cockY);
break;
case 1:
Move(map, 's',&cockX,&cockY);
break;
case 2:
Move(map, 'a',&cockX,&cockY);
break;
case 3:
Move(map, 'd',&cockX,&cockY);
break;
default:
break;
}
}
/**
* 判断是否赢了,以及用户输入提醒
*/
int isOK(char map[8][8]){
if (fEc()) {//赢了
printMap(map);
printf("你走了%d步捉住了公鸡,你赢了!\n",14-count);
return 1;
}else{
return 0;
}
}
/**
* 农场主移动
*
* @param map 地图
*/
void famerMove(char map[8][8]){
char move = getc(stdin);
while (1) {
if (move == 'w' || move == 'W' ||
move == 's' || move == 'S' ||
move == 'a' || move == 'A' ||
move == 'd' || move == 'D' ) {
Move(map, move, &famerX, &famerY);
count --;
break;
}else{
move = getc(stdin);
}
}
}
int main(int argc, const char * argv[]) {
char map[8][8];//定义数组存放地图
//初始化地图
initMap(map);
printMap(map);
//打印控制游戏选择提示
printf("请选择:‘F’代表农场主先走还是‘C’代表公鸡先走?\n");
fORc=getc(stdin);
while (1) {
if (fORc == 'f' ||
fORc == 'F' ||
fORc == 'c' ||
fORc == 'C') {
if (fORc == 'f' || fORc == 'F') {
printf("你选择了农场主先走,游戏开始!\n");
}else{
printf("你选择了公鸡先走,游戏开始!\n\n");
}
break;
}else{
printf("输入不合法,游戏推出,请重新运行!\n");
return 0;
}
}
//创建游戏循环
while (1) {
if (fORc =='C' || fORc == 'c') {
//公鸡自动移动
cockMove(map);
if (isOK(map)) {
printf("公鸡自投罗网!\n");
return 0;
}
//打印地图
printf("公鸡已走完:\n");
printMap(map);
fORc = 'f';
//判断是否胜利
//打印用户控制提示
}else if(fORc == 'f'||fORc =='F'){
printf("\n请移动农场主(F):输入w(上)、s(下)、a(左)、d(右)后回车开始移动!你还剩%d步!\n",count);
//用户移动
famerMove(map);
//判断是否胜利
if (isOK(map)) {
return 0;
}
//打印地图
printf("农场主已走完:\n");
printMap(map);
//当农场主走了14步还捉不到公鸡则推出游戏
if (count == 0) {
printf("14步已用完,你还没捉住公鸡,太失败了!请重新开始吧\n");
return 0;
}
fORc = 'c';
}
}
return 0;
}
复制代码
[/hide]
作者:
FreshMAN15
时间:
2015-7-14 07:55
感觉好厉害
作者:
neobug
时间:
2015-7-14 08:21
看着就好高端的样子 好好学习
作者:
562413895@qq.co
时间:
2015-7-14 08:43
这个比小人推箱子复杂啊,小人可以控制箱子,但是这个游戏农场主不能控制小鸡,不过感觉不是很难
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2