当前访客身份:游客 [ 登录 | 加入开源中国 ]

代码分享

当前位置:
代码分享 » C/C++  » 编程基础
分享到: 
收藏 +0
2
基于控制台设计的RPG游戏,键盘的WSAD(上下左右),当遇到NPC(屏幕上N代替)的时候可以对话并接收任务,找到一只猪(屏幕上Z代替)后游戏结束。
主要使用到了逻辑逻辑判断、循环、数据结构(结构体、数组)
代码未优化。。。

开发环境:C-free 5.0
测试环境:Win7 x64

我想这段代码还有资源回收之类的没做
标签: <无>

源码与演示:源码出处 演示出处

代码片段(3) [全屏查看所有代码]

1. [图片] QQ截图20131222220531.png    

2. [图片] QQ截图20131222220607.png    

3. [文件] 游戏.c ~ 5KB     下载(194)     跳至 [3] [全屏预览]

#include <stdio.h>
/*  为了支持颜色 */ 
#include <windows.h>
 
// 地图区域 
const int MAP_X_LENGTH = 24;
const int MAP_Y_LENGTH = 18;

/* 声明函数 */ 
void game();
int deriction_down();
int deriction_up();
int deriction_left();
int deriction_right(); 
void role_up(); 
void role_display();
void gameinfo();
int NPC(int npc); 

 



 
// 屏幕缓冲区 
int display[18][24] = {
		{3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
		{3,1,2,0,0,0,0,0,2,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0},		
		{3,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},		
		{3,0,2,2,2,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},		
		{3,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},		
		{3,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},		
		{3,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},		
		{3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},		
		{3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},		
		{3,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0},		
		{3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},		
		{3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3},		
		{3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3},		
		{3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3},		
		{3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3},		
		{3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3},		
		{3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3},		
		{3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3} 
 
};

// 描述位置结构体 
struct Position{
	int x;// x 
	int y;// y
};

// 角色
struct Role{
	struct Position oldP;// 旧位置 
	struct Position newP;// 新位置
	void (* display)(); 	
};

struct Role role = { 
    {1, 1}, 
    {1, 1}
};

int main(){
	role.display = &role_display; 
	
	while(1){ 
	 	game(); 
	} 
	return 0;
}

void gameinfo(){
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |
            FOREGROUND_RED | FOREGROUND_GREEN );
     
	printf("=======================\n");
    printf("=====欢迎来玩游戏======\n");
	printf("=======================\n"); 
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
            FOREGROUND_RED | FOREGROUND_BLUE);
} 


void game(){
	role.display();
    gameinfo(); 
	// 遍历map中的数据 
	int i,j; 
    for( i=0; i< MAP_Y_LENGTH ; i++){ 
		for( j=0; j< MAP_X_LENGTH ; j++){
		    int temp = display[i][j];
		    
		    if(temp == 1){ 
	   			printf("¤");
    		}else if(temp == 2){
				printf("∏");
           	}else if(temp == 3){
   	            printf("■");
   	        }else if(temp == 4){
				printf("N ");   	        
			}else if(temp == 5){// 猪
		        printf("Z ");
			}else{
    		    printf("  ");
		    }
		}
		printf("\n");
	}
	
	char a = getch();
	 
	// 记录旧位置 
	role.oldP.y = role.newP.y;
	role.oldP.x = role.newP.x; 
	switch(a){
		case 's': // 向下 
			if(NPC(deriction_down()) == 0){
				role.newP.y = role.newP.y + 1;// 向下走 	
			}
		break; 
		case 'd': // 向右
			if(NPC(deriction_right()) == 0){
				role.newP.x = role.newP.x + 1;
			}
		break; 
		case 'a': // 向左 
			if(NPC(deriction_left()) == 0){
				role.newP.x = role.newP.x - 1;
			}
		break;
	    case 'w': // 向上 
	    	if(NPC(deriction_up()) == 0){
				role.newP.y = role.newP.y - 1;
	    	}
		break; 
	default: ;
	}
	 system("cls");
}

char npc_info[4][80] = {
	"我:你就是传说中的NPC?\n", 
	"NPC:你这是看不起NPC嘛!!!\n",
	"我:不不不,我是来接任务的!\n",
	"NPC:我有一头猪不见了,你帮我找回来吧!\n",
}; 


int NPC(int npc){
	printf("%d",npc); 
	if(npc == 4){//遇到NPC 
		system("cls");
		gameinfo(); 
		int i = 0,j=0;
		for(j=0;j < 4; j++){ 
			for(i=0; i < sizeof(npc_info[j]); i++){
				printf("%c",npc_info[j][i]);
				_sleep(10);
			} 
			printf("\n"); 
		} 
		printf("是否接收任务?\n"); 
		printf("1. 是    2. 否\n");
		char key = getchar();
		if(key == '1'){
			display[10][9] = 5; 
			return 0; 
		} else{
			return 4; 
		}  
		 
		return 4; 
	}else if(npc == 5){//找到了猪 
		system("cls");
		gameinfo();
		printf("恭喜你,任务完成!\n");
		system("pause"); 
		return 0; 
	} 
	return npc;
} 



/* 向下 */
int deriction_down(){ 
	return display[role.newP.y + 1][role.newP.x]; 
}
/* 向上 */
int deriction_up(){
	return display[role.newP.y - 1][role.newP.x]; 
}
/* 向左 */
int deriction_left(){ 
	return display[role.newP.y][role.newP.x - 1]; 	
}
/* 向右 */
int deriction_right(){
 	return display[role.newP.y][role.newP.x + 1]; 
}

/*
 * 角色向上走 
 */
void role_display(){
    display[role.oldP.y][role.oldP.x] = 0;
 	display[role.newP.y][role.newP.x] = 1;
}





 


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(12)

  • 1楼:开源中国按察使 发表于 2013-12-23 15:10 回复此评论
    以前用C#做过类似的打怪游戏

    不过不是找楼猪啊
  • 2楼:此号作废 发表于 2013-12-23 19:35 回复此评论
    #include <conio.h>
  • 3楼:克里兹-雪特 发表于 2013-12-24 00:55 回复此评论
    你就是传说中的NP完全问题?
  • 4楼:Wicky 发表于 2013-12-25 11:42 回复此评论
    楼猪
  • 5楼:_Kiven_ 发表于 2013-12-25 14:21 回复此评论
    #include <conio.h>
  • 6楼:wlds 发表于 2013-12-25 19:08 回复此评论
    问一下 
    int temp = display[i][j];

      这个是赋值二位数组了么      

    if(temp == 1)
    然后下面怎么判断 == 1 呢
  • 7楼:sinbt 发表于 2013-12-26 18:54 回复此评论

    引用来自“wlds”的评论

    问一下 
    int temp = display[i][j];

      这个是赋值二位数组了么      

    if(temp == 1)
    然后下面怎么判断 == 1 呢
    你基础没学好。
  • 8楼:wlds 发表于 2013-12-27 08:22 回复此评论

    引用来自“sinbt”的评论

    引用来自“wlds”的评论

    问一下 
    int temp = display[i][j];

      这个是赋值二位数组了么      

    if(temp == 1)
    然后下面怎么判断 == 1 呢
    你基础没学好。
    恩 刚看到基本类型 正在一点点看 帮解释下基础 嘻嘻
  • 9楼:Foou 发表于 2013-12-28 12:14 回复此评论
    缺一行 #include <conio.h>

    你是这C++的写法吧?在C语言里,变量只能在函数的开头处声明和定义。

  • 10楼:marker 发表于 2013-12-28 12:55 回复此评论

    引用来自“tianso”的评论

    缺一行 #include <conio.h>

    你是这C++的写法吧?在C语言里,变量只能在函数的开头处声明和定义。

    我文件保存的是.c,使用C-Free编译可以通过并运行。关于C++和C语法区别没有深入研究过,C-Free是mingw5编译器,可能不同编译器对语法上的规则要求不一样。
  • 11楼:jacket 发表于 2014-01-30 18:23 回复此评论
    虽然代码很简单 但是基本构架都有了。感谢楼主无私奉献 
  • 12楼:jacket 发表于 2014-01-30 18:24 回复此评论
    封装成2个类就更容易理解了
开源从代码分享开始 分享代码
marker的其它代码 全部(20)...