zoukankan      html  css  js  c++  java
  • 【CCpp程序设计2017】推箱子游戏

    我的还……支持撤销!用链表实现!

    题目:推箱子小游戏(基于console)

    功能要求:

    1. 将p09迷宫游戏改造为“推箱子”游戏;
    2. 在地图中增加箱子、箱子目标位置等图形;
    3. 当玩家将所有箱子归位,则显示玩家赢得了游戏;
    4. 按玩家走动步数记分;
    5. 设计多个关卡,每一关的地图从文件中读取,玩家每关的分数记录到文件中;
      #include<stdio.h>
      #include<conio.h>
      #include<windows.h>
      #define LEVEL 3
      
      typedef struct Node{
      	int x[3],y[3];
      	char deled[3];
      	struct Node *pre;
      }Node;
      Node *tail;
      void push_back(int xs[],int ys[],char dels[]);
      
      char Map[110][110];
      int dx[110],dy[110],n,m;
      int had,all;
      int is_place[110][110];
      
      void print_xy(const char* str,int len,int x,int y);
      int check_boxes(int x,int y,char dir);
      void calc_had();
      
      int main(){
      	char ch;
      	//游戏说明 
      	printf("This is a Game of Pushing Boxes.
      ");
      	printf("You are at the Place of 'O'.
      ");
      	printf("Use the Direction Keys to Move.
      ");
      	printf("'#' is a box. You can Move Several Boxes at the Same Time.
      ");
      	printf("'*' is a Wall,You can not Move on it or Put the Boxes on it.
      ");
      	printf("'@' is a Place You Need to Put a Box on it.
      ");
      	printf("'Y' is a Box which is on the '@'.
      ");
      	printf("
      		Author : Li Zitong, CCSE, UESTC, 2017/03
      ");
      	printf("
      
      请按任意键继续...
      ");
      	while(!kbhit());
      	ch=getch();
      	if(ch==-32){
      		getch();
      	}
      	
      	system("cls");
      	FILE *fp,*fp2=fopen("RESULTS.txt","w");
      	char tmp_print[5]={0};
      	char file_name[20];
      	dx[72]=-1; dy[72]=0;
      	dx[80]=1; dy[80]=0;
      	dx[75]=0; dy[75]=-1;
      	dx[77]=0; dy[77]=1;
      	
      	int xs[3],ys[3];
      	char dels[3];
      	
      	for(int i=1;i<=LEVEL;++i){
      		had=all=0;
      		int steps=0,cancels=0;
      		int x,y;
      		sprintf(file_name,"LEVEL%d.txt",i);
      		fp=fopen(file_name,"r");
      		fscanf(fp,"%d%d%d%d",&n,&m,&x,&y);
      		fgetc(fp);
      		for(int j=0;j<n;++j){
      			fgets(Map[j],m+2,fp);
      		}
      		fclose(fp);
      		memset(is_place,0,sizeof(is_place));
      		for(int j=0;j<n;++j){
      			for(int k=0;k<m;++k){
      				if(Map[j][k]=='@'){
      					++all;
      					is_place[j][k]=1;
      				}
      			}
      		}
      		for(int j=0;j<n;++j){
      			printf(Map[j]);
      		}
      		printf("LEVEL: %d
      Steps:0    Cancels:0   
      ",i);
      		while(1){
      			//方向键控制,从键盘进行读入
      			while(!kbhit());
      			ch=getch();
      			if(ch==8){
      				if(tail==NULL){
      					continue;
      				}
      				++cancels;
      				for(int j=0;j<=2 && (*tail).deled[j];++j){
      					Map[(*tail).x[j]][(*tail).y[j]]=tmp_print[0]=(*tail).deled[j];
      					print_xy(tmp_print,1,(*tail).x[j],(*tail).y[j]);
      				}
      				x=(*tail).x[1]; y=(*tail).y[1];
      				Node* tmp=tail;
      				tail=(*tail).pre;
      				free(tmp);
      				sprintf(tmp_print,"%d",cancels);
      				print_xy(tmp_print,strlen(tmp_print),n+1,19);
      //				calc_had();
      			}
      			else{
      				if(ch==-32){
      					ch=getch();
      				}
      				int tx,ty;
      				if(ch==72 || ch==80 || ch==75 || ch==77){
      					tx=x+dx[ch];
      					ty=y+dy[ch];
      				}
      				else{
      					continue;
      				}
      				if(Map[tx][ty]==' ' || Map[tx][ty]=='@'){
      					++steps;
      					dels[0]=Map[tx][ty];
      					xs[0]=tx; ys[0]=ty;
      					Map[tx][ty]=tmp_print[0]='O';
      					print_xy(tmp_print,1,tx,ty);
      					xs[1]=x; ys[1]=y;
      					dels[1]=Map[x][y];
      					Map[x][y]=tmp_print[0]=(is_place[x][y] ? '@' : ' ');
      					print_xy(tmp_print,1,x,y);
      					dels[2]=0;
      					x=tx; y=ty;
      					push_back(xs,ys,dels);
      					sprintf(tmp_print,"%d",steps);
      					print_xy(tmp_print,strlen(tmp_print),n+1,6);
      				}
      				else{
      					int sum_boxes=check_boxes(tx,ty,ch);
      					if(sum_boxes){
      						++steps;
      						int ttx=tx+dx[ch]*sum_boxes,tty=ty+dy[ch]*sum_boxes;
      						dels[0]=Map[ttx][tty];
      						xs[0]=ttx; ys[0]=tty;
      						Map[ttx][tty]=tmp_print[0]=(is_place[ttx][tty] ? 'Y' : '#');
      						print_xy(tmp_print,1,ttx,tty);
      						dels[2]=Map[tx][ty];
      						xs[2]=tx; ys[2]=ty;
      						Map[tx][ty]=tmp_print[0]='O';
      						print_xy(tmp_print,1,tx,ty);
      						dels[1]=Map[x][y];
      						xs[1]=x; ys[1]=y;
      						Map[x][y]=tmp_print[0]=(is_place[x][y] ? '@' : ' ');
      						print_xy(tmp_print,1,x,y);
      						x=tx; y=ty;
      						push_back(xs,ys,dels);
      						sprintf(tmp_print,"%d",steps);
      						print_xy(tmp_print,strlen(tmp_print),n+1,6);
      						calc_had();
      						if(had==all){
      							printf("You Win!
      请按任意键继续...
      ");
      							break;
      						}
      					}
      				}
      			}
      		}
      		fprintf(fp2,"LEVEL%d : Steps:%d	Cancels:%d
      ",i,steps,cancels);
      		while(!kbhit());
      		ch=getch();
      		if(ch==-32){
      			getch();
      		}
      		system("cls");
      		while(tail!=NULL){
      			Node* tmp=tail;
      			tail=(*tail).pre;
      			free(tmp);
      		}
      	}
      	fclose(fp2);
      	fp=fopen("RESULTS.txt","r");
      	char tmp_print_2[110];
      	printf("Game is Over.
      You can Check Your Scores in the RESULTS.txt.
      
      ");
      	for(int i=1;i<=LEVEL;++i){
      		fgets(tmp_print_2,100,fp);
      		printf(tmp_print_2);
      	}
      	return 0;
      }
      
      void print_xy(const char* str,int len,int x,int y){
      	//向第x行y列输出len长度的字符串(位置从零开始) 
          PDWORD NumberOfCharsWritten;
          HANDLE hnd=GetStdHandle(STD_OUTPUT_HANDLE);
          COORD coord={y,x};
          WriteConsoleOutputCharacter(hnd,str,len,coord,NumberOfCharsWritten);
      }
      
      int check_boxes(int x,int y,char dir){
      	if(Map[x][y]!='#' && Map[x][y]!='Y'){
      		return 0;
      	}
      	int cnt=0;
      	while(Map[x][y]=='#' || Map[x][y]=='Y'){
      		++cnt;
      		x=x+dx[dir];
      		y=y+dy[dir];
      	}
      	return Map[x][y]!='*' ? cnt : 0;
      }
      
      void push_back(int xs[],int ys[],char dels[]){
      	if(tail==NULL){
      		tail=(Node*)malloc(sizeof(Node));
      		(*tail).pre=NULL;
      	}
      	else{
      		Node* tmp=(Node*)malloc(sizeof(Node));
      		(*tmp).pre=tail;
      		tail=tmp;
      	}
      	memcpy((*tail).x,xs,sizeof(int)*3);
      	memcpy((*tail).y,ys,sizeof(int)*3);
      	memcpy((*tail).deled,dels,sizeof(char)*3);
      }
      
      void calc_had(){
      	had=0;
      	for(int i=0;i<n;++i){
      		for(int j=0;j<m;++j){
      			if(Map[i][j]=='Y'){
      				++had;
      			}
      		}
      	}
      }
  • 相关阅读:
    Asp.net C# 图像处理
    java报表工具参数强化
    Aspose.Pdf for .NET控件PDF文档到Excel、EPS、SVG等的转换
    使用Solid Converter PDF控件把PDF转换至Word文档
    报表控件报表设计器工具QuickReport下载
    图形图像处理CAD控件Vectordraw Developer Framework下载
    Aspose.Words控件支持DOC,OOXML,RTF,HTML,OpenDocument,PDF,XPS,EPUB和其他格式
    自动验证编码值的条形码控件Barcode Professional SDK for .NET
    MVC技术的功能强大的报表创建和设计控件
    XML Barcode Webservice条形码控件介绍
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/6593790.html
Copyright © 2011-2022 走看看