가위 바위 보 게임을 c언어로 제작해 보았습니다

 

게임은 첫 번째 화면에서는 금액을 입력하면 두 번째 화면으로 넘어가게되고

금액에 따라 게임 횟수가 결정이됩니다

 

두 번째 화면에서는 가위, 바위, 보 중에서 선택을 하는 화면이고 남은 게임 횟수가 표시됩니다

무엇을 낼지 입력하였다면 세 번째 화면으로 넘어갑니다

 

세 번째 화면에서는 가위, 바위, 보가 처음에는 빠르게 돌아가다 점차 느려지게되며 네 번째 화면으로 넘어갑니다

 

네 번째 화면에서는 컴퓨터가 낸것과 유저가 낸것이 같이 나타나게 되며 게임 결과를 알려주고

이겼을시에는 랜덤으로 게임횟수가 증가하고 비겼을 시에는 게임횟수가 그대로 졌을시에는 게임 횟수가 1 차감됩니다

 

게임 횟수가 0이될 때 까지 네 번째 화면에서 엔터를 누르면 다시 두 번째 화면으로 돌아가 게임을 계속 진행하게 됩니다

 

금액 입력란에 금액을 입력해주세요
가위, 바위, 보 입력란에 해당 숫자에 맞춰 숫자를 입력해주세요
재미를 살려서 가위, 바위, 보가 돌아가는 것처럼 꾸며 본 화면입니다
컴퓨터가 낸것과 유저가 낸것이 보이고 결과가 출렵됩니다

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>

int main()
{
	int user = 0;		// 사용자가 입력한 값을 담는 변수
	int com = 0;		// 랜덤 값을 담는 변수
	int coin = 0;		// 게임을 진행할 수 있는 횟수를 나타내는 변수
	int tmp = 0;		// 게임에서 이겼을 경우 coin의 증가를 위한 변수
	int ct = 0;			// 반복되는 모양을 위한 카운트 변수

	srand((unsigned)time(NULL));

	printf("=======가위 바위 보 게임========= \n");
	printf("=                               = \n");
	printf("=     게임을 시작하려면         = \n");
	printf("=        코인을 넣어            = \n");
	printf("=          주세요               = \n");
	printf("=      (한판에 100원)           = \n");
	printf("=                               = \n");
	printf("=                     #####     = \n");
	printf("=                     # | #     = \n");
	printf("=    동전 투입 --->   # | #     = \n");
	printf("=                     # | #     = \n");
	printf("=                     #####     = \n");
	printf("================================= \n\n");

	printf("금액을 입력하세요 : ");
	scanf("%d", &coin);

	system("cls");

	printf("금액 : %d , 게임횟수 : %d \n\n", coin, coin / 100);
	coin = coin / 100 * 100;

	while (coin)
	{
		printf("=== 가위 바위 보 게임 ===\n");
		printf("=== 남은 코인수 : %d  ===\n\n", coin / 100);

		printf("숫자를 입력해주세요(1. 가위 / 2. 바위 / 3. 보) :");
		scanf(" %c", &user);

		if (user == 'x' || user == 'X')
		{
			break;
		}
		else
		{
			user -= 0x30;
		}
		user = user % 3;                   

		if (!user)
		{
			user = 3;
		}

		com = rand() % 3 + 1;

		for (ct = 1; ct < 300; ct += 30)
		{
			printf("=== 가위 바위 보 게임 ===\n");
			printf("=== 남은 코인수 : %d  ===\n\n", coin / 100);
			printf("    ====        ===		\n");
			printf("   ======      =====	\n");
			printf("   ======      =====	\n");
			printf("   ======      =====	\n");
			printf("    ======    ===== 	\n");
			printf("  ===================	\n");
			printf("  ===================	\n");
			printf("   =================    \n");
			Sleep(ct);
			system("cls");

			printf("=== 가위 바위 보 게임 ===\n");
			printf("=== 남은 코인수 : %d  ===\n\n", coin / 100);
			printf("\n");
			printf("  ===== ===== ===== =====\n");
			printf("  ===== ===== ===== =====\n");
			printf(" =========================\n");
			printf(" =========================\n");
			printf(" =========================\n");
			printf(" =========================\n");
			printf("   =====================  \n");
			Sleep(ct);
			system("cls");

			printf("=== 가위 바위 보 게임 ===\n");
			printf("=== 남은 코인수 : %d  ===\n\n", coin / 100);
			printf("\n");
			printf("      === === === ===	\n");
			printf("      === === === ===	\n");
			printf("      === === === ===	\n");
			printf(" ==   === === === ===	\n");
			printf(" ==== ===============	\n");
			printf("  === ===============	\n");
			printf("  ===================	\n");
			printf("     ===============  \n");
			Sleep(ct);
			system("cls");
		}

		switch (com)
		{
		case 1:
		{
			printf("=== 가위 바위 보 게임 ===\n");
			printf("=== 남은 코인수 : %d  ===\n\n", coin / 100);
			printf("\n");
			printf("    ====        ===		\n");
			printf("   ======      =====	\n");
			printf("   ======      =====	\n");
			printf("   ======      =====	\n");
			printf("    ======    ===== 	\n");
			printf("  ===================	\n");
			printf("  ===================	\n");
			printf("   =================    \n");
			printf("\n   com == 가위 \n");
			break;
		}
		case 2:
		{
			printf("=== 가위 바위 보 게임 ===\n");
			printf("=== 남은 코인수 : %d  ===\n\n", coin / 100);
			printf("\n");
			printf("  ===== ===== ===== =====\n");
			printf("  ===== ===== ===== =====\n");
			printf(" =========================\n");
			printf(" =========================\n");
			printf(" =========================\n");
			printf(" =========================\n");
			printf("   =====================  \n");
			printf("\n     com == 바위 \n");
			break;
		}
		case 3:
		{
			printf("=== 가위 바위 보 게임 ===\n");
			printf("=== 남은 코인수 : %d  ===\n\n", coin / 100);
			printf("\n");
			printf("      === === === ===	\n");
			printf("      === === === ===	\n");
			printf("      === === === ===	\n");
			printf(" ==   === === === ===	\n");
			printf(" ==== ===============	\n");
			printf("  === ===============	\n");
			printf("  ===================	\n");
			printf("     ===============  \n");
			printf("\n     com == 보 \n");
			break;
		}
		default:
			break;
		}

		if (user == 1)												
		{
			printf("\n");
			printf("    ====        ===		\n");
			printf("   ======      =====	\n");
			printf("   ======      =====	\n");
			printf("   ======      =====	\n");
			printf("    ======    ===== 	\n");
			printf("  ===================	\n");
			printf("  ===================	\n");
			printf("   =================    \n");
			printf("\n   user == 가위 \n");
		}
		else if (user == 2)
		{
			printf("\n");
			printf("  ===== ===== ===== =====\n");
			printf("  ===== ===== ===== =====\n");
			printf(" =========================\n");
			printf(" =========================\n");
			printf(" =========================\n");
			printf(" =========================\n");
			printf("   =====================  \n");
			printf("\n     user == 바위 \n");
		}
		else
		{
			printf("\n");
			printf("      === === === ===	\n");
			printf("      === === === ===	\n");
			printf("      === === === ===	\n");
			printf(" ==   === === === ===	\n");
			printf(" ==== ===============	\n");
			printf("  === ===============	\n");
			printf("  ===================	\n");
			printf("     ===============  \n");
			printf("\n     user == 보 \n");
		}													

		if (user == com)
		{
			printf(" \n비겼습니다.\n");
		}
		else
		{
			coin -= 100;

			if ((user == 1 && com == 3) || (user == 2 && com == 1) || (user == 3 && com == 2))
			{
				printf("\n이겼습니다.^^\n");
				tmp = (rand() % 3 + 1) * 100;
				printf("\n 포인트 : %d \n", tmp);
				coin += tmp;
			}
			else
			{
				printf("\n졌습니다.ㅠㅠ\n");
			}
		}
		getchar();
		getchar();
		system("cls");
	}
	return 0;
}

 

'C언어' 카테고리의 다른 글

값을 교환해주는 함수 (C언어)  (0) 2020.11.05
간단한 구구단 코딩 (C언어)  (0) 2020.11.05
로또 게임 제작 (C언어)  (0) 2020.11.04

Iptables
: 리눅스 상에서 방화벽을 설정하는 도구로서 커널 2.4 이전 버전에서 사용되던 ipchains를 대신하는 방화벽 도구이다

 

iptables 설정을 위해서는 방화벽을 켜준다


Iptables 정책
: iptables 정책은 여러 구분으로 나눠지며 중요한 부분은 chain이다
chain은 패킷이 조작될 상태를 지정하며 ipchains에 내장된 기본 chain은 아래 내용과 같다

chain INPUT : 서버로 들어오는 기본 정책
chain FORWARD : 서버에서 forwarding 기본 정책( 목적지가 서버가 아닌 통과하는 chain이다 )
chain OUTPUT : 서버에서 나가는 기본 정책

iptables의 구조
iptables -A INPUT -s [발신지] --sport [발신지 포트] -d [목적지] --dport [목적지 포트] -j [정책]

iptables 설정 파일 

- 설정 파일 작업시 정책에 대한 순서를 편하게 설정할  수 있다는 장점이있다
/etc/sysconfig/iptables

파일로 들어가서 설정하기 위한 경로

iptables 기본 옵션

옵션 설명
-L 적용되어 있는 정책 목록을 출력한다
-A 새로운 정책을 추가한다( 제일 아래에 추가됨 )
-I 위치를 선책하여 정책을 삽입한다( 제일 앞에 추가됨 )
-R 위치를 선택하여 정책을 교환한다
-D 위치를 선택하여 정책을 제거한다
-N 새로운 체인을 만든다
-P 체인에 미리 정의되어 있는 정책을 수정한다
-Z 체인의 모든 규칙들의 패킷과 비이트 카운트를 0으로 만든다
-X 비어있는 체인을 제거한다

 

iptables 제어 옵션

옵션 설명
-s 패킷의 송신지를 제어한다
-d 패킷의 수신지를 제어한다
-j [옵션] 방화벽을 지난 후 패킷의 상태를 제어한다
[ 옵션 : ACCEPT, DROP, REJECT ]
-p 프로토콜을 제어한다
--sport 송진지 포트를 제어한다
--dport 수신지 포트를 제어한다

 

패킷 상세 내역에 따른 제어 옵션 명령어

명령어 설명
--tcp-flags tcp 플래그에 따라 패킷을 제어한다
-m state --state[ 상태 ] 패킷의 상태와 목적에 따라 제어한다

 

-m state --state[ 상태 ] 상태 옵션

상태 옵션 설명
-NEW 새로 접속을 시도하는 패킷
-ESTABLISHED 접속을 한 상태에 있는 패킷
-INVALID 유효하지 않은 패킷
-RELATED 접속에 연관성을 가지는 패킷

 

iptables 규칙 추가 예제

- 로컬로 들어오는 ICMP 요청에 대한 특정 호스트(192.168.0.10)의 패킷을 허용하지 않고자 할 때

 

#iptables -A INPUT -s 192.168.0.10 -p icmp -j DROP

 

iptables 규칙 제거 예제

- 위에서 만든 규칙을 제거할 때 

 

#iptables -D INPUT -s 192.168.0.10 -p icmp -j DROP

or

#iptables -D INPUT [라인 번호]

( "iptables -L --line-numbers" 명령어로 조회가능 )

 

#iptables -F INPUT

(모든 체인이 삭제된다)

 

iptables 정책 순서

- 모든 방화벽은 순차적 실행이기 때문에 등록 순서에 있어서 먼저 등록한 부분에 대해서 효력이 유효하기 때문에 등록시에는 순서가 매우 중요하다

- 모든 입출력 패킷에 대해 거부하는 설정이 먼저 등록되면 그 이후에 포트를 열어주는 설정을 하여도 효과가 없다

- 허용하는 정책을 먼저 정의한 다음 거부하는 정책을 설정해야 한다

'리눅스' 카테고리의 다른 글

Tcp Wrapper  (0) 2020.09.22
Zeroboard( 제로보드 )  (0) 2020.09.19
리눅스 APM  (0) 2020.09.18
리눅스 demon(데몬)  (0) 2020.09.18
리눅스 rpm과 yum  (0) 2020.09.18

Tcp Wrapper
: 특정 호스트가 해당 호스트의 데몬 서비스 접근시 제어

- hosts.deny

- hosts.allow

 

일단 설정하기전에 "setup"에 들어가서 방화벽을 내려줍니다 

 

hosts.deny

[데몬명:IP]

- 접근을 차단할 특정 데몬명과 특정 IP를 정할 수 있다

/etc/hosts.deny 파일에 들어갑니다
테스트로 텔넷의 데몬명을 적어주고 뒤에는 차단할 IP를 적어줍니다
텔넷으로 접속하는 모든 사용자를 차단할때는 뒤에 ALL 을 써줍니다

 

hosts.allow

- 접근을 허용할 특정 데몬명과 특정 IP를 정할 수 있다

[데몬명:IP]

/etc/hosts.allow 파일에 들어갑니다
테스트로 텔넷의 데몬명을 적고 뒤에는 허용할 IP의 주소를 적어줍니다
텔넷으로의 모든 접근을 허용한다

'리눅스' 카테고리의 다른 글

리눅스 Iptables  (0) 2020.09.22
Zeroboard( 제로보드 )  (0) 2020.09.19
리눅스 APM  (0) 2020.09.18
리눅스 demon(데몬)  (0) 2020.09.18
리눅스 rpm과 yum  (0) 2020.09.18

Zeroboard( 제로보드 )
: 제로보드는 PHP와 MySQL이 지원되는 서버에 설치하여 사용하는 게시판이다

- www.xpressengine.com/

- 자신이 계정에 직접 설치를 하여 이용
- MySQL 데이터베이스 시스템을 사용하여 자료의 추출, 가공, 이식, 보관이 매우 용이
- 내부 소스 프로그램 수정없이 스킨만을 사용하여 게시판의 출력형태를 가공

Zeroboard Install

 

- xe 파일 확보 

 

크롭으로 사이트에 접속한 뒤 다운로드 버튼에 우클릭하고 링크 주소 복사 클릭

 

- 서버에서 압축 풀기

/var/www/html 에 들어가서 wget을 이용해 다운을 받아준다

 

- 파일 이름을 변경해준다

mv를 사용하여 파일 이름을 "xe.zip"으로 변경해준다

 

- xe 파일 압축 해제

unzip을 사용하여 "xe.zip" 파일에 압축을 풀어준다

 

- xe 디렉토리 사용권한 변경

chmod를 사용하여 권한을 777로 변경해준다


- MySQL DB 제로보드 DB 데이터 추가

mysql에 들어가서 create를 사용하여 "zero" 데이터베이스를 만들어준다

 

- MySQL DB 제로보드 DB 데이터 활성화 인식

privileges를 사용하여 활성화가 되었는지 확인해준다


웹 브라우저에서 제로보드 설치 시작

- http://서버IP/xe

웹 주소창에 http://[서버IP]/xe 를 접고 접속

 

- 설치시작(localhost, root, 학생, mysql)

언어는 한국어를 체크하고 다음으로 넘어가준다

 

사용권에 동의하고 다음으로 넘어가준다

 

설치 조건들을 확인하고 부족한게 있으면 해결해주고 설치를 진행한다

 

mysqli를 체크해주고 다음으로 넘어가준다

 

만들어 주었던 DB아이디, 비밀번호, 이름을 작성해주고 아래는 똑같이 작성해준다

 

한국 시간을 선택해주고 다음으로 넘어갑니다

 

이메일 주소는 아무거나 적어주고 비밀번호를 조건에 맞춰 작성한 뒤 닉네임과 아이디를 적고 완료를 눌러줍니다


- 제로보드 관리자 설정

http://[서버IP]/xe/admin 을 적어주고 관리자 설정 모드에 들어갑니다

 

설치 완료되면 관리자 웹으로 이동

- http://서버IP/xe

설치를 다해주고 접속 완료한 모습입니다

'리눅스' 카테고리의 다른 글

리눅스 Iptables  (0) 2020.09.22
Tcp Wrapper  (0) 2020.09.22
리눅스 APM  (0) 2020.09.18
리눅스 demon(데몬)  (0) 2020.09.18
리눅스 rpm과 yum  (0) 2020.09.18

APM
: Apache(웹서버) + PHP(언어) + MySQL(database) = APM 이라고 말할 수 있다

Apache
- 정식명칭 : Apache HTTP server
- 관련 홈페이지 :  www.apache.org
- GUN GPL 라이센스를 통해 무료로 배포되는 소프트웨어이다
- 현재 50% 이상의 웹서버 소프트에어 시장 점유율을 확보하고 있다
- 안정적으로 작동한다
- 아파치 서버 프로그램 등의 관련 컴포넌트들의 소스코드가 무료로 제공된다
- 유연성이 좋고 이식성이 뛰어나 여러 응용분야에서 적용된다

PHP
- 웹 프로그래밍을 위한 스크립트 언어
- 1994년 일반적으로 다른 언어와 혼합 사용되며 시작되었다
- PHP(70%) + HTML(25%) + JavaScript(5%)
- 처리 속도가 빠르다
- 공개 S/W
- 운영체제의 지원 폭이 크다
- 많은 데이터베이스와 연동 지원

SQL
- DB에서 사용되는 표준 구조적 쿼리언어
- 데이터 추출과 출력, 데이터베이스 구조 정의 등의 데이터베이스 관리를 위한 언어

MySQL
- SQL을 지원하는 공개 데이터베이스 소프트웨어
- 처리속도가 빠르다

APM 설치 확인
#rpm -qa | grep httpd
#rpm -qa | grep php
#rpm -qa | grep mysql

패키지 검색
#yum search httpd
#yum search php
#yum search mysql
#yum search mysql-server

패키지 설치
#yum -y install httpd php mysql mysql-server gd gd-devel php-gd php-mysql

'리눅스' 카테고리의 다른 글

Tcp Wrapper  (0) 2020.09.22
Zeroboard( 제로보드 )  (0) 2020.09.19
리눅스 demon(데몬)  (0) 2020.09.18
리눅스 rpm과 yum  (0) 2020.09.18
리눅스 vi(vim)편집기 사용법  (0) 2020.09.18

+ Recent posts