LoginSignup
0
0

C言語でオセロゲームとじゃんけんの作成

Last updated at Posted at 2024-02-23

概要

記事を読んでいただきありがとうございます。
cの勉強を目的にゲームを作成しましたので、
ゲームの質にはこだわっておりません。
メモ書き程度に書いておりますのでご了承下さい。

今回はC言語でオセロを作成しています。

GitHub

コードは上記にあります。

メイン関数(オセロ)

void main(void) {
    struct BOARD board;
    board.turn = true;
    setup(); //最初の〇×を配置
    show(); //碁盤を表示
    do
    {
        select(&board); //置けるマス目を選択
        reverse(&board); //碁盤をひっくり返す
        stone_sum(&board); //碁盤の合計計算
        show();
        pc_expe(); //pcの置く場所の候補を決める
        pc_put(); //pcの碁盤を置く
        show();
        stone_sum(&board);
    } while (finish_flag == false || (me_not_put_flag == true && pc_not_put_flag == true));
    
}

メイン関数(じゃんけん)

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


typedef struct JANKEN
{
    int me;
    int pc;
    bool input_flag;
    bool finish_flag;
}JANKEN;

typedef enum SELECT{
    LOCK,PAPER,SCISSORS
}SELECT;

int main(void){
    JANKEN janken;
    janken.me = -1;
    janken.pc = -1;
    janken.input_flag = false;
    janken.finish_flag = false;

    do
    {
        //自分の出し手
        do
        {
            printf("Lock:0,Paper:1,Scissors:2\n");
            scanf("%d",&janken.me);
            if (janken.me == LOCK || janken.me == PAPER || janken.me == SCISSORS)                    
                janken.input_flag = true;
            switch (janken.me)
            {
                case LOCK:
                    printf("you select LOCk\n");
                    break;
                case PAPER:
                    printf("you select PAPER\n");
                    break;
                case SCISSORS:
                    printf("you select SCISSORS\n");
                    break;
                
                default:
                    break;
            }
        } while (janken.input_flag == false);


        //PCの出し手
        srand((unsigned int)time(NULL));
        janken.pc = rand() % 3;

        switch (janken.pc)
            {
                case LOCK:
                    printf("PC select LOCk\n");
                    break;
                case PAPER:
                    printf("PC select PAPER\n");
                    break;
                case SCISSORS:
                    printf("PC select SCISSORS\n");
                    break;
                
                default:
                    break;
            }

        if (janken.me == janken.pc)
            janken.finish_flag = false,
            printf("draw\n");

        else
        {
            switch(janken.me){
                case LOCK:
                    if (janken.pc == PAPER) janken.finish_flag = true, printf("lose\n");
                    if (janken.pc == SCISSORS) janken.finish_flag = true, printf("win\n");
                    break;
                case PAPER:
                    if (janken.pc == SCISSORS)janken.finish_flag = true,printf("lose\n");
                    if (janken.pc == LOCK)janken.finish_flag = true,printf("win\n");
                    break;
                case SCISSORS:
                    if (janken.pc == LOCK)janken.finish_flag = true,printf("lose\n");
                    if (janken.pc == PAPER)janken.finish_flag = true,printf("win\n");
                    break;
                default:
                    break;
            }
        }
        
    }while(janken.finish_flag == false);
        
}

ジャンケンゲーム(サイトを参考)

以下のサイトを参考とさせていただきました。
enumの使用方法が分かりやすく、
他にもゲームの実装例が多数掲載されていてとても参考になりました。

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

typedef enum _hand {
    HAND_ROCK = 0,
    HAND_SCISSORS,
    HAND_PAPER,
    HAND_NUM
} HAND;

typedef enum _result {
    RESULT_DRAW,
    RESULT_YOU_WIN,
    RESULT_YOU_LOSE,
    RESULT_NUM
} RESULT;

static RESULT result_table[HAND_NUM][HAND_NUM];
static char *hand_strs[HAND_NUM];
static char *result_strs[RESULT_NUM];


void init(void) {
    // 乱数の初期化
    srand((unsigned int)time(NULL));

    // result_table[player_hand][com_hand]にプレイヤーの結果を格納
    result_table[HAND_ROCK][HAND_ROCK] = RESULT_DRAW;
    result_table[HAND_ROCK][HAND_SCISSORS] = RESULT_YOU_WIN;
    result_table[HAND_ROCK][HAND_PAPER] = RESULT_YOU_LOSE;
    result_table[HAND_SCISSORS][HAND_ROCK] = RESULT_YOU_LOSE;
    result_table[HAND_SCISSORS][HAND_SCISSORS] = RESULT_DRAW;
    result_table[HAND_SCISSORS][HAND_PAPER] = RESULT_YOU_WIN;
    result_table[HAND_PAPER][HAND_ROCK] = RESULT_YOU_WIN;
    result_table[HAND_PAPER][HAND_SCISSORS] = RESULT_YOU_LOSE;
    result_table[HAND_PAPER][HAND_PAPER] = RESULT_DRAW;

    hand_strs[HAND_ROCK] = "ROCK";
    hand_strs[HAND_SCISSORS] = "SCISSORS";
    hand_strs[HAND_PAPER] = "PAPER";

    result_strs[RESULT_DRAW] = "DRAW";
    result_strs[RESULT_YOU_WIN] = "WIN";
    result_strs[RESULT_YOU_LOSE] = "LOSE";
}

HAND getComHand(void) {
    return rand() % HAND_NUM;
}

HAND getPlayerHand(void) {

    HAND player_hand;

    while (1) {
        printf("HOW INPUT??0:ROCK,1:SCISSORS,2:PAPER");
        scanf("%d", &player_hand);

        if (player_hand >= HAND_NUM || player_hand < 0) {
            printf("AGEIN INPUT NUM\n\n");
        } else {
            break;
        }
    }
    printf("\n");

    return player_hand;
}

RESULT getResult(HAND player_hand, HAND com_hand) {
    return result_table[player_hand][com_hand];
}

void printHand(HAND hand) {
    printf("%s\n", hand_strs[hand]);
}

void printResult(RESULT result) {

    printf("RESULT>>>");
    printf("%s\n", result_strs[result]);
}


int main(void) {

    HAND player_hand;
    HAND com_hand;
    RESULT result;

    init();

    do {
        // コンピューターが出す手を決定する
        com_hand = getComHand();

        // プレイヤーが出す手の入力を受け付ける
        player_hand = getPlayerHand();
        
        // プレイヤーとコンピューターが出した手を表示する
        printf("YOUR HAND:");
        printHand(player_hand);

        printf("PC HAND:");
        printHand(com_hand);

        printf("\n");

        // じゃんけんの結果を判断する
        result = getResult(player_hand, com_hand);

        // じゃんけんの結果を表示する
        printResult(result);
        printf("\n");

    } while (result == RESULT_DRAW);

}


C++ じゃんけんゲーム(他のサイト参考)

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

enum {ROCk = 1,SCISSORS = 2,PAPER  =3};
enum {HANDS = 3};
class Player {
    protected:
        int hand;
    public:
        const char *name;
        Player (const char name[]){
            this->name = name;
        }
        virtual void janken() = 0;
        void pon(){
            cout << name << ">>>output hand";
            if (hand == ROCk)
            {
                cout << "ROCk" << endl;
            }else if(hand == SCISSORS){
                cout << "SCISSORS" << endl;
            }else if(hand == PAPER){
                cout << "PAPER" << endl;
            }
            
        }
        bool is_win(Player *opponent){
            return hand == ROCk && opponent->hand == SCISSORS ||
                hand == SCISSORS && opponent->hand == PAPER ||
                hand == PAPER && opponent->hand == ROCk ;
        }
};


class Human : public Player {
    public:
        using Player::Player;
        void janken(){
            do
            {
                cout << "SELECK 1:ROCk,2:SCISSORS,3:PAPER";
                cin >> hand;
            } while (hand != ROCk && hand != SCISSORS &&hand != PAPER);
            
        }
};

class Computer : public Player {
    public:
        using Player::Player;
        void janken(){
            hand = rand() % HANDS + 1;
        }

};

int main(){
    srand((unsigned) time (NULL));
    Player *you = new Human("you");
    Player *com = new Computer("PC");
    int replay;
    do
    {
        you->janken();
        com->janken();
        you->pon();
        com->pon();
        if (you->is_win(com))
        {
            cout <<you->name<<">>win"<<endl;
        }
        else if (com->is_win(you))
        {
            cout << you->name<<">>lose"<<endl;
        }
        else
        {
            cout <<">>draw"<<endl;
        }
        cout <<"AGAIN ?? 1:yes,2:no>>";
        cin >> replay;

        
        
    } while (replay == 1);
    
    cout << "finish" <<endl;
    delete you;
    delete com;
    return 0;
}
0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0