실습 학습 1: 간단한 상자 밀기 게임을 구현하기 위한 C 언어

학교에서 주최하는 교육은 졸업 후 취업률 향상을 목표로하고 있으며 교육 내용은 실제로 이전 수업에서 접하지 못했던 내용으로 주로 내장되어 있습니다. 이 시리즈는 주로 다음 사항을 포함하는 교육을 기록하는 데 사용됩니다.

1. C언어의 기초(상자 밀기 게임)

2. 데이터 구조 관련 (간단한 데이터베이스 구현)

3. 파일 관련 (리눅스의 모든 것은 파일이고, 사진을 직접 편집할 수도 있습니다. ㅎㅎ, 사진 관련은 정말 고급스럽다고 늘 생각했어요)

4. TCP 관련(서버 및 클라이언트)

5. C++ 기초(객체 지향, 오버로딩, 참조, 네임스페이스 등)

6. Qt 기초

7. 간단한 이미지 전송 (직접 tcp 실시간 이미지 전송, qt 종료 표시)

8. mqtt를 통해 집 제어를 위해 Linux와 qt 연결

첫 번째 부분은 C 언어를 사용하여 푸시 박스 게임(Linux 환경)을 완성하는 것입니다 .

가장 먼저 이해해야 할 점은 명령줄에서 printf를 사용하여 다양한 색상을 출력할 수 있으므로 명령줄에서 직접 이 미니 게임 제작을 완료할 수 있다는 것입니다. 벽, 상자, 문자가 모두 다른 색상 의 공백으로 표시됩니다 .. 둘째, 입력에 사용하는 키보드는 입력할 때마다 Enter 키를 눌러야 하면 너무 번거롭기 때문에 C 언어를 구현하려면 다음 문장을 사용해야 합니다. 표준 입력 즉시 읽기(ICANON)

system("stty -icanon");//直接获取键盘值,不用按enter

이미지를 새로 고칠 때마다 명령줄이 지워지고 다시 표시됩니다.

실증효과

데모 비디오: C 언어로 상자 밀기 게임의 간단한 구현_bilibili_bilibili

모든 코드 저장소 주소: https://gitee.com/caneve/opencaneve/tree/main/C

Sokoban의 전체 코드

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define green "\033[42;31m  \033[0m" 
#define red "\033[41;31m  \033[0m"//红色
#define black "\033[40;31m  \033[0m"//黑色
#define yellow "\033[43;37m  \033[0m"
#define blue "\033[44;37m  \033[0m"
#define pink "\033[45;37m  \033[0m"
#define l_blue "\033[46;37m  \033[0m"
#define white "\033[47;37m  \033[0m"

#define box_color    black
#define wall_color    yellow
#define self_color  blue//"\033[46;31m  \033[0m"浅蓝色
#define space_color   green  //"\033[42;31m  \033[0m"
#define target_color    pink   //"\033[43;31m  \033[0m"


#define h 15
#define w 15
#define wall 1
#define box 2
#define space 0
#define self 3
#define target 4
#define up  'w'
#define down 's'
#define left 'a'
#define right 'd'
#define pos(r,c) (r*w+c) 
#define map0 0
#define map1 1
#define map2 2


int r=0,c=0;
int box_x = 5,box_y = 5,self_x=2,self_y=2,target_x=4,target_y=13;
int map[h][w]={0};
void map_init(){
	
	map[box_y][box_x] = box;
	map[self_y][self_x] =self;
		for(r=0;r<h;r++){
		for(c=0;c<w;c++){
			//  if(r==0 || c==0 || r==(h-1) || c==(w-1))
			 if(r==0|| c==0|| r==(h-1) || c==(w-1)
                ||r<=10  &&r>=8  &&c<=8  &&c>=6
                ||r<=7   &&r>=4  &&c<=3  &&c>=0
                ||r<=4   &&r>=0  &&c<=10 &&c>=7
                ||r<=11  &&r>=9  &&c<=13 &&c>=11
              )
				map[r][c]=wall;
			else if(r==self_y&&c==self_x)
				map[r][c]=self;
			else if(r==target_y&&c==target_x)
				map[r][c]=target;
			// printf("%d",map[r*w+c]);
		}
	}
}
void display_map(){
	system("clear");
	for(r=0;r<h;r++){
		for(c=0;c<w;c++){
			switch(map[r][c]){
				case wall:
					printf(wall_color);	
				break;
				case space:
					printf(space_color);
				break;
				case box:
					printf(box_color);
				break;
				case self:
					printf(self_color);
				break;
				case target:
					printf(target_color);
					break;
			}
		}
		printf("\n");

	}
}
void move_control(){
	
	map[self_y][self_x] = space;
	// map[box_y][box_x]=space;
	map[target_y][target_x]=target;
	char cmd=getchar();
	switch(cmd){
		case up:
		if(map[self_y-1][self_x] !=wall ){
			self_y--;
			if(map[self_y][self_x]==box&&map[self_y-1][self_x]!=wall)
				box_y--;
			else if(map[self_y-1][self_x] ==wall &&map[self_y][self_x]==box) self_y++;
			
		}
			
		break;
		case down:
		if(map[self_y+1][self_x] !=wall ){
			self_y++;
			if(map[self_y][self_x]==box&&map[self_y+1][self_x]!=wall)
				box_y++;
			else if(map[self_y][self_x]==box&&map[self_y+1][self_x] ==wall ) self_y--;
			
		}
			
		break;	
		case left:
		if(map[self_y][self_x-1] !=wall){
			self_x--;
			if(map[self_y][self_x]==box&&map[self_y][self_x-1]!=wall)
				box_x--;
			else if(map[self_y][self_x]==box&&map[self_y][self_x-1] ==wall) self_x++;
			
		}
		
		break;	
		case right:
		if(map[self_y][self_x+1] !=wall){
			self_x++;
			if(map[self_y][self_x]==box&&map[self_y][self_x+1]!=wall)
					box_x++;
		else if(map[self_y][self_x]==box&&map[self_y][self_x+1] ==wall)self_x--;
		}
			
		break;
		// case 'r':
		// goto init;
		// break;
	}
	map[box_y][box_x]=box;
	map[self_y][self_x]  = self;

}

void main(){

	system("clear");
	int map[10][10]={0};
	map_init();
    system("stty -icanon");//直接获取键盘值,不用按enter
	 while(1){
		while(1){
	display_map();
	move_control();
	if(box_x==target_x&&box_y==target_y){
		
		display_map();
		printf("YOU WIN !\n");
		break;
	}
	} 
	getchar();
	system("clear");
	printf("input map number\n");
	switch(getchar()){
		case map0:
			map_init();
		break;
		case map1:

		break;
		case map2:

		break;
	 }
	 }
	
}

Supongo que te gusta

Origin blog.csdn.net/hhcgn/article/details/130795067
Recomendado
Clasificación