概要
記事を読んでいただきありがとうございます。
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;
}