如何用C语言编写控制台小游戏

如何用C语言编写控制台小游戏,第1张

//C语言实例:推箱子小游戏

#include <stdio.h>  

#include <stdlib.h>  

#include<string.h>  

#include <conio.h>  

//行和列   

#define ROW 10  

#define COL 11  

/* run this program using the console pauser or add your own getch, system("pause") or input loop */  

/** 

*

*/  

//地图  

char map[ROW][COL] = {  

"##########",//0  

"###     ##",//1  

"###     ##",//2  

"##AX  # ##",//3  

"###  ##   ",//4  

"#####    #",//5  

"##       #",//6  

"#     ####",//7  

"###       ",//8  

"##########" //9  

//A:人  , X:箱子   

}   

//打印地图   

void showMap()  

//接收小人的方向  

char enterDirection()  

//小人向上移动的方法  

void moveToUp() 键枣  

//小人向下移动的方法  

void moveToDown()   

//小人向右移动的方法  

void moveToRight()   

//小人向左移动的方法  

void moveToLeft()   

//当前小人的坐标  

int currentPersonRow = 3  

int currentPersonCol = 2  

//当前箱子的坐标   

int currentBoxRow = 3  

int currentBoxCol = 3  

int main(int argc, char *argv[]) {  

//system("clear")  

printf("点击回车键开始游戏 ^_^\n\n")  

//1代表运行   0停止   

int flag = 1  

while(flag==1){  

//显示地图   

showMap()  

//接收小人的方向  

char dir = enterDirection()  

switch(dir){  

//小人向上移动   

case 'w':  

case 'W':  

moveToUp()  

break  

//小人向下移动   

case 's':  

case 'S':  

moveToDown()  

break  

//小人向右移动   

case 'd':  

case 'D':  

moveToRight()  

break  

//小人向左移动   

case 'a':  

case 'A':  

moveToLeft()  

break  

//停止运行   

case 'q':  

case 'Q':  

printf("你的智商真低!T_T\n")  

flag = 0  

break  

}  

showMap()  

if(currentBoxRow==8&&currentBoxCol==9){  

printf("你的智商真高^_^!!!")  

flag = 0   

}  

}  

}  

/* 

方法的实现   

*/  

//打印地图   

void showMap(){  

int i  

for(i = 0i < ROW i++){  

printf("%s\n",map[i])  

}  

printf("\n\n\n\n\n")   

printf("W:上,S:下, A:左, D:右。Q:退出")  

printf("\n\n\n\n\n"码孙)  

}  

//接收小人的方向  

char enterDirection(){  

//清除SCANF中的缓冲区   

rewind(stdin)  

char dir  

dir = getch()  

//scanf("%c",&dir)  

return dir  

}  

//小人向上移动的方法  

void moveToUp(){  

//小人的下一个坐标   

int nextPersonCol = currentPersonCol  

int nextPersonRow = currentPersonRow - 1  

//箱子的下一个坐标  

int nextBoxRow = currentBoxRow - 1  

int nextBoxCol = currentBoxCol    

//如果小人的下一个坐标是路   

if(map[nextPersonRow][nextPersonCol]==' '){  

map[nextPersonRow][nextPersonCol] = 'A'  

map[currentPersonRow][currentPersonCol] = ' '  

currentPersonRow = nextPersonRow  

currentPersonCol = nextPersonCol  

}  

//如果小人的下一个坐标是墙   

if(map[nextPersonRow][nextPersonCol]=='#'){  

//什么也不做   

}  

//如果小人的下一个坐标是箱子  稿模拆 

if(map[nextPersonRow][nextPersonCol]=='X'){  

if(map[nextBoxRow][nextBoxCol] == ' '){  

map[nextPersonRow][nextPersonCol] = 'A'  

map[currentPersonRow][currentPersonCol] = ' '  

map[nextBoxRow][nextBoxCol] = 'X'  

map[currentBoxRow][currentBoxCol] = 'A'  

currentPersonRow = nextPersonRow  

currentPersonCol = nextPersonCol  

currentBoxRow = nextBoxRow  

currentBoxCol = nextBoxCol  

}  

}  

}  

//小人向下移动的方法  

void moveToDown(){  

//小人的下一个坐标   

int nextPersonCol = currentPersonCol  

int nextPersonRow = currentPersonRow + 1  

//箱子的下一个坐标  

int nextBoxRow = currentBoxRow + 1  

int nextBoxCol = currentBoxCol    

//如果小人的下一个坐标是路   

if(map[nextPersonRow][nextPersonCol]==' '){  

map[nextPersonRow][nextPersonCol] = 'A'  

map[currentPersonRow][currentPersonCol] = ' '  

currentPersonRow = nextPersonRow  

currentPersonCol = nextPersonCol  

}  

//如果小人的下一个坐标是墙   

if(map[nextPersonRow][nextPersonCol]=='#'){  

//什么也不做   

}  

//如果小人的下一个坐标是箱子   

if(map[nextPersonRow][nextPersonCol]=='X'){  

if(map[nextBoxRow][nextBoxCol] == ' '){  

map[nextPersonRow][nextPersonCol] = 'A'  

map[currentPersonRow][currentPersonCol] = ' '  

map[nextBoxRow][nextBoxCol] = 'X'  

map[currentBoxRow][currentBoxCol] = 'A'  

currentPersonRow = nextPersonRow  

currentPersonCol = nextPersonCol  

currentBoxRow = nextBoxRow  

currentBoxCol = nextBoxCol  

}  

}  

}   

//小人向右移动的方法  

void moveToRight(){  

//小人的下一个坐标   

int nextPersonCol = currentPersonCol + 1  

int nextPersonRow = currentPersonRow  

//箱子的下一个坐标  

int nextBoxRow = currentBoxRow  

int nextBoxCol = currentBoxCol + 1   

//如果小人的下一个坐标是路   

if(map[nextPersonRow][nextPersonCol]==' '){  

map[nextPersonRow][nextPersonCol] = 'A'  

map[currentPersonRow][currentPersonCol] = ' '  

currentPersonRow = nextPersonRow  

currentPersonCol = nextPersonCol  

}  

//如果小人的下一个坐标是墙   

if(map[nextPersonRow][nextPersonCol]=='#'){  

//什么也不做   

}  

//如果小人的下一个坐标是箱子   

if(map[nextPersonRow][nextPersonCol]=='X'){  

if(map[nextBoxRow][nextBoxCol]==' '){  

map[nextPersonRow][nextPersonCol] = 'A'  

map[currentPersonRow][currentPersonCol] = ' '  

map[nextBoxRow][nextBoxCol] = 'X'  

map[currentBoxRow][currentBoxCol] = 'A'  

currentPersonRow = nextPersonRow  

currentPersonCol = nextPersonCol  

currentBoxRow = nextBoxRow  

currentBoxCol = nextBoxCol  

}  

}  

}  

//小人向左移动的方法  

void moveToLeft(){  

//小人的下一个坐标   

int nextPersonCol = currentPersonCol - 1  

int nextPersonRow = currentPersonRow  

//箱子的下一个坐标  

int nextBoxRow = currentBoxRow  

int nextBoxCol = currentBoxCol - 1    

//如果小人的下一个坐标是路   

if(map[nextPersonRow][nextPersonCol]==' '){  

map[nextPersonRow][nextPersonCol] = 'A'  

map[currentPersonRow][currentPersonCol] = ' '  

currentPersonRow = nextPersonRow  

currentPersonCol = nextPersonCol  

}  

//如果小人的下一个坐标是墙   

if(map[nextPersonRow][nextPersonCol]=='#'){  

//什么也不做   

}  

//如果小人的下一个坐标是箱子   

if(map[nextPersonRow][nextPersonCol]=='X'){  

if(map[nextBoxRow][nextBoxCol]==' '){  

map[nextPersonRow][nextPersonCol] = 'A'  

map[currentPersonRow][currentPersonCol] = ' '  

map[nextBoxRow][nextBoxCol] = 'X'  

map[currentBoxRow][currentBoxCol] = 'A'  

currentPersonRow = nextPersonRow  

currentPersonCol = nextPersonCol  

currentBoxRow = nextBoxRow  

currentBoxCol = nextBoxCol  

}  

}  

}

map就是哈希表,用来储存成对的数据key和val

map<char,int>m

m.insert(make_pair('0',10))//插入数据,make_pair这个东西就要看自己体会了,实在不知道怎么解释

m.insert(make_pair('1',11))

m.insert(make_pair('2',12))

下面从map中读取数据,直接把key当做下标就可以得到val,只岩键竖有哈希表能做这样的事情,其他如vector,list等都不行,这是哈希表最明显的特征

cout<<m['1']<粗大<endl输出11

cout<<m['4']<<endl输出0

map还有两个特点

默认情况亮茄下插入数据的时候会自动按key排序

key不能重复,重复插入无效

map和multimap唯一的区别就在于2,multimap可以插入key相同的数据,用一个例子解释

#include "stdafx.h"

#include <map>

using namespace std

void showmap(map<int,char>mp)

{

printf("\n")

for(map<int,char>::iterator iter=mp.begin()iter!=mp.end()++iter)

{

printf("%d-%c\n",iter->first,iter->second)

}

printf("\n")

}

void showmultimap(multimap<int,char>mmp)

{

printf("\n")

for(multimap<int,char>::iterator iter=mmp.begin()iter!=mmp.end()++iter)

{

printf("%d-%c\n",iter->first,iter->second)

}

printf("\n")

}

int _tmain(int argc, _TCHAR* argv[])

{

map<int,char>mp

mp.insert(make_pair<int,char>(0,48))

mp.insert(make_pair<int,char>(1,49))

mp.insert(make_pair<int,char>(2,50))

mp.insert(make_pair<int,char>(3,51))

mp.insert(make_pair<int,char>(1,52))

showmap(mp)

multimap<int,char>mmp

mmp.insert(make_pair<int,char>(0,48))

mmp.insert(make_pair<int,char>(1,49))

mmp.insert(make_pair<int,char>(2,50))

mmp.insert(make_pair<int,char>(3,51))

mmp.insert(make_pair<int,char>(1,52))

showmultimap(mmp)

getchar()

return 0

}

运行结果:

0-0

1-1

2-2

3-3

0-0

1-1

1-4

2-2

3-3

对于map,key是唯一的,如果已经存在key了,再次插入想同key无效

multimap的key可以有多个


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12403309.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存