C#で以下のようなすごろくゲームを作ってみよう!
[enter]とある部分は入力待ちで停止し、エンターキーを入力すると先に進むことを意味する。
なお、サイコロの目は1~6である。
実行例
スゴロクゲーム あなたの番です。[enter] 4が出ました ••••P•••••••••G C•••••••••••••G comの番です。[enter] 4が出ました ••••P•••••••••G ••••C•••••••••G あなたの番です。[enter] 3が出ました •••••••P••••••G ••••C•••••••••G comの番です。[enter] 1が出ました •••••••P••••••G •••••C••••••••G あなたの番です。[enter] 3が出ました ••••••••••P•••G •••••C••••••••G comの番です。[enter] 5が出ました ••••••••••P•••G ••••••••••C•••G あなたの番です。[enter] 6が出ました ••••••••••••••P ••••••••••C•••G あなたの勝ちです
解答例(オブジェクト指向を使わないバージョン)
using System;
using System.Linq;
namespace sugoroku {
class MainClass {
const int GOAL_POS= 15;
public static void Main(string[] args) {
Random rand = new Random();
string[] names = { "あなた", "com" };
string[] marks = { "P", "C" };
int[] playersPos = { 1, 1};
int playersCount = names.Length;
Console.WriteLine("スゴロクゲーム");
for(int i=0; ; i++) {
Console.Write($"{names[i % playersCount]}の番です。");
Console.ReadLine();
int dice = rand.Next(1, 7);
Console.WriteLine($"{dice}が出ました");
playersPos[i % playersCount] += dice;
bool isGoal = false;
if (playersPos[i % playersCount] >= GOAL_POS) {
playersPos[i % playersCount] = GOAL_POS;
isGoal = true;
}
for(int j = 0; j < playersCount; j++) {
DisplayPos(marks[j % playersCount], playersPos[j % playersCount], GOAL_POS);
}
if (isGoal) {
Console.WriteLine($"{names[i% playersCount]}の勝ちです");
break;
}
}
}
static void DisplayPos(string mark,int pos,int goalPos) {
for(int i = 1; i <=goalPos; i++) {
if (pos != goalPos && i == goalPos) {
Console.Write("G");
} else if(i==pos){
Console.Write(mark);
} else {
Console.Write("•");
}
}
Console.WriteLine();
}
}
}
オブジェクト指向を使うバージョン
using System;
using System.Collections.Generic;
namespace sugorokuOOP {
class MainClass {
public static void Main(string[] args) {
Random rand = new Random();
var players = new List<Player> {
new Player("あなた","P",1),
new Player("com","C",1),
//new Player("hoge","H",1)
};
Console.WriteLine("スゴロクゲーム");
for(int i=0; ; i++) {
Player currentPlayer = players[i % players.Count];
Console.Write($"{currentPlayer.Name}の番です。");
Console.ReadLine();
int num = rand.Next(1, 7);
Console.WriteLine($"{num}がでました。");
currentPlayer.Move(num);
players.ForEach(v => v.DisplayPos());
if (currentPlayer.IsGoal) {
Console.WriteLine($"{currentPlayer.Name}の勝ちです。");
break;
}
}
}
}
class Player {
const int GOAL_POS = 15;
public string Name { get; set; }
public string Mark { get; set; }
public int Pos { get; set; }
public bool IsGoal { get; set; }
public Player(string name, string mark, int pos) {
Name = name;
Mark = mark;
Pos = pos;
}
public void Move(int num) {
Pos = Math.Min(Pos + num, GOAL_POS);
if (Pos == GOAL_POS) {
IsGoal = true;
}
}
public void DisplayPos() {
for (int i = 1; i <= GOAL_POS; i++) {
if (Pos != GOAL_POS && i == GOAL_POS) {
Console.Write("G");
} else if (i == Pos) {
Console.Write(Mark);
} else {
Console.Write("•");
}
}
Console.WriteLine();
}
}
}
コメント