-
[TIL]C# 강의 과제 정리TIL 2024. 4. 25. 21:21
2강 과제
더보기2 -1 숫자맞추기 게임
static void RandomNum() { Random random = new Random(); int numberToGuess = random.Next(1, 101); int count = 0; Console.WriteLine("숫자 맞추기 게임을 시작합니다. 1에서 100까지의 숫자 중 하나를 맞춰보세요."); while (true) { Console.Write("숫자를 입력하세요: "); int i = int.Parse(Console.ReadLine()); count++; if (i == numberToGuess) { Console.Write("축하합니다! {0}번 만에 숫자를 맞추었습니다.", count); break; } else if (i > numberToGuess) { Console.WriteLine("너무 큽니다!"); } else if (i < numberToGuess) { Console.WriteLine("너무 작습니다!"); } } }
1~100까지 랜덤한 숫자가 정해지고 플레이어가 숫자를 맞추는 게임입니다.
정해진 숫자보다 크거나 작으면 문장을 출력해 힌트를 주고
정해진 숫자를 맞추면 몇 번만에 맞췄는지 출력하고 종료되는 프로그램 입니다.
2 - 2 틱택토
static int order = 1;//플레이어 순서 static int count = 0;//횟수 static int[,] map = new int[3, 3] { {1,2,3 }, {4,5,6 }, {7,8,9 }, }; static void TicTacToe() { char mark = ' ';//표식 int mapNum;//승리판단을 위한 변수 int[ ] arr = new int[9];//중복 확인을 위한 배열 Console.WriteLine("플레이어 1:X 와 플레이어 2:O\n"); Console.WriteLine("플레이어 {0}의 차례\n", order); //틱택토 보여주기 MapCreate(); while (true) { if (order == 1) { mark = 'X'; mapNum = 10; } else { mark = 'O'; mapNum = 20; } //해당하는 위치 입력받기 int num=int.Parse(Console.ReadLine()); Console.SetCursorPosition(0, 15); if (arr[num - 1] != num) { arr[num - 1] = num; CheckMark(num, mark, mapNum); } else { continue; } //콘솔 위치 확인 if (count>=3) { //카운트가 9거나 게임에 결과 값이 나왔다면 종료해야함 if (CheckWinner(mapNum)==true|| count == 9) { break; } } //차례바꾸기 Console.SetCursorPosition(9, 2); switch (order) { case 1: order = 2; break; case 2: order = 1; break; } Console.Write(order); Console.SetCursorPosition(0, 15); } } static bool CheckWinner(int mapNum) { Console.SetCursorPosition(0, 15); // 123 456 789 147 258 369 159 357 //승리 패턴중 하나라도 true이면 현재 플레이어가 승리 if ( (map[0, 0]== mapNum && map[0, 1]== mapNum&& map[0, 2] == mapNum) || (map[1, 0] == mapNum && map[1, 1] == mapNum&& map[1, 2] == mapNum)|| (map[2, 0] == mapNum && map[2, 1] == mapNum && map[2, 2] == mapNum) || //세로 (map[0, 0] == mapNum && map[1, 0] == mapNum && map[2, 0] == mapNum) || (map[0, 1] == mapNum&& map[1, 1] == mapNum&& map[2, 1] == mapNum) || (map[0, 2] == mapNum &&map[1, 2] == mapNum&& map[2, 2] == mapNum )|| //가로 (map[0, 0] == mapNum && map[1, 1] == mapNum && map[2, 2] == mapNum) || (map[0, 2] == mapNum&&map[1, 1] == mapNum&& map[2, 0] == mapNum)) //대각선 { Console.WriteLine("플레이어{0}가 승리했습니다!",order); return true; } else if(count==9) { Console.WriteLine("비겼습니다."); return true; } else { for (int i = 0; i < 3; i++) { } return false; } } static void CheckMark(int num,char mark,int mapNum) { switch (num) { case 1: Console.SetCursorPosition(2, 5); map[0, 0] = mapNum; break; case 2: Console.SetCursorPosition(8, 5); map[0, 1] = mapNum; break; case 3: Console.SetCursorPosition(14, 5); map[0, 2] = mapNum; break; case 4: Console.SetCursorPosition(2, 9); map[1, 0] = mapNum; break; case 5: Console.SetCursorPosition(8, 9); map[1, 1] = mapNum; break; case 6: Console.SetCursorPosition(14, 9); map[1, 2] = mapNum; break; case 7: Console.SetCursorPosition(2, 13); map[2, 0] = mapNum; break; case 8: Console.SetCursorPosition(8, 13); map[2, 1] = mapNum; break; case 9: Console.SetCursorPosition(14, 13); map[2, 2] = mapNum; break; default: //이상한 숫자 들어올 시 나감 return; } //차례에 맞는 기호 입력 Console.Write(mark); count++; } static void MapCreate() { Console.WriteLine(" | | "); Console.WriteLine(" {0} | {1} | {2} ", map[0,0], map[0, 1], map[0, 2]); Console.WriteLine(" | | "); Console.WriteLine("-----|-----|-----"); Console.WriteLine(" | | "); Console.WriteLine(" {0} | {1} | {2} ", map[1, 0], map[1, 1], map[1, 2]); Console.WriteLine(" | | "); Console.WriteLine("-----|-----|-----"); Console.WriteLine(" | | "); Console.WriteLine(" {0} | {1} | {2} ", map[2, 0], map[2, 1], map[2, 2]); Console.WriteLine(" | | "); } }
C# 아직 배운지 얼마 안되기도 했고 지식 소화되기도 전에 만든 틱택토 입니다.
이거 짜느라 새벽3시까지 분투했었습니다.
Main()에 TicTackToe(); 넣어주면 실행 됩니다.
배운지 얼마안되서 어영부영 만든 느낌이 많아서 나중에 리메이크 해보고 싶습니다.
3강 과제
더보기3-1 스네이크 게임만들기 (미완성입니다.)
using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Security.Cryptography; using System.Threading; using System.Xml.Linq; namespace ConsoleApp1 { internal class Program { static void Main(string[] args) { int foodCount = 0;//음식 먹은 횟수 CreateMap(ref foodCount); // 뱀의 초기 위치와 방향을 설정하고, 그립니다. Point p = new Point(14, 7, '*');//초기 위치 Snake snake = new Snake(p, 1, Direction.RIGHT);//위치와 방향 snake.Draw();//그리기 // 음식의 위치를 무작위로 생성하고, 그립니다. FoodCreator foodCreator = new FoodCreator(80, 20, '$'); Point food = foodCreator.CreateFood(); food.Draw(); // 게임 루프: 이 루프는 게임이 끝날 때까지 계속 실행됩니다. while (true) { //음식을 먹었을 때 if (snake.IsHit(food, ref foodCount)) { food = foodCreator.CreateFood(); food.Draw(); } else { //지나온길 지우기 // snake.ErasePath(); } // 키 입력이 있는 경우에만 방향을 변경합니다. ConsoleKeyInfo Inputkey = Console.ReadKey(true); switch (Inputkey.Key) { case ConsoleKey.UpArrow: snake.Move(Direction.UP); break; case ConsoleKey.DownArrow: snake.Move(Direction.DOWN); break; case ConsoleKey.RightArrow: snake.Move(Direction.RIGHT); break; case ConsoleKey.LeftArrow: snake.Move(Direction.LEFT); break; } // 뱀이 이동하고, 음식을 먹었는지, 벽이나 자신의 몸에 부딪혔는지 등을 확인하고 처리하는 로직을 작성하세요. // 이동, 음식 먹기, 충돌 처리 등의 로직을 완성하세요. //맵에 충돌했다면 if ((Console.GetCursorPosition().Left>=37|| Console.GetCursorPosition().Left<=1)|| (Console.GetCursorPosition().Top >= 13 || Console.GetCursorPosition().Top <= 1)) { //Console.WriteLine(Console.GetCursorPosition()); GameOver(); break; } // Thread.Sleep(1); // 게임 속도 조절 (이 값을 변경하면 게임의 속도가 바뀝니다) // 뱀의 상태를 출력합니다 (예: 현재 길이, 먹은 음식의 수 등) } } static void CreateMap(ref int food) { Console.SetCursorPosition(0, 0); Console.WriteLine(" 스네이크 게임 "); Console.WriteLine("-------------------------------------- 뱀의길이:{0}",food+1); Console.WriteLine("| | 먹은음식의 수:{0}",food); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("--------------------------------------"); } static void GameOver() { Console.SetCursorPosition(0, 0); Console.WriteLine(" 스네이크 게임"); Console.WriteLine("--------------------------------------"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| Game Over |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("| |"); Console.WriteLine("--------------------------------------"); } } } public class Snake { public List<Point> body=new List<Point>(); int length { get; set; } Direction Direction { get; set; } public Snake(Point _point, int _length, Direction _direction) { body.Add(_point); length = _length; Direction = _direction; } public void ErasePath() { //지나온길 지우기 Console.SetCursorPosition(body[length - 1].x, body[length - 1].y); Console.Write(" "); } public void Draw() { for(int i=0; i<length;i++) { //몸통의 좌표 Console.SetCursorPosition(body[i].x, body[i].y); Console.Write(body[i].sym); } } public bool IsHit(Point p,ref int count)//뱀이 음식 좌표와 같은지 판별 { if(body[0].x == p.x && body[0].y == p.y) { Console.SetCursorPosition(55, 2);//먹은 음식수 추가 count++; Console.Write(count); //원래 커서 포지션으로 돌리기 Console.SetCursorPosition(body[length - 1].x, body[length - 1].y); } return (body[0].x == p.x && body[0].y == p.y); } public void Grow() { // Console.SetCursorPosition(body[length - 1].x, body[length - 1].y); // Console.Write("*"); // body.Add(new Point(body[length - 1].x, body[length - 1].y, body[0].sym)); // length++; } public void Move(Direction _direction) { Direction = _direction; switch(Direction) { case Direction.UP: body[0].y -= 1; break; case Direction.DOWN: body[0].y += 1; break; case Direction.LEFT: body[0].x -= 1; break; case Direction.RIGHT: body[0].x += 1; break; } Draw(); } } public class FoodCreator { int x { get; set; } int y { get; set; } char sym { get; set; } //FoodCreator 생성자 public FoodCreator(int _x, int _y, char _sym) { x = _x; y = _y; sym = _sym; } public Point CreateFood() { Random random = new Random(); x = random.Next(1, 37); y = random.Next(2, 13); return new Point(x,y,sym); } } public class Point { public int x { get; set; } public int y { get; set; } public char sym { get; set; } // Point 클래스 생성자 public Point(int _x, int _y, char _sym) { x = _x; y = _y; sym = _sym; } // 점을 그리는 메서드 public void Draw() { Console.SetCursorPosition(x, y); Console.Write(sym); } // 점을 지우는 메서드 public void Clear() { sym = ' '; Draw(); } // 두 점이 같은지 비교하는 메서드 public bool IsHit(Point p) { return p.x == x && p.y == y; } } // 방향을 표현하는 열거형입니다. public enum Direction { LEFT, RIGHT, UP, DOWN }
너무 어려웠고 이 과제 할 때 하나도 모르겠어서 엄청 우울했습니다 (너무어려워요 갈피를 못잡았습니다.)
먹이 먹고 카운트되고 먹이가 다시 랜덤으로 생성되는거 외에는 거의 다 작동이 이상합니다.
3-2 블랙잭
using System; using System.Collections.Generic; using System.Numerics; //카드문양 public enum Suit { Hearts, Diamonds, Clubs, Spades } //카드 숫자 public enum Rank { Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace } public class Card { public Suit Suit { get; private set; } public Rank Rank { get; private set; } //카드 생성자 public Card(Suit s, Rank r) { Suit = s; Rank = r; } //enum을 계산하기 쉽게 숫자로 표시 public int GetValue() { //카드 숫자가 10 이하거나 같다면 if ((int)Rank <= 10) { return (int)Rank; } //카드가 13보다 같거나 작다면 else if ((int)Rank <= 13) { return 10; } //둘다 아니라면 else { return 11; } } //카드의 이름과 종류 public override string ToString() { return $"{Rank} of {Suit}"; } } // 덱을 표현하는 클래스 public class Deck { private List<Card> cards; public Deck() { cards = new List<Card>(); foreach (Suit s in Enum.GetValues(typeof(Suit))) { foreach (Rank r in Enum.GetValues(typeof(Rank))) { cards.Add(new Card(s, r)); } } Shuffle(); } //카드를 섞고 리스트에 넣는다. public void Shuffle() { Random rand = new Random(); for (int i = 0; i < cards.Count; i++) { int j = rand.Next(i, cards.Count); Card temp = cards[i]; cards[i] = cards[j]; cards[j] = temp; } } public Card DrawCard() { Card card = cards[0]; cards.RemoveAt(0); return card; } } // 패를 표현하는 클래스 public class Hand { private List<Card> cards; public Hand() { cards = new List<Card>(); } public void AddCard(Card card) { cards.Add(card); } public int GetTotalValue() { int total = 0; int aceCount = 0; foreach (Card card in cards) { if (card.Rank == Rank.Ace) { aceCount++; } total += card.GetValue(); } while (total > 21 && aceCount > 0) { total -= 10; aceCount--; } return total; } } // 플레이어를 표현하는 클래스 public class Player { public Hand Hand { get; private set; } public List<int> getCards= new List<int>(); public Player() { Hand = new Hand(); } //플레이어 카드 받기 public Card DrawCardFromDeck(Deck deck) { Card drawnCard = deck.DrawCard(); Hand.AddCard(drawnCard); getCards.Add(drawnCard.GetValue()); return drawnCard; } public void ShowCard(string _order) { Console.Write("{0}가 가진 카드:",_order); for(int i=0; i<getCards.Count;i++) { if(i== getCards.Count-1)//마지막 쉼표제거 { Console.Write(" {0}", getCards[i]); } else { Console.Write(" {0},", getCards[i]); } } Console.WriteLine(); } } // 여기부터는 학습자가 작성 // 딜러 클래스를 작성하고, 딜러의 행동 로직을 구현하세요. public class Dealer:Player { public Dealer() { } public void DealerDrawCard(Deck deck) { while(Hand.GetTotalValue()<=17) { //카드받고 추가? Hand.AddCard(DrawCardFromDeck(deck)); } ShowCard("Dealer"); Console.WriteLine("Dealer 카드의 총 합:{0}", Hand.GetTotalValue()); } } // 블랙잭 게임을 구현하세요. public class Blackjack { public Blackjack() { } public bool CheckBlackJack(int value,string _order,ref bool _gameEnd) { if(value==21) { Console.WriteLine("\n{0}가 이겼습니다.",_order); _gameEnd = true; return true; } else if(value>21) { Console.WriteLine("\n{0}가 총 합 {1}로 졌습니다.", _order,value); _gameEnd = true; return true; } else { return false; } } public void CheckWinner(int player, int dealer, ref bool _gameEnd) { if(player==dealer) { Console.WriteLine("\n비겼습니다."); } else if (player > dealer) { Console.WriteLine("\nPlayer가 이겼습니다."); } else if (player < dealer) { Console.WriteLine("\nDealer가 이겼습니다."); } _gameEnd = true; } } //1.카드를 섞는다 //2.플레이어와 딜러에게 카드를 두장씩 나눠준다 //3.플레이어와 딜러는 추가로 카드를 더 받을 수 있다. (이떄 21넘으면 플레이어 패배) //4.딜러가 카드 받는것을 멈추면 딜러가 원하는만큼(대략 17 되기전까지) 카드를 뽑는다(이때 21넘으면 플레이어가 승리) //5.둘다 21을 안넘는다는 가정하에 21에 근접한 사람이 승리 namespace BlackJack { internal class Program { static void Main(string[] args) { Deck deck =new Deck(); //생성자가 자동으로 카드를 섞어줌 Dealer dealer = new Dealer(); Player player = new Player(); Blackjack blackjack = new Blackjack(); bool gameEnd=false; //string order = ""; //처음 플레이어와 딜러에게 카드 두장을 나눠줘야 한다. for(int i = 0; i<2;i++) { player.DrawCardFromDeck(deck); //플레이어에게 카드 주기 dealer.DrawCardFromDeck(deck); //딜러에게도 카드 주기. } player.ShowCard("Player"); dealer.ShowCard("Dealer"); //Console.WriteLine(player.Hand.GetTotalValue()); //Console.WriteLine(dealer.Hand.GetTotalValue()); //여기서 21이 같거나 넘는 사람이 있는지 확인 blackjack.CheckBlackJack(player.Hand.GetTotalValue() , "Player",ref gameEnd); blackjack.CheckBlackJack(dealer.Hand.GetTotalValue() , "Dealer",ref gameEnd); while(gameEnd==false) { //문제가 없다면 카드를 더 받을 것인지 물어봐야함. Console.WriteLine("\n카드를 더 받고싶다면 1번, 아니라면 2번을 입력해주세요."); int answer = int.Parse(Console.ReadLine()); switch (answer) { case 1: Console.WriteLine("카드를 한장 더 받습니다.\n"); player.DrawCardFromDeck(deck); //플레이어에게 카드 주기 player.ShowCard("Player"); break; case 2: Console.WriteLine("딜러가 카드를 뽑습니다.\n"); dealer.DealerDrawCard(deck);//딜러가 카드뽑기 blackjack.CheckBlackJack(dealer.Hand.GetTotalValue(), "Dealer", ref gameEnd); if(gameEnd!=true) blackjack.CheckWinner(player.Hand.GetTotalValue(), dealer.Hand.GetTotalValue(), ref gameEnd);//누가 이겼는지 체크 break; default: Console.WriteLine("유효한 숫자가 아닙니다.\n"); continue; } blackjack.CheckBlackJack(player.Hand.GetTotalValue(), "Player", ref gameEnd ); } } } }
Class와 Struct를 배우면서 나온 과제입니다.
어느정도 기반 코드를 제공받고 작성한거라 위에 과제보다는 빠르게 끝낼 수 있었지만
팀원 분 말씀으로는 버그가 있다 하네요...이것도 나중에 시간나면 확인 후 리메이크 할 예정입니다.
개인과제 (RPGTextGame)
더보기using System; using System.Collections.Generic; using System.Diagnostics; using System.Security.Authentication; using static DungeonRPG.IDK; namespace DungeonRPG { internal interface IDK { static void Main(string[] args) { Player player = new Player(); Shop shop = new Shop(); Inventory inventory = new Inventory(); //이름설정 Console.Write("사용하실 플레이어 이름을 입력해주세요: "); player.name = Console.ReadLine(); //직업설정 Console.Clear(); Console.Write("시작하실 직업을 선택해주세요:\n0.전사 \n1.마법사 \n2. 궁수\n "); int job = CheckInput(0, 2); switch (job)//직업에 따라 초기 스탯 변경해도 좋을것 같다.(미구현) { case 0: player.job = "전사"; break; case 1: player.job = "마법사"; break; case 2: player.job = "궁수"; break; } //게임시작 while (true) { Console.Clear(); Console.WriteLine("스파르타 마을에 오신 여러분 환영합니다."); Console.WriteLine("이곳에서 던전으로 들어가기전 활동을 할 수 있습니다."); Console.WriteLine("\n1. 상태보기"); Console.WriteLine("2. 인벤토리"); Console.WriteLine("3. 상점"); Console.WriteLine("\n원하시는 행동을 입력해주세요."); //잘못된 입력인지 출력 int answer = CheckInput(1, 3); switch (answer) { case 1: //상태보기 player.ShowStat(inventory.attackStat, inventory.defenseStat); break; case 2://인벤토리 열기 inventory.OpenInventory(); break; case 3: //상점 열기 shop.EnterShop(ref player.gold, ref inventory.inventoryItem); break; } } } class Player { int level = 01; public string name="말하는감자"; public string job = ""; int attack=10; int defense=5; int health=100; public int gold=1500; //플레이어의 스탯을 출력 public void ShowStat(int _addAttack, int _addDefense) { Console.Clear(); Console.WriteLine("상태 보기\n"); Console.WriteLine($"Lv. {level}"); Console.WriteLine($"{name} ({job})"); //장비 장착시 출력 변경 if (_addAttack > 0) { Console.WriteLine("공격력 : {0} + ({1})", attack + _addAttack, _addAttack); } else { Console.WriteLine($"공격력 : {attack}"); } if (_addDefense > 0) { Console.WriteLine("방어력 : {0} + ({1})",defense+_addDefense,_addDefense); } else { Console.WriteLine($"방어력 : {defense}"); } Console.WriteLine($"체 력 : {health}"); Console.WriteLine($"Gold : {gold}\n"); Console.WriteLine("0. 나가기\n"); Console.WriteLine("원하시는 행동을 입력해주세요"); CheckInput(0,0); } } class Inventory { public List <Item> inventoryItem = new List<Item>(); string icon = "[E]"; //착용을 표시하기 위한 아이콘 bool equip = false; public int attackStat = 0; public int defenseStat = 0; //인벤토리창 출력 void InvetoryDialogue() { Console.Clear(); Console.WriteLine("인벤토리\n"); Console.WriteLine("아이템 목록"); for (int i = 0; i < inventoryItem.Count(); i++) { if (equip == true) { Console.Write($"-{i + 1} "); if (inventoryItem[i].itemEquip==true) { Console.Write(icon); } } else { Console.Write("-"); if (inventoryItem[i].itemEquip == true) { Console.Write(icon); } } Console.WriteLine($"{inventoryItem[i].itemName} | {inventoryItem[i].itemType} +{inventoryItem[i].itemStat} | {inventoryItem[i].itemDescript}"); } Console.WriteLine(); if(equip == false) { Console.WriteLine("1. 장착 관리"); } Console.WriteLine("0. 나가기\n"); Console.WriteLine("원하시는 행동을 입력해주세요"); } //장비의 장착과 해제를 담당 void ItemManagement(int _order) { InvetoryDialogue(); if (inventoryItem[_order-1].itemEquip==false)//아이템 장착 { inventoryItem[_order-1].itemEquip = true; if(inventoryItem[_order-1].itemType == "방어력") { defenseStat += inventoryItem[_order - 1].itemStat; } else //공격력 { attackStat+= inventoryItem[_order-1].itemStat; } } else//아이템 해제 { inventoryItem[_order - 1].itemEquip =false; if (inventoryItem[_order - 1].itemType == "방어력") { defenseStat -= inventoryItem[_order - 1].itemStat; } else //공격력 { attackStat -= inventoryItem[_order - 1].itemStat; } } InvetoryDialogue(); } //인벤토리 보여주고 행동 입력받기 public void OpenInventory() { InvetoryDialogue(); int answer = -1; if (equip == false) { answer = CheckInput(0, 1); if (answer == 1) { equip = true; OpenInventory(); } else { equip = false; } } else if (equip == true) { while (true) { answer = CheckInput(0, inventoryItem.Count()); if (answer == 0) { equip = false; OpenInventory(); break; } ItemManagement(answer); } } } } class Shop { List<Item> itmes = new List<Item>(); bool buy = false; public Shop() { itmes.Add(new Item(false,"수련자의 갑옷","방어력",5,"수련에 도움을 주는 갑옷입니다.",1000)); itmes.Add(new Item(false,"무쇠갑옷", "방어력",9, "무쇠로 만들어져 튼튼한 갑옷입니다.",100)); itmes.Add(new Item(false,"스파르타의 갑옷", "방어력", 15, "스파르타의 전사들이 사용했다는 전설의 갑옷입니다.",3500)); itmes.Add(new Item(false,"낡은 검", "공격력", 2, "쉽게 볼 수 있는 낡은 검 입니다.",600)); itmes.Add(new Item(false,"청동 도끼", "공격력", 5, "어디선가 사용됐던거 같은 도끼입니다.",1500)); itmes.Add(new Item(false,"스파르타의 창", "공격력", 7, "스파르타의 전사들이 사용했다는 전설의 창입니다.",200)); itmes.Add(new Item(false,"공포의 C#", "공격력", 333, "함부로 손댔다가는 쓴맛을 맛봅니다.",999)); } //아이템 구매 void BuyItem(ref int _Gold,int _answer, ref List<Item> inven) { if (itmes[_answer - 1].itemBuy == true) { Console.WriteLine("이미 구매한 아이템입니다."); } else if(itmes[_answer - 1].itemPrice > _Gold) { Console.WriteLine("돈이 부족합니다."); } else { _Gold -= itmes[_answer - 1].itemPrice; //소유한 금액에서 아이템 금액 빼기 itmes[_answer - 1].itemBuy = true; // 아이템을 구매했다고 표시 inven.Add(itmes[_answer - 1]); ShopDialogue(ref _Gold,ref inven ); //화면에 구매했다고 출력 Console.WriteLine("아이템을 구매하셨습니다."); } } //상점 대사 출력 void ShopDialogue(ref int _Gold, ref List<Item> inven) { Console.Clear(); Console.WriteLine("상점\n"); Console.WriteLine($"[보유 골드]\n{_Gold}G\n"); Console.WriteLine("[아이템목록]"); for (int i = 0; i < itmes.Count(); i++) { if (buy == true) { Console.Write($"-{i + 1} "); } else { Console.Write("-"); } if (itmes[i].itemBuy == true) { Console.WriteLine($"{itmes[i].itemName} | {itmes[i].itemType} +{itmes[i].itemStat} | {itmes[i].itemDescript} | 구매완료"); } else { Console.WriteLine($"{itmes[i].itemName} | {itmes[i].itemType} +{itmes[i].itemStat} | {itmes[i].itemDescript} | {itmes[i].itemPrice}G"); } } Console.WriteLine(); if (buy == false) Console.WriteLine("1. 아이템구매"); Console.WriteLine("0. 나가기\n"); Console.WriteLine("원하시는 행동을 입력해주세요"); } //상점에 들어와서 다음 행동 입력받기 public void EnterShop(ref int _Gold,ref List<Item> inven) { ShopDialogue(ref _Gold, ref inven); int answer = -1 ; if(buy==false) { answer = CheckInput(0, 1); if (answer == 1) { buy = true; EnterShop(ref _Gold,ref inven); } else { buy = false; } } else if(buy == true) { while (true) { answer = CheckInput(0, itmes.Count()); if(answer==0) { buy = false; EnterShop(ref _Gold, ref inven); break; } BuyItem(ref _Gold, answer, ref inven); } } } } //아이템 클래스 class Item { public bool itemEquip = false; public bool itemBuy { get; set; } public string itemName { get; set; } public string itemType { get; set; } public int itemStat { get; set; } public string itemDescript { get; set; } public int itemPrice { get; set; } public Item(bool _itemBuy, string _itemName,string _itemType, int _itemStat, string _itemDescript,int _itemPrice) { itemBuy = _itemBuy; itemName = _itemName; itemType = _itemType; itemStat = _itemStat; itemDescript = _itemDescript; itemPrice = _itemPrice; } } //올바른 입력인지 확인 static public int CheckInput(int _startNum, int _endNum) { int answer = 0; while (true) { try { Console.Write(">> "); answer = int.Parse(Console.ReadLine()); for (int i = _startNum; i <= _endNum; i++) //입력이 숫자이지만 지정범위 내에 숫자가 아닐 경우 { if (answer == i) { return answer; } } Console.WriteLine("잘못된 입력입니다."); } catch (FormatException ex) //입력이 숫자가 아닐때 발생하는 오류 { Console.WriteLine("잘못된 입력입니다."); } } } } }
과제 중 필수 구현만 하고 제출해버린 제 코드입니다.
추가 기능 구현은 내일쯤 하지않을까..싶습니다...
깔끔하게 짠 느낌도 아니라서 고민되네요
'TIL' 카테고리의 다른 글
[TIL]C# 알고리즘 (0) 2024.04.28 [TIL]C# 문법 4 (0) 2024.04.26 [TIL]C#문법3 (0) 2024.04.24 [TIL]C#문법 2 (0) 2024.04.23 [TIL]C#문법1주차(수정중) (0) 2024.04.23