Assignment Chef icon Assignment Chef

Browse assignments

Assignment catalog

33,401 assignments available

[SOLVED] Stat580 homework 1

1. Let X1, X2, . . . , Xn be a sample from the standard uniform U(0, 1) distribution. Find the distribution of (Pn i=1 Xi)mod1. [10 points]2. Let F be a cumulative distribution function (c.d.f.). Define F [−1](u) = min{x | F(x) ≥ u}. Show that if U ∼ U(0, 1), then F [−1](U) ∼ F. [5 points]3. There are many methods of Sampling from the Standard Normal distribution. (a) Prove that the Box-Muller algorithm provides two independent standard normal random deviates. [5 points] (b) Prove that the Polar algorithm for simulating from the standard normal distribution provides two independent standard normal random deviates. [5 points]4. Sampling from the tail of a standard normal. Perform a simulation experiment in R (or any other software) to map the rejection rate with increasing d. Compare the result with the theoretical naive rejection rate. (For this experiment, no code is required to be turned in, but you are required to describe the experiment that you set up, and also detail the results, using appropriate figures (and tables) if needed.) [10 points]5. Compressed Column Storage. Consider the n × p sparse matrix W = ((wij ) with m non-zero entries and stored in the following Compressed Column Storage (CCS) format: • Consider the triple given by A = (a, r, c). where a = (a1, a2, . . . , am) is a mdimensional vector containing the non-zero values in W (stored column-wise), r = (r1, r2, . . . , rm) is the m-dimensional vector with ri storing the row index of the corresponding ai , and c = (c1, c2, . . . , cp) is a (p + 1)-dimensional vector with ci indicating the element of a that starts the column of A. By convention, cp+1 = m + 1. Thus, ai ≡ wri,k, where ck ≤ i < ck+1. Matrices may alternatively be stored in the Compressed Row Storage format (CRS) defined correspondingly.(a) Consider the product of A with a p-variate vector x. Let y = W x. Provide an algorithm for calculating the j element of y. That is, write an algorithm which will calculate yj given W in CCS format A = (a, r, c) and without expanding it back to W. No programming is required, but only the algorithm in pseudo-code should be provided. [10 points](b) Suppose that we now have a sparse symmetric p × p matrix V . Answer the following questions: i. Develop a similar CCS-type strategy for storing the matrix V in a packed CCS format. [5 points] ii. Provide, in pseudo-code, an algorithm for finding the jth element yj of y = V x. [5 points]6. Let U1, U2, . . . , UnU be a sample from Population 1 and V 1,V 2, . . . ,V nV be a sample from Population 2. Consider the following samples hypothesized (but not known for sure) to be from different populations a follows: W1,W2, . . . ,WnW from Population 1, X1, X2, . . . , XnX to be from Population 2, Y1, Y2, . . . , YnY from Population 3, Z1, Z2, . . . , ZnZ from Population 4. The total within sum of squares (WSS) in this scenario is given by XnU i=1 kUi − µˆ 1k 2 + XnV i=1 kV i − µˆ 2k 2 + XnW i=1 kWi − µˆ 1k 2 + XnX i=1 kXi − µˆ 2k 2 + XnY i=1 kY i − µˆ 3k 2 + XnZ i=1 kZi − µˆ 4k 2 , (1) where µˆ 1 = (nUU¯ + nWW)/(nU + nW ), µˆ 2 = (nV V¯ + nXX¯ )/(nV + nX), µˆ 3 = Y¯ and µˆ 4 = Z¯ . The above total WSS can be rewritten to be a sum of WSS from the samples U1, U2, . . . , UnU and V 1,V 2, . . . ,V nV plus some terms. (This is important in the context of the following questions.) We are interested in finding how the total WSS changes when we reassign an (unsure) observation from one population to the other. To do so, we will investigate the three possibilities (there is actually a fourth, but that is the converse of Case (b) below).(a) Suppose we reassign WnW from Population 1 to Population 2. How does the total WSS in (1) change? (Note that such a reassignment affects both µˆ 1 and µˆ 2 ). [10 points](b) Suppose that from the original setup leading to (1). we reassign WnW from Population 1 to Population 3. How does the total WSS in (1) change? (Note that such a reassignment affects both µˆ 1 and µˆ 3 ). [10 points](c) Suppose that from the original setup behind (1). we reassign Y nY from Population 3 to Population 4. How does the total WSS in (1) change? (Note that such a reassignment affects both µˆ 3 and µˆ 4 .Note that an extension of this is the basis for the Hartigan-Wong (1979) implementation of the k-means algorithm.) [10 points] The reductions in all three parts above provides a stripped-down context of the basis for an efficient implementation of the k-means semi-supervised clustering algorithm.7. For each program, please write out how you compiled, executed the program and result. You may include this code in as a comment. (a) Write an annotated C program which converts temperature, from Fahrenheit to the Celsius scale and vice-versa. [7 points](b) Write an annotated C program which takes in two integers i = 320 and j = 256 and reports their product. Store the product as a short and as an int and print the result. What differences do you see? Please put in your observations and reasoning as a comment in the C program. [8 points]

$25.00 View

[SOLVED] Coms 573 machine learning problem set 4

1. (15 pts.) Consider the following Bayesian network Visit to Asia? (A) Smoker? (S) Tuberculosis? (T) Lung Cancer? (C) Bronchitis? (B) Tuberculosis or Cancer? (P) Positive X-Ray? (X) Dyspnoea? (D) (a) (12 pts.) True or false? Please explain. i. dsep(T, ∅, B) ii. dsep(A, {D, C}, B) iii. dsep(A, P, {X, D}) iv. dsep({A, X}, {P, S}, {C, D}) (b) (3 pts.) Express P(a, s, t, c, p, b, x, d) in factored form (the chain rule for BNs).2. (10 pts.) Give all the DAGs which are independence (d-separation) equivalent to the above DAG.3. (20 pts.) Jack has three coins C1, C2, and C3 with p1, p2, and p3 as their corresponding probabilities of landing heads. Jack flips coin C1 twice and then decides, based on the outcomes, whether to flip coin C2 or C3 next: if the two C1 flips come out the same, Jack flips coin C2 three times; if the two C1 flips come out different, Jack flips coin C3 three times.Given the outcome of Jack’s last three flips as: tail, head, tail, we want to know whether his first two flips came out the same. Describe a Bayesian network and a corresponding probabilistic query that answers this question. (You are NOT required to compute the query.)

$25.00 View

[SOLVED] Coms 573 machine learning problem set 3

1. ( 20 pts.) Consider the multiclass logistic regression model. (a) (5 pts.) Show that the derivatives of the softmax activation function are given by ∂yk ∂aj = yk(δkj − yj ).(b) (15 pts.) Derive the batch and single sample gradient descent weight update rules for minimizing the cross-entropy error function.

$25.00 View

[SOLVED] Coms 573 machine learning problem set 2

1. (20 pts.) Let ~x = (x1, . . . , xd) t be a d-dimensional binary (0 or 1) vector with a multivariate Bernoulli distribution P(~x| ~θ) = Y d i=1 θ xi i (1 − θi) 1−xi , where ~θ = (θ1, . . . , θd) t is an unknown parameter vector, θi being the probability that xi = 1. Given i.i.d. data set D = {~x1, . . . , ~xn}, derive the maximum-likelihood estimate for ~θ.2. (10 pts.) Assume that a classifier correctly classifies 900 of the 1000 examples in the test set. What is the estimated accuracy of the classifier? Give 95% confidence interval.

$25.00 View

[SOLVED] Coms 573 lab 4 ensemble learning

In this lab assignment, you will experiment with ensemble classifiers.• We will use the Blood Transfusion Service Center Data Set from the UC Irvine Machine Learning Repository: https://archive.ics.uci.edu/ml/datasets/Blood+Transfusion+Service+CenterWe have split the above data into training (train.csv) and testing (test.csv) sets. In the experiments, please train your models with the training data, and report the performances on the test data.2.1 Task 1 • Train ensemble models Random Forest (RF) and AdaBoost.M1 with decision stumps as base classifiers (Note you may use other versions of AdaBoost if the machine learning package you choose to use does not have this particular version.). Experiment with different values of hyper-parameters such as number of base classifiers etc.• Report your experimental results. Report, for the best models you have learned, the corresponding hyper-parameters and the performance including overall classification accuracy and confusion matrix over the test data. Discuss the results.2.2 Task 2 • Train 4 individual models: Neural Network (NN), Logistic Regression (LR), Naive Bayes (NB), Decision Tree (DT). Report the confusion matrix and classification accuracy on the test data for each of them. When training the 4 models, slightly tune the hyper-parameters (extensive grid search is not required).Report the experiments you have done. • Construct an ensemble classifier using unweighted majority vote over the 4 models you have trained. Report the performance on the test data.• Construct an ensemble classifier using weighted majority vote over the 4 models you have trained. Report the performance on the test data. You might use one of the following strategies to decide weights: make weights proportional to the classification accuracy, tune weights as hyperparameters, use stacking, or some other strategies. Report the experiments you have done. • Discuss the results.3 What to turn in Turn in via Canvas (a compressed .zip file) the following: • A lab report (in pdf file) with your experimental results and discussions of these results. • All of your commented source code that you may have written. • Readme file with instructions on how to reproduce your experiments.

$25.00 View

[SOLVED] Coms 573 machine learning problem set 1

1. (20 pts.) Consider a two category classification problem with one dimensional feature x. Assume that the priors are P(ω1) = 1/3 and P(ω2) = 2/3, and that the class-conditional distributions have normal densities p(x|ω1) ∼ N(1, 1) and p(x|ω2) ∼ N(3, 1), where N(µ, σ2 ) = 1 √ 2πσ2 e − 1 2 ( x−µ σ )(a) Derive the Bayes decision rule for minimum-error-rate classification. (b) Let λij = λ(αi |ωj ) be the loss incurred for deciding ωi when the true category is ωj . Assume λ11 = 0, λ12 = 2, λ21 = 1, λ22 = 0. Derive the Bayes decision rule for the minimum risk classification.2. (20 pts.) Consider the Binary Independence Model for text document. Given a vocabulary V : (w1, . . . , wd) of all English words (and tokens), assume that a text document is represented as a vector of binary features ~x = (x1, . . . , xd) t such that xi is 1 if the word wi appears in the document, and xi is 0 otherwise. We want to classify text documents into c categories.Let P(ωj ) be the prior probability for the class ωj for j = 1, . . . , c. Assume that the components of ~x are statistically independent given the category (Naive Bayes model), i.e., P(~x|ωj ) = Y d i=1 P(xi |ωj ).Assume we could estimate the following probability from the training data pij = P(xi = 1|ωj ) i = 1, . . . , d, j = 1, . . . , c. Show that the minimum probability of error is achieved by the following decision rule: Decide ωk if gk(~x) ≥ gj (~x) for all j 6= k, where the discriminant function is given in the form of gj (~x) = X d i=1 cijxi + bj . Give the expressions of cij and bj .

$25.00 View

[SOLVED] Coms 573  lab 3 decision tree learning

• You may perform the experiments using a machine learning package that has implemented (some version of) decision tree learning algorithm, such as Weka (https://www.cs.waikato.ac.nz/ml/weka/), etc. In this lab assignment, you will experiment with the Decision Tree classifier.We will use the following data set from the UC Irvine Machine Learning Repository: • Congressional Voting Records Data Set at (https://archive.ics.uci.edu/ml/datasets/Congressional+Voting+Records). Note the dataset has missing values.1. Learn a Decision Tree classifiers on the data set (for example, using J48 in Weka). Visualize the tree constructed by the decision tree algorithm. (Food for thought: Are there some interesting rules that make sense based on what you understand about the data?) 2. Report the accuracy of the Decision Tree classifier using 5-fold cross-validation (Most of ML packages including Weka have utility function for performing Cross-validation). Report 95% confidence interval.3. Perform the following experiments to study the stability of decision tree learning algorithm over the variability of data samples. (a) Randomly split the dataset into 5 data sets of (roughly) equal size D1, D2, . . . , D5. (b) For i = 1, 2, . . . , 5, each time use Di as test data and the rest as training data to learn a decision tree and measure its accuracy pi . (c) Visualize the five trees constructed. Do the five trees differ with each other and with the tree constructed using all the data (in Task 1)? How much do their accuracies differ?3 What to turn in Turn in via Canvas the following: • A lab report (in pdf file) with your experimental results. • A Readme file with instructions on how to reproduce your experiments. You should specify the parameters of every experiment in a way such that they can be replicated by the TA. • Any source code that you may have written (in a zip file).

$25.00 View

[SOLVED] Coms 573 lab 2 neural network classifier

We will use the following data set from the UC Irvine Machine Learning Repository: • Optical Recognition of Handwritten Digits Data Set (use optdigits.names, optdigits.tra as training data, and optdigits.tes as test data) (https://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits).You will experiment with the Neural Network classifier. You will use the softmax function for the output layer and use 1-of-c output encoding with target values such as (1, 0, 0, …). Use the early stopping technique to decide when to stop training. For example, you may use 20% of training data in optdigits.tra as the validation set.1. Experiment with fully-connected feed-forward neural networks. (a) Sum-of-squares error (aka mean-squared-error) vs. cross-entropy error function. Use the ReLU units for the hidden layers. For each of the two types of error functions, experiment with different values of hyper-parameters, including number of hidden layers, number of hidden units in each layer, learning rates, momentum rates, input scaling, and so on.Compare their classification accuracy and convergence speed (the number of iterations or actual time till training stops). Report your experimental results, and the best hyper-parameter values you find. Report for the best model you learned, the corresponding hyper-parameters and the performance including overall classification accuracy, class accuracy1 , and confusion matrix for both training and testing data. Discuss the results.class accuracy = (predicted as class i)/(number of examples in class i)1 (b) tanh vs. ReLU hidden units. Use the cross-entropy error function. For each of the two types of hidden units, repeat the above experiments, that is, experiment with different values of hyper-parameters and report the results. Discuss the results.2. Experiment with convolutional networks (CNNs). Use the cross-entropy error function, and ReLU hidden units. Repeat previous experiments, that is, experiment with different values of hyper-parameters (note CNNs may have different types of hyper-parameters, eg. filter size) and report the results. Discuss the results.3 What to turn in Turn in via Canvas (a compressed .zip file if necessary) the following: • A lab report (in pdf file) with your experimental results and discussions of these results. It should include a brief description of all the design choices made. Try to use tables or plots to summarize your results. You should specify the parameters of every experiment in such a way that they can be replicated by the TA. • Readme file with instructions on how to reproduce your experiments. • Any source code that you may have written.

$25.00 View

[SOLVED] Coms 573  lab 1 naive bayes classifier for text classification

The 20 Newsgroups data set is a collection of approximately 20,000 newsgroup documents, partitioned (nearly) evenly across 20 different newsgroups. It was originally collected by Ken Lang, probably for his Newsweeder: Learning to filter netnews [1] paper, though he did not explicitly mention this collection.The 20 newsgroups collection has become a popular data set for experiments in text applications of machine learning techniques, such as text classification and text clustering.The data is organized into 20 different newsgroups, each corresponding to a different topic. Here is a list of the 20 newsgroups: alt.atheism comp.graphics comp.os.ms-windows.misc comp.sys.ibm.pc.hardware comp.sys.mac.hardware comp.windows.x misc.forsale rec.autos rec.motorcycles rec.sport.baseball rec.sport.hockey sci.crypt sci.electronics sci.med sci.space soc.religion.christian talk.politics.guns talk.politics.mideast talk.politics.misc talk.religion.miscThe original data set is available at http://qwone.com/~jason/20Newsgroups/. In this lab, you won’t need to process the original data set. Instead, a processed version of the data set is provided (see 20newsgroups.zip). This processed version represents 18824 documents which have been divided into two subsets: training (11269 documents) and testing (7505 documents).After unzipping the file, you will find six files: map.csv, train label.csv, train data.csv, test label.csv, test data.csv, vocabulary.txt. The vocabulary.txt contains all distinct words and other tokens in the 18824 documents. train data.csv and test data.csv are formatted “docIdx, wordIdx, count”, where docIdx is the document id, wordIdx represents the word id (in correspondence to vocabulary.txt) and count is the frequency of the word in the document. train label.csv and test label.csv are simply a list of label id’s indicating which newsgroup each document belongs to (with the row number representing the document id). The map.csv maps from label id’s to label names.In general, you will implement a Java program that takes the input files, builds a Naive Bayes classifier, and outputs relevant statistics. Call your code as follows: java NaiveBayes training label.csv training data.csv testing label.csv testing data.csv (Note: you may use a different name for the Java class.)You will learn your Naive Bayes classifier from the training data (train label.csv, train data.csv), then evaluate its performance on the testing data (test label.csv, test data.csv). Specifically, your program will accomplish the following two tasks.2.1 Learn the Naive Bayes Model You will implement the multinomial model (“bag of words” model) discussed in the lecture. In the learning phase, you will estimate the required probability terms using the training data.For each target value ωj (each newsgroup) • Calculate class prior P(ωj ) • Calculate n: total number of words in all documents in class ωj (i.e., total length) • For each word wk in Vocabulary – Calculate nk: number of times word wk occurs in all documents in class ωj . – Calcualte Maximum Likelihood estimator PMLE(wk|ωj ) = nk n and Bayesian estimator PBE(wk|ωj ) = nk+1 n+|V ocabulary| (this is Laplace estimate).Your program should output the class priors, for example (the following numbers are arbitrary, not true values) P(Omega = 1) = 0.0426 P(Omega = 2) = 0.0516 P(Omega = 3) = 0.0508 …You need not print out all PMLE(wk|ωj ) or PBE(wk|ωj ), just take a look at the values of these two types of estimators. What do you observe? Discuss what you have observed in your report.2.2 Evaluate the Performance of the Classifier In this task, you will evaluate your Naive Bayes classifiers that you have learned in Section 2.1 on both the training and the testing data. You will use your Naive Bayes classifiers to make classification decision on these data set and calculate relevant statistics such as overall accuracy, class accuracy, confusion matrix, etc. When making classification decision, consider only words found in Vocabulary. Let positions be all word positions in a document (x1, x2, . . .) that contain tokens found in Vocabulary, return ωNB where ωNB = argmaxωjP(ωj ) Y i in positions P(xi |ωj ) (1) = argmaxωjP(ωj ) |V ocabulary Y | k=1 P(wk|ωj ) Nk . (2)You may find it more convenient to compute using logarithms (to prevent underflow), e.g.: ωNB = argmaxωj [ln P(ωj ) + X i in positions ln P(xi |ωj )]. (3)Note however that P(xi |ωj ) or P(wk|ωj ) terms may be zero for MLE.2.2.1 Performance on Training Data First you will evaluate your Naive Bayes classifier on the training data, for both Bayesian and ML estimators respectively. After making prediction for each document in the training data set, you will calculate and output the overall accuracy, i.e, the percentage of correctly classified documents Overall Accuracy = number of correctly classif ied documents total number of documents , (4) as well as the class accuracy = (predicted as class i)/(number of documents in class i) for each newsgroup. A sample output is given as follows (the numbers are arbitrary, not true values).Overall Accuracy = 0.9211 Class Accuracy: Group 1: 0.9667 Group 2: 0.9191 …Further, you will construct and output the confusion matrix (https://en.wikipedia.org/wiki/ Confusion_matrix). An example is as follows (the numbers are arbitrary, not true values): 464 0 0 0 … 1 534 6 15 … 1 10 503 23 … 0 10 4 546 … … A cell (i, j) in the matrix represents the number of documents in group i that are predicted to be in group j.2.2.2 Performance on Testing Data Now you will evaluate your classifiers on the testing data set. Repeat the experiments described in Section 2.2.1 but on the testing data set. Compare the results obtained with the results you have obtained in Section 2.2.1. What do you observe? Discuss. Also compare the results obtained using the Bayesian estimators against the Maximum Likelihood estimators. What do you observe? Which one is better? Discuss.2.3 Summary In summary, your program will output the following relevant statistics: • Class priors • Performance on training data (for both Bayesian estimators and ML estimators): overall accuracy, class accuracy, confusion matrix. • Performance on testing data (for both BE and MLE): overall accuracy, class accuracy, confusion matrix.3 What to Turn In Turn in via Canvas a compressed file (.zip) containing the following: • All of your commented source code (.java files). (For Java code, make sure the debugging flag is set to false. Do not turn in the results of running the code with debugging = true). • A README file explaining how to compile and run the program. • A short lab report that includes the experimental results obtained and answers to questions.References [1] Ken Lang, Newsweeder: Learning to filter netnews, Proceedings of the Twelfth International Conference on Machine Learning, 331-339 (1995).

$25.00 View

[SOLVED] Csed232 object oriented programming assignment 5 – gui programming

주의 사항 ⚫ 클래스는 .h 파일과 .cpp 파일에 나눠서 구현해야 합니다. ⚫ 문제에 따로 명시되어 있지 않아도 클래스의 생성자 (constructor), 소멸자 (destructor)는 필수적으로 구현되어야 합니다. ⚫ 문법 사용에 제약은 없습니다. ⚫ 문제의 구현 요구 사항을 꼼꼼히 읽어 보시기 바랍니다. 감점 사항 ⚫ 제출 기한 다음 날 (6월 12일) 제출 시 20% 감점, 이틀 뒤 (6월 13일) 제출 시 40% 감점 ◼ 이 이후에 제출할 경우 0점 처리 ⚫ 컴파일이 되지 않으면 0점 처리 ⚫ 제출 방법 위반 시 감점 제출 방법 ⚫ 같이 제공된 Qt Creator 설치 방법을 참고해 주십시오. 해당 설치 방법대로 설치된 Qt Creator 상에서 컴파일 및 채점이 진행될 것입니다. ⚫ Qt Creator의 프로젝트 폴더를 그대로 압축하여 제출해 주십시오. 프로젝트 폴더 내부 의 .pro 파일이 반드시 포함되어 있어야 합니다. ⚫ Qt Creator의 프로젝트 폴더와 레포트를 같이 압축하여 “학번.zip”의 형태로 제출해 주십 시오. 압축될 레포트의 이름 역시 “학번.pdf”의 형태로 설정해 주시기 바랍니다. 공통 채점 기준 1. 프로그램 기능 ⚫ 프로그램이 요구 사항을 모두 만족하면서 올바르게 실행되는가? 2. 프로그램 설계 및 구현 ⚫ 요구 사항을 만족하기 위한 변수 및 알고리즘 설계가 잘 되었는가? ⚫ 문제에서 제시된 세부 조건을 모두 만족하였는가? ⚫ 설계된 내용이 요구된 언어를 이용하여 적절히 구현되었는가? 3. 프로그램 가독성 ⚫ 프로그램이 읽기 쉽고 이해하기 쉽게 작성되었는가? ⚫ 변수명이 무엇을 의미하는지 이해하기 쉬운가? ⚫ 프로그램의 소스 코드를 이해하기 쉽도록 주석을 잘 붙였는가? 4. 보고서 구성 및 내용, 양식 ⚫ 보고서는 적절한 내용으로 이해하기 쉽고 보기 좋게 잘 작성되었는가? ⚫ 보고서의 양식을 잘 따랐는가? 다른 사람의 프로그램 혹은 인터넷에 있는 프로그램을 복사(copy)하거나 간단히 수정해서 제출하면 학점은 무조건 ‘F’가 됩니다. 이러한 부정행위가 발견되면 학 과에서 정한 기준에 따라 추가적인 불이익이 있을 수 있습니다. 2048 Puzzle Game 1. 과제 개요 이번 과제에서는 C++ GUI 개발 프레임워크인 Qt framework를 이용하여 2048 퍼즐 게임을 제 작해 본다. Qt Creator 개발 환경을 통해 2048 퍼즐게임을 제작하여 GUI 제작 경험을 쌓는 것을 목표로 한다. 2. 과제 설명 2.1 주의 사항 구현 요구 사항을 설명하기에 앞서, 이번 과제를 구현함에 있어서 반드시 지켜야 할 사항들을 명시한다. ⚫ GUI 구현 코드와 게임 내부 로직 구현 코드는 반드시 분리하여 구현한다. 이는 게임 내 부 로직 구현 코드와 GUI 구현 코드를 분리함으로써 각 객체들의 독립성을 높이고 구현 의 편의성을 높이기 위함이다. 가장 상위 폴더에 .pro 파일과 main.cpp 함수가 위치하도 록 하고 GUI 구현 코드는 ui 폴더에 위치하도록, 게임 내부 로직 구현 코드는 game 폴 더에 위치하도록 한다. ⚫ Designer UI (.ui 파일)를 통한 GUI 구현을 금지한다. GUI 구현에 필요한 세부 구현 사항 들 (블록의 크기, 게임판의 크기 등)은 문제에서 주어지므로 이를 가지고 코드를 통해 GUI를 구현하도록 한다. 2.2 게임 진행 이번 섹션에서는 과제의 게임이 진행되는 과정을 서술한다. 세부적인 구현 요구 사항은 다음 섹션에서 서술한다. 구현 이전에 https://www.mathsisfun.com/games/2048.html 에서 게임을 해보 며 게임의 전반적인 흐름을 파악하는 것을 추천한다. 2.2.1 게임 시작 프로그램을 실행하면 다음과 같이 랜덤한 게임판이 나타난다. 그림 1. 프로그램 시작 시 나타나는 화면 4 x 4 격자 형태의 게임판 내부 랜덤한 2군데에 숫자 2 블록이 등장하는 것으로 게임이 시작된 다. 전체 레이아웃은 다음 네 개의 요소들로 구성된다. 1. 게임판: 4 x 4 격자 형태의 공간으로, 퍼즐 게임의 블록들이 합쳐지고 이동하는 공간이다. 2. 점수: 현재 게임판의 점수가 표시되는 공간이다. 점수를 계산하는 공식은 추후에 설명한 다. 3. 게임 종료 버튼: 게임을 중간에 종료할 수 있는 버튼이다. 해당 버튼을 누를 경우 정말로 게임을 종료할 것인지 묻는 확인창이 출력된다. “Yes” 버튼을 누를 경우 프로그램이 종료 되며 “No” 버튼을 누르거나 확인창을 닫을 경우 아무 일도 일어나지 않는다. 4. 게임판 되돌리기 버튼: 해당 버튼을 누를 경우 게임판이 이전의 상태로 되돌아간다. 한 게임 당 되돌리기 기회는 3번 주어진다. 1 2 3 4 그림 2. 게임 종료 버튼을 누를 경우 나타나는 확인창 그림 2는 게임 종료 버튼을 눌렀을 때 나오는 확인창이다. Yes를 누를 경우 프로그램이 그대로 종료되며, No를 누를 경우 아무 일도 일어나지 않고 게임으로 되돌아간다. 2.2.2 게임 조작 및 블록 이동 게임판에서의 조작은 키보드 방향키로 이루어진다. 사용자가 누른 방향키에 대한 방향으로 블 록들이 이동하며 (예를 들어, 왼쪽 방향키를 눌렀을 때 왼쪽으로의 이동이 가능하다면 블록들이 왼쪽으로 이동), 방향키를 눌렀을 때 해당 방향으로의 이동이 불가능하면 그 입력을 무시한다. 방 향키 이외의 입력은 무시하도록 구현한다. 방향키를 눌렀을 때 블록들이 이동하는 규칙을 자세히 알아보자. 1. 입력된 방향에 대해 빈 공간이 존재하면 해당 블록은 그 방향으로 최대한 이동한다. 2. 블록이 이동하면서 다른 값을 갖는 블록과 맞닿을 경우 두 블록은 합쳐지지 않는다. 3. 블록이 이동하면서 같은 값을 갖는 블록과 맞닿을 경우 두 블록은 합쳐진다. 또한, 블 록들은 합쳐질 때 한 번에 최대 두 개까지만 그 병합에 관여할 수 있다. 우선, 입력된 방향에 대해 빈 공간이 존재하면 블록들은 그 방향으로 최대한 이동한다. 그림 3 을 참고하도록 한다.그림 3. (좌) 이동하기 전 게임판, (우) 왼쪽 방향키를 눌러서 블록들이 이동한 게임판. 3행 3열의 블록은 이동 후 새로 생성된 블록이다. 블록이 이동하면서 다른 값을 갖는 블록과 맞닿을 경우 두 블록은 합쳐지지 않고 충돌한다. 그 림 4를 참고하도록 한다.그림 4. (좌) 이동하기 전 게임판, (우) 위쪽 방향키를 눌러서 블록들이 이동한 게임판. (우)의 4행 2열 블록은 이동 후 새로 생성된 블록이다. 블록이 이동하면서 같은 값을 갖는 블록과 맞닿을 경우 두 블록은 합쳐진다. 그림 5를 보면 1 행 1열의 블록과 2행 1열의 블록이 아래로 이동하면서 합쳐진 것을 확인할 수 있다. 또한, 블록들 이 합쳐질 때 하나의 병합에 대해 최대 두 개까지만 관여할 수 있다. 그림 5를 보면 2-2-4 블록 이 1열에 놓여 있는 것을 볼 수 있다. 여기서 2-2-4가 합쳐져서 8이 나오는 것이 아니라 4-4가 되는 것을 알 수 있다.그림 5. (좌) 이동하기 전 게임판, (우) 아래쪽 방향키를 눌러서 블록들이 이동한 게임판. 1행 1열 의 블록은 이동 후 새로 생성된 블록이다. 또한, 2-2-2가 가로로 연달아 있을 때 왼쪽으로 이동할 경우 합쳐져서 4-2가 되며, 오른쪽으로 이동할 경우 합쳐져서 2-4가 된다. 2-2-2가 세로로 연달아 있을 때도 마찬가지로, 위쪽으로 이동 할 경우 위에서부터 4-2가 되며 아래쪽으로 이동할 경우 위에서부터 2-4가 된다. 2.2.3 점수 계산 블록들이 합쳐질 때 게임판의 점수가 올라간다. 합쳐져서 생성된 블록의 값만큼 점수가 올라가 도록 구현한다. 예를 들어, 8 블록과 8 블록을 합쳐서 16 블록을 만들었다면 점수는 16이 올라간 다. 한 번의 이동으로 여러 개의 병합이 발생한다면 모든 병합에 대해 점수가 올라가도록 해야 한다. 2.2.4 새로운 블록 생성 게임판에서 블록들을 이동한 뒤에는 랜덤한 빈 공간에 새로운 블록이 하나 생성된다. 생성되는 새로운 블록은 정해진 확률에 따라 2 또는 4의 값을 가진다. 이번 과제를 구현할 때는 20% 확률 로 4의 값을 갖는 블록이 생성되도록, 80% 확률로 2의 값을 갖는 블록이 생성되도록 구현한다. 2.2.5 되돌리기 버튼 (Restore) 되돌리기 버튼을 누르면 게임판이 이전의 상태로 되돌아간다. 버튼을 누르면 정말 되돌릴 것인 지 묻는 메시지와 함께 현재 남은 되돌리기 기회를 알려주는 창이 출력된다 (그림 6). 그림 6. 게임 진행 중 Restore 버튼을 눌렀을 때 출력되는 메시지 창 이 상태에서 Yes를 누를 경우 이전 상태로 되돌아가며 성공적으로 되돌려졌다는 메시지를 출 력한다 (그림 7). No를 누를 경우 아무 일도 벌어지지 않는다. 그림 7. 그림 6에서 Yes 버튼을 눌러 게임판을 되돌린 모습 되돌리기 버튼을 구현하기 위해서는 이전 게임판 상태를 버퍼에 저장해야 한다. 버퍼에 저장되 는 게임판은 1개로 제한한다. 다시 말하자면, 되돌리기 버튼을 사용하여 버퍼에 저장된 게임판 상 태로 되돌렸을 경우 더 이상 버퍼에는 아무 것도 남아있지 않을 것이다. 그렇기 때문에 되돌리기 버튼을 두 번 연속으로 사용할 수는 없다. 그리고 게임이 시작한 순간에도 버퍼에는 아무 것도 저장되어 있지 않을 것이다. 이렇게 되돌리기 버튼을 두 번 연속으로 사용하거나 게임이 시작된 순간에 되돌리기 버튼을 눌러서 버퍼에 아무 것도 없을 경우에는 그림 8과 같은 에러 창을 출력 한다. 에러 창에서 OK 버튼을 누르면 다시 게임이 재개된다. 그림 8. 버퍼에 아무 것도 저장되어 있지 않은 상태에서 Restore 버튼을 눌렀을 때 또한, 더 이상 되돌리기 기회가 남아있지 않은 상태에서 Restore 버튼을 누르면 그림 9와 같은 에러 메시지 창을 출력한다. 그림 9. 되돌리기 기회가 남지 않은 상태에서 Restore 버튼을 눌렀을 때 출력되는 메시지 창 2.2.6 게임 승리 게임을 진행하여 2048 블록을 만들면 유저가 승리한다. 조교는 게임을 하면서 2048을 만들지 못했기에 2048이 만들어져서 게임이 승리하는 예시를 보여주지는 못한다. 그 대신 코드를 살짝 변경하여 32가 생성되었을 때 게임이 종료되도록 코드를 바꿔놓았다. 보여주는 예시에서는 32 블 록을 만들어서 게임이 끝나지만 실제 구현에서는 2048 블록이 만들어졌을 때 승리 조건이 달성 되도록 구현한다. 그림 10을 보면 임의로 설정된 승리 조건인 32 블록이 만들어져 있다. 그림 10 과 같이 승리 조건에 해당하는 블록이 생성되면 1초 뒤에 “Congratulations!” 메시지와 함께 클 리어 시점의 점수를 출력하는 메시지 박스를 출력한다. 그림 10. 승리 조건이 달성되었을 때 출력되는 메시지 창 2.2.7 게임 패배 그 어떤 방향으로도 블록들이 이동할 수 없는 상태가 되면 게임에서 패배한다. 그림 11. 블록들이 어떤 방향으로도 이동할 수 없는 상태. 이 상태에 도달한 것만으로는 아무 일 도 벌어지지 않는다. 그림 11을 보면 더 이상 어떤 방향으로도 이동할 수 없는 상태가 된 것을 알 수 있다. 이 상태 에 도달했을 때는 게임 패배 메시지가 출력되지 않지만, 이 상태에서 아무 방향키를 누르면 그림 12와 같이 “You lose…” 메시지와 함께 패배 시점의 점수를 출력하는 메시지 박스를 출력한다. 그림 12. 그림 11의 상태에서 방향키를 눌렀을 때 출력되는 메시지 창 2.3 GUI 구현 세부 사항 2.3.1 프로그램 레이아웃 ⚫ 프로그램 실행 창 ◼ 크기 설정: 가로 1300, 세로 1000 (resize 활용) ⚫ 게임 판 ◼ QGridLayout으로 구현 ◼ 프로그램 창 왼쪽에 위치 ◼ 크기 설정 따로 할 필요 없음 (05/23 15시 10분 수정) ⚫ 점수 표시 레이아웃 ◼ QLabel로 구현 ◼ 프로그램 창 오른쪽 상단에 위치 ◼ 글자 크기 제한 없음 ⚫ 게임 종료 버튼 및 되돌리기 버튼 ◼ QPushButton으로 구현 ◼ 프로그램 창 오른쪽 하단에 위치 ◼ 버튼 크기: 가로 300, 세로 200 ◼ 폰트 크기: 20pt ◼ 버튼에 존재하는 문구: 종료 버튼 (Exit), 되돌리기 버튼 (Restore) 2.3.2 블록 ⚫ 블록의 크기: 가로 250, 세로 250 ⚫ 블록 사이의 간격: 10 (void QGridLayout::setSpacing(int spacing);) (05/23 15시 10분 수 정) ⚫ QLabel 클래스를 상속받아 구현 ⚫ setStyleSheet를 사용하여 블록 스타일 설정 (Widget의 스타일을 CSS로 설정해 주는 메서드) ◼ setStyleSheet(“QLabel { background: rgb(rrr, ggg, bbb); color: black; border-style: solid; font: 70pt; font: bold; }”); (05/23 15시 10분 수정) ◼ 비어 있는 블록: rgb(255, 255, 255) ◼ 2 블록: rgb(187, 173, 160) ◼ 4 블록: rgb(237, 224, 200) ◼ 8 블록: rgb(242, 177, 121) ◼ 16 블록: rgb(245, 149, 99) ◼ 32 블록: rgb(246, 126, 95) ◼ 64 블록: rgb(246, 94, 59) ◼ 128 블록: rgb(237, 207, 114) ◼ 256 블록: rgb(237, 204, 97) ◼ 512 블록: rgb(237, 200, 80) ◼ 1024 블록: rgb(237, 197, 63) ◼ 2048 블록: rgb(237, 194, 46) 2.3.3 메시지 창 ⚫ 메시지 창을 띄울 때는 QMessageBox를 활용할 것 ⚫ 문제에 메시지 내용이 정확하게 명시되어 있는 것을 제외하고는 메시지 창에 표시되 는 문구는 자유롭게 설정 가능함. 해당 상황에 맞는 뜻을 전할 수만 있으면 OK 2.4 필수 구현 파일 및 클래스 이번 섹션에서는 이번 과제에서 필수적으로 구현되어야 하는 파일 및 클래스를 설명한다. 이번 섹션에서 구현을 요구하는 클래스들은 반드시 구현되어야 하며, 이외의 추가적인 클래스나 파일 은 자유롭게 구현이 가능하다. 보고서를 작성할 때 본인이 추가로 구현한 클래스나 파일이 있으 면 해당 클래스 및 파일을 추가한 이유를 서술해야 한다. GUI 구현 코드와 게임 내부 로직 구현 코드를 분리하지 않는 것은 감점 사항이다. 2.4.1 class Block 게임 내부 로직 구현에 사용되는 Block 클래스가 구현되어 있어야 한다. Block 클래스는 각 블 록이 가지고 있는 값을 관리한다. 2.4.2 class Board 게임 내부 로직 구현에 사용되는 Board 클래스가 구현되어 있어야 한다. Board 클래스는 Block 들로 이루어져 있는 게임판을 관리하며, 게임판이 이동하는 로직 또한 이 클래스에 구현되어 있 어야 한다. 2.4.3 class Game 게임을 전반적으로 관리하는 Game 클래스가 구현되어 있어야 한다. 게임에 사용되는 Board 클 래스를 멤버 변수로 가지고 있어야 하며, 게임의 종료 여부를 판단하는 메서드를 구현한다. 2.4.4 class BlockUi Block을 GUI 상에 나타내기 위한 BlockUi 클래스가 구현되어 있어야 한다. BlockUi는 QLabel 클 래스를 상속받도록 하여 구현한다. 2.4.5 class GameUi 전체 레이아웃을 관리하는 GameUi 클래스가 구현되어 있어야 한다. QWidget을 상속받도록 하 여 구현한다. 2.5 게임 진행 상황 저장 채점의 편의성을 위해 게임이 진행되는 상황을 “progress.txt” 파일에 저장하도록 한다. 1. 게임 시작 시 블록이 생성되는 위치 x1행 y1열, x2행 y2열: INITIAL x1 y1 x2 y2 A. 1행 1열과 3행 2열에 생성되었을 경우 ➔ INITIAL 1 1 3 2 2. 위쪽/아래쪽/오른쪽/왼쪽을 누를 경우: UP/DOWN/RIGHT/LEFT 3. 이동 후 n 블록이 생성되는 위치 x행 y열: GENERATE x y n A. 이동 후 4 블록이 2행 1열에 생성되었을 경우 ➔ GENERATE 2 1 4 4. x행 y열에서 n 블록으로의 병합이 발생할 경우: MERGE x y n A. 2개의 4 블록이 2행 2열에서 8 블록으로 합쳐질 경우 ➔ MERGE 2 2 8 5. 되돌리기 버튼을 누르고 기회가 n번 남을 경우: RESTORE n A. 기회가 2번 남은 상태에서 되돌리기를 누를 경우 ➔ RESTORE 1 6. 이동 후 점수: SCORE n A. 이동 후에 점수가 72점일 경우: SCORE 72 예시) 좌상단->우상단->좌하단->우하단 순서로 움직임INITIAL 2 4 3 1 LEFT GENERATE 1 1 2 SCORE 0 DOWN MERGE 4 1 4 GENERATE 3 2 2 SCORE 4 LEFT MERGE 3 1 4 GENERATE 2 3 2 SCORE 8 처음 블록이 생성되는 것을 기록할 때는 숫자가 작은 행에서 생성된 위치를 우선적으로 기록하 고, 행이 같을 경우 숫자가 작은 열에서 생성된 위치를 우선적으로 기록한다. 예를 들어, 그림과 같이 3행 1열과 2행 4열에서 첫 블록들이 생성되었을 경우 2행 4열이 행의 숫자가 작으므로 INITIAL 2 4 3 1로 기록한다. 병합이 여러 번 발생하였을 경우 숫자가 작은 행에서 발생한 병합을 우선적으로 기록하고, 행 이 같을 경우 숫자가 작은 열에서 발생한 병합을 우선적으로 기록한다. 예를 들어, 2행 3열에서 병합이 발생하고 2행 2열에서 병합이 발생했을 경우 MERGE 2 2 n MERGE 2 3 n’ 의 순서로 기록된다. 하나의 이동에 대한 기록 순서는 이동 -> 병합 -> 생성 -> 점수로 정한다. 예를 들어 왼쪽으로 이동할 경우 LEFT MERGE … (발생한 병합 순서대로 쭉 기록) GENERATE … (이동 후 생성된 위치 기록) SCORE … (점수 기록) 방향키를 입력하였지만 해당 방향으로의 이동이 불가능 했을 경우에는 방향만 기록한다. 예를 들어 왼쪽과 오른쪽을 순서대로 눌렀는데 왼쪽으로의 이동이 불가능한 상황이었다고 해보자. 그 럴 때는 LEFT RIGHT MERGE … GENERATE… SCORE … 로 기록하면 된다. 점수의 변화가 발생하지 않아도 이동 후에는 점수를 기록해야 한다. 점수를 기록하지 않아도 되는 상황은 해당 방향으로의 이동이 불가능한 경우밖에는 없다. LEFT GENERATE … SCORE n RIGHT GENERATE … SCORE n (MERGE가 발생하지 않아서 점수 변화가 없어도 기록해야 함) RIGHT (이동이 불가능하기 때문에 점수 기록 X) UP MERGE … GENERATE … SCORE n’ ————————————–05/27 13시 55분 내용 추가 ————————————– Qt Creator를 포함한 대다수의 IDE는 프로그램 빌드를 소스 코드가 위치한 폴더가 아닌 다른 폴 더에서 진행한다. YOUR_PROJECT라는 프로젝트를 만들고 프로그램을 빌드하는 경우를 Qt Creator에서 살펴보자. root └ YOUR_PROJECT └ build-YOUR_PROJECT-Desktop_Qt_6_5_0_MinGW_64_bit-Debug └ debug 위와 같은 폴더 구조가 만들어지고 debug 폴더 내에 파일 입출력이 진행된다. 따라서, 제출을 진행할 때 build-… 폴더도 같이 압축하여 제출하도록 한다. TIPS 1. Qt 공식 문서 (https://doc.qt.io/)에 라이브러리 사용법에 대한 정리가 잘 되어 있으므로 해당 사이트를 통해 정보를 얻는 것을 추천한다. 2. 파일 추가나 파일 삭제를 하고 컴파일 에러를 겪는다면 Clean & Build를 해보자. Clean을 함으로써 이전에 프로젝트를 빌딩할 때 생성되었던 object 파일이나 바이너리 파일들을 삭제할 수 있다. Clean을 하고 Build를 하게 되면 clean한 상태에서 프로젝트를 다시 빌 드하게 되므로 변경된 상태로부터 새로이 프로젝트를 빌드할 수 있게 된다. 3. .pro 파일은 Qt build system인 qmake에 사용되는 파일이다. 프로젝트를 제대로 빌드하 기 위해서는 .pro 파일에 본인이 사용하는 .cpp 파일들과 .h 파일들을 명시해야 한다. 예 를 들어, 본인이 game/mycode.cpp와 game/mycode.h를 추가했다면 .pro 파일의 SOURCES와 HEADERS에 추가된 파일들을 적어줘야 컴파일이 진행된다. 4. 레이아웃에 버튼을 추가하고 키보드 방향키를 누르면 게임판의 블록들이 움직이지 않을 수 있다. 이는 버튼을 추가했을 때 키보드의 focus가 버튼 쪽으로 설정되기 때문이다. 이 를 해결하기 위해서는 QWidget 클래스의 focus policy 관련 문서를 읽어보는 것을 추천 한다.

$25.00 View

[SOLVED] Csed 232 object-oriented programming assignment  4 – template & stl

주의 사항 ● 클래스 선언 및 정의를 main.cpp 파일에 작성하는 것을 금지합니다. 그 외에 선언 및 정의의 위치에 대한 제약은 없습니다. ● STL 및 shared_ptr 을 제외한 모든 C++ 문법이 사용 가능합니다. ● 문제에서 제공한 형식을 준수하고 각 문제별 추가적인 세부 조건을 만족하여야 합니다. ● 문제에 명시되어 있지 않더라도 소멸자(Destructor)와 같은 메모리 누수 방지를 위해 필요한 멤버함수는 필수적으로 구현되어야 합니다. ● 문제 조건이 복잡합니다. 모든 문제의 세부 조건을 꼼꼼히 읽어 보시기 바랍니다. 감점 ● 제출 기한에서 하루(24 시간) 늦을 때마다 20%씩 감점 ○ 1 일(20%) , 2 일(40%), … 5 일(100%) ● 컴파일이 정상적으로 이루어지지 않을 경우 0 점 제출방식 채점은 Windows Visual Studio 2022(윈도우 사용자의 경우) 및 Ubuntu 20.04(lts)와 gcc version 9.4.0 (맥 사용자의 경우) 환경에서 이루어집니다. VS 로 작업했을 경우 작업하신 환경이 있는 visual studio 프로젝트 폴더에 Report 를 포함하여 zip 파일로 압축 후 제출해 주시기 바랍니다. (x64 및 .vs 폴더는 전부 지워주십시오) 마찬가지로, 맥 이용자의 경우 소스 코드, 보고서, Makefile 을 포함한 폴더를 압축해서 제출해주시면 됩니다. 폴더명은 ‘학번’으로 만들어 주시고, Report 는 docx 나 pdf 형식으로 제출해주세요. 반드시 PLMS 를 통해 제출해주시기 바랍니다. 이메일 제출은 인정되지 않습니다. 페이지 2 / 11 공통 채점 기준 1. 프로그램 기능 ● 프로그램이 요구 사항을 모두 만족하면서 올바로 실행되는가? 2. 프로그램 설계 및 구현 ● 요구 사항을 만족하기 위한 변수 및 알고리즘 설계가 잘 되었는가? ● 문제에서 제시된 세부 조건을 모두 만족하였는가? ● 설계된 내용이 요구된 언어를 이용하여 적절히 구현되었는가? 3. 프로그램 가독성 ● 프로그램이 읽기 쉽고 이해하기 쉽게 작성되었는가? ● 변수 명이 무엇을 의미하는지 이해하기 쉬운가? ● 프로그램의 소스 코드를 이해하기 쉽도록 주석을 잘 붙였는가? 4. 보고서 구성 및 내용, 양식 ● 보고서는 적절한 내용으로 이해하기 쉽고 보기 좋게 잘 작성되었는가? ● 보고서의 양식을 잘 따랐는가? 다른 사람의 코드나 인터넷에 있는 프로그램을 복사(copy)하거나 간단히 수정해서 제출하면 무조건 ‘F’ 학점이 부여됩니다. 이러한 부정행위가 발견되면 학과에서 정한 기준에 따라 추가적인 불이익이 있을 수 있습니다. 페이지 3 / 11 Shared Pointer & Image Library Objective 본 과제에서는 Standard Template Library 에서 제공하는 기능 중 하나인 shared_ptr 을 직접 구현해 보고 이를 이용한 영상 처리 클래스를 구현하여 봄으로써 template 과 STL 에 대한 이해를 높인다. 문제 1 – SharedPtr 1.1. 개요 본 과제의 1 번 문제는 shared_ptr 의 간소화된 버전인 SharedPtr 템플릿 클래스를 구현해 본다. 스마트 포인터(smart pointer)는 메모리 누수로부터 프로그램을 보호하기 위해 C++의 Standard Template Library (STL)에서 제공하는 기능이다. 스마트 포인터는 포인터처럼 동작하는 클래스 템플릿으로 사용이 끝난 메모리를 자동으로 동적해제해 주는 것이 특징이다. 일반적인 포인터를 사용할 때에는 new 연산자를 통해 실제 메모리를 가리키도록 선언하며 사용이 끝난 포인터에 대해서는 delete 연산자를 통해 메모리를 수동으로 해제해야 한다. 이러한 방식은 메모리 관리의 어려움을 유발하며 메모리 누수 현상이나 메모리 문제로 인한 런타임 에러를 빈번하게 발생시키게 된다. 스마트 포인터는 개발자가 일일이 delete 를 할 필요 없이 메모리의 사용이 끝나면 자동으로 해제하는 방식으로 이러한 어려움을 해결해 준다. C++의 STL 은 여러 종류의 스마트 포인터를 제공하는데 그 중 하나가 shared_ptr 이다. shared_ptr 은 memory 헤더파일을 include 하면 사용 가능하다. shared_ptr 은 동적 할당된 메모리 영역이 현재 더 이상 사용하지 않는 영역인지를 파악하기 위해 참조 카운트 (reference count) 방식을 사용한다. 참조 카운트를 이용한 스마트 포인터 동작 방법에 대해서는 강의 자료 “16. The string Class and the Standard Template Library (1)”과 본 문서의 부록을 참고하기 바란다. 1.2. 과제 요구사항 본 과제에서 구현해야 하는 SharedPtr 의 기능은 다음과 같다. ⚫ SharedPtr 생성 ◼ SharedPtr 은 template class 로 적어도 하나 이상의 template parameter 를 받는다. 만약 MyClass 라는 클래스의 객체를 가리키는 포인터를 생성할 경우 다음과 같은 코드를 이용하여 SharedPtr 객체를 생성할 수 있어야 한다. ◆ SharedPtr ptr; ◼ 또한 아래의 예제 코드와 같이 SharedPtr 객체를 생성할 때 동적 할당된 메모리 영역을 이용하여 SharedPtr 객체를 초기화시킬 수 있다. 페이지 4 / 11 ◆ SharedPtr ptr(new MyClass()); ◼ SharedPtr 객체를 같은 타입의 객체를 가리키는 다른 SharedPtr 객체를 이용하여 초기화시킬 수 있다. ◆ SharedPtr ptr(new MyClass()); SharedPtr ptr2(ptr); ⚫ SharedPtr 대입 연산 ◼ SharedPtr 객체를 다른 SharedPtr 객체에 대입할 수 있다. 이 경우 두 SharedPtr 객체는 공통된 동적할당된 메모리를 가리키게 된다. ◆ SharedPtr ptr(new MyClass()); SharedPtr ptr2; ptr2 = ptr; ◼ SharedPtr 객체에 새로운 동적할당된 메모리 주소를 바로 대입할 수는 없다. 만약 이미 만들어진 SharedPtr 객체에 새롭게 동적할당된 메모리 주소를 대입하기 위해서는 SharedPtr 의 생성자를 이용해 객체를 새로 만들고 대입해야 한다. ◆ SharedPtr ptr; ptr = new MyClass(); // must raise a compile error!! ptr = SharedPtr(ptr); // 이렇게 해야 함. ⚫ SharedPtr 객체의 이용 ◼ SharedPtr 객체는 자신이 가리키는 객체를 이용할 수 있게 하기 위해 다음과 같은 두 가지 연산자를 지원해야 한다 (*, ->). 두 연산자 모두 const 버전과 non-const 버전을 지원해야 한다. ◆ SharedPtr ptr(new MyClass); ptr->some_method(); (*ptr).some_method(); const SharedPtr const_ptr(new MyClass); const_ptr->some_const_method(); (*const_ptr).some_const_method(); ◼ SharedPtr 객체는 필요시 일반 포인터로 변환될 수 있어야 한다. ◆ SharedPtr ptr(new MyClass); MyClass* ptr2 = (MyClass*)ptr; const MyClass* ptr3 = (const MyClass*)ptr; 페이지 5 / 11 ⚫ 자동 동적 해제 ◼ SharedPtr 객체로 더 이상 참조되지 않는 메모리 영역은 자동으로 동적 해제된다. 아래는 이 동작에 대한 예이다. ◆ SharedPtr ptr(new MyClass(1)); // 첫번째 객체 동적할당 SharedPtr ptr2(ptr); ptr = SharedPtr(new MyClass(2)); // 두번째 객체 동적할당. 첫번째 객체는 ptr2 에서 가리키고 있으므로 계속 유지됨 ptr2 = SharedPtr(new MyClass(3)); // 세번째 객체 동적할당. 첫번째 객체는 더 이상 아무 SharedPtr 객체가 가리키지 않으므로 자동으로 동적해제. ⚫ 동적할당된 배열의 지원 ◼ 본 과제에서 작성하는 SharedPtr 객체는 배열의 동적할당도 지원한다. 배열의 경우 동적할당을 위해 new 와 delete 대신 new[]와 delete[] 연산자를 사용해야 한다. 이를 위해 SharedPtr 템플릿은 두번째 template parameter 로 deallocation 을 위한 함수를 입력받아서 일반 객체와 배열의 메모리 해제를 다르게 처리하는 것을 지원한다. 이에 대한 구현은 본 과제에 같이 제공된 skeleton code 를 참고하기 바란다. ◆ template void ArrayDeallocator(T* ptr) { delete[] ptr; } SharedArray ptr(new int[N]); // 두번째 template parameter 로 Array 를 해제하기 위한 함수를 파라미터로 지정할 수 있다. 두번째 template parameter 가 지정되지 않는 경우에는 일반 객체를 해제하기 위한 함수가 default parameter 로 지정된다. ◼ 같이 제공된 skeleton code 에서는 배열을 위해 다음과 같이 정의된 SharedArray 라는 타입을 제공한다. ◆ Template using SharedArray = SharedPtr; ◼ 본 과제에서 작성해야 하는 부분은 동적할당된 배열의 지원을 위한 배열 원소 접근 연산자이다. ([ ]) ◆ SharedArray ptr(new MyClass[10]); ptr[0].some_method(); const SharedArray ptr(new MyClass[10]); ptr[2].some_const_method(); 페이지 6 / 11 ⚫ 기타 요구 사항 ◼ SharedPtr 템플릿 클래스를 객체 지향 프로그래밍이나 제네릭 프로그래밍 관점 또는 다른 측면에서 개선할 수 있다면 어떤 식으로 개선할 수 있을지 보고서에 기술할 것. ◼ 첨부된 코드 중 SharedPtr_test.cpp 은 SharedPtr 클래스 템플릿이 제대로 구현되었는지 학생이 스스로 확인할 수 있는 간단한 코드들이 작성되어 있다. 그러나 본 코드는 참고용으로 제공된 것일 뿐 본인의 클래스가 여러가지 상황을 고려하여 잘 구현되었는지 여부는 직접 확인해 볼 것을 추천한다. 조교는 해당 sharedPtr_test.cpp 가 아닌 더 복잡한 상황을 테스트해 볼 것이다. 참고로 SharedPtr 클래스 템플릿이 제대로 구현되었다면 SharedPtr_test.cpp 컴파일 후 결과는 다음과 같아야 한다. test_SharedPtr() MyClass object(100) created: 1 MyClass object(200) created: 2 ============= ptr1: 200 ptr2: 100 ptr3: 100 ============= Dealloc Object MyClass object(100) destroyed: 1 ============= ptr1: 200 ptr2: 200 ptr3: 200 ============= MyClass object(300) created: 2 ============= const_ptr: 300 const_ptr: 300 ============= pp: 200 Dealloc Object MyClass object(300) destroyed: 1 Dealloc Object MyClass object(200) destroyed: 0 test_SharedArray() ============= arr1[0]: 1 arr2[0]: 1 arr3[0]: 1 ============= ============= arr1[0]: 2 arr2[0]: 3 arr3[0]: 3 ============= Dealloc Array ============= arr1[0]: 2 arr2[0]: 2 arr3[0]: 2 ============= Dealloc Array 페이지 7 / 11 문제 2 – Image 2.1. 개요 본 과제의 2 번 문제는 이미지 처리를 위한 기초적인 템플릿 클래스 작성이다. 이미지는 컴퓨터에서 일반적으로 픽셀들의 2 차원 배열로 표현되며, 각각의 픽셀에는 밝기 정보나 색상에 대한 정보가 저장된다. 컬러 이미지의 경우에는 각 픽셀에 Red, Green, Blue 의 세가지 색상에 대한 정보가 저장되며 그레이스케일 (grayscale) 이미지의 경우에는 각 픽셀에 밝기 정보가 저장된다. 일반적으로 색상 정보나 밝기 정보는 0 부터 255 사이의 값을 갖는 8 bit unsigned integer 타입을 이용하여 저장된다. 따라서 그레이스케일 이미지는 픽셀마다 8 비트를 사용하며 컬러 이미지는 픽셀의 각 색상마다 8 비트를 사용하여 총 24 비트를 사용한다. 이미지의 픽셀마다 수치 연산을 적용하는 경우에는 8 비트 정수형 타입은 각종 수치 연산에 적합하지 않기 때문에 float 이나 double 과 같은 부동소수점 실수형 타입을 이용하기도 한다. 본 과제에서는 이러한 이미지를 다루기 위한 템플릿 클래스를 작성한다. 이를 통해 이미지 파일 포맷 중 하나인 BMP 파일로부터 이미지를 읽어서 간단한 영상 처리를 거친 후 나온 결과를 BMP 파일로 저장할 수 있는 프로그램을 작성해 본다. 또한 BMP 파일로 읽은 그림을 문자로 변환하여 출력하는 코드도 작성한다. 2.2. 과제 요구사항 본 과제에서 구현해야 하는 Image 클래스의 기능은 다음과 같다. ⚫ Image 생성 ◼ Image 클래스 템플릿은 다양한 픽셀 타입을 지원한다. 이를 위해 픽셀 타입을 템플릿 파라미터로 받는다. 예제 코드는 다음과 같다. ◆ Image img; // 픽셀값으로 8 비트 unsigned integer 타입을 사용하는 그레이스케일 이미지 객체 생성. uint8_t 는 8 비트 unsigned integer 타입으로 cstdint 에 선언되어 있음. Image imgf; // 픽셀값으로 float 타입을 사용하는 그레이스케일 이미지 객체 생성 Image rgbimg; // 픽셀값으로 8 비트 정수형을 사용하는 RGB image 생성. RGB 클래스 템플릿은 제공된 skeleton code 참고 ⚫ Image 클래스 템플릿에서 제공하는 public interface ◼ 생성자 ◆ Image() // default constructor 페이지 8 / 11 ◆ Image(size_t _width, size_t _height); // 이미지 객체 생성 시 이미지의 크기만큼 메모리 할당 (_width x _height) ◆ Image(size_t _width, size_t _height, const PixelType& val); // 이미지 객체 생성 시 이미지의 크기만큼 메모리 할당하고 val 값을 이용해 모든 픽셀값 초기화 ◆ Image(const Image& img); // copy constructor ◼ 소멸자 ◆ ~Image(); // 특별히 아무 일도 하지 않음. ◼ 연산자 ◆ 대입 연산자 (operator=)– 같은 픽셀 타입을 사용하는 이미지 객체로부터 대입받 는연산자. 다음과 같은 동작을 수행할 수 있어야 함. ⚫ const Image a; Image b; b = a; ◆ 배열 액세스 연산자 ⚫ 이는 따로 구현할 필요 없음. skeleton 코드에 이미 구현되어 있으니 참고바람 ◼ 기타 멤버 함수 ◆ size_t width() const; // 이미지의 가로 길이 리턴 ◆ size_t height() const; // 이미지의 세로 길이 리턴 ⚫ 기타 요구 사항 ◼ Image 클래스의 픽셀 값을 저장하기 위한 공간은 동적 할당을 이용해 구현해야 한다. 이 때 문제 1 에서 구현한 SharedArray 를 이용하여 구현할 것. ◼ Image 템플릿 클래스를 객체 지향 프로그래밍이나 제네릭 프로그래밍 관점 또는 다른 측면에서 개선할 수 있다면 어떤 식으로 개선할 수 있을지 보고서에 기술할 것. ◼ 본 과제에 같이 제공된 image_test.cpp 는 Image 클래스 템플릿을 이용한 간단한 영상 처리 예제 코드로 Image 클래스 템플릿이 잘 구현되었다면 다음과 같은 내용을 출력하게 된다. 이 외에도 본인이 구현하고 싶은 다른 영상 처리 예제나 추가 기능이 있다면 구현하고 이를 보고서에 기술할 것. Image 클래스 역시 조교는 image_test.cpp 에 제시된 코드 외에도 더 복잡한 상황을 테스트해 볼 것이다. 페이지 9 / 11 Dealloc Array Dealloc Array Dealloc Array Dealloc Array Dealloc Array 2. ASCII conversion 2.1. Grayscale conversion Dealloc Array 2.2. Downsampling Dealloc Array Dealloc Array Dealloc Array 2.3. ASCII art drawing OOOOOOOOOOOOOOOOOOOOOOOOOpEo3Cii}t5SVOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOde())JJJJJJJ7(uSpOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOx7)))))JJJJJJJ777iZhOOOOOOOO OOOOOOOOOOOOOOOOOOOOptv)))))))JJJJJJJ77777Ij6pOd]p OOOOOOOOOOOOOOOOOOOp3vvv)))))))JJJJJJJ77J7777(((CO OOOOOOOOOOOOOOOOOOOevvv)v))))))))JJJJJJJ7777777(ZO OOOOOOOOOOOOOOOOOOkvvvvvv)))))))))JJJJJJJJ77777|9O OOOOOOOOOOOOOOOOOOfTvvvvvv)v)))))))JJJJJJJJ7777yOO OwOOOOOOOOOOOOOOO6TTTvvvvvvv))))))))JJJJJJJJ77YOOO OFfwOOOOOOOOOOOOp5TTTvvvvvvv))v)))))))JJJJJJIqVdOO OZ(7[4OOOOOOOOOOVLTTTTvvvvvvT+v))))))))Jfnj6dyidOO OVI77F2OOOOOOOOOOT=zTTTTvvT!^Lv)))))))}Z[3}FJJfOOO Op3JJJ)19OOOOOOOOSk1vTTTTzCjpy)vv)))))7))JJJJJEOOO Olv7JJ))J5pOOOOOOSz^5TTTT3E/vV[)v)))))))))JJJeOOOO Ov)JJ))vvTFSOOOOOu“[)JTTo/.`xjvvvvv)))))))|yOOOOO Oy()))vvTTTL19OOd97vtfff7}I`=htvvvvv))))Jt2pOOOOOO OOpP))vvTLLLsv5pqFo3fffffTuShovvvvvvv))eSaZ3dOOOOO OOOOe(vTTLLsLLL|ZLvifFF7FJTTTTTTvvvvvv}|)))ZOOOOOO OOOOpSSFLLssLLLLsLLL|+`.FTTTTTTTTvvvvvvv))fpOOOOOO OOOOOOOpYJLLLLLLLLsLTFJi7LTTTTTTTvvvvvvvvf4OOOOOOO OOOOOOOOOVZ)LLLLLLLsLLTLLLTTTTTTTTTTvvvvnpOOOOOOOO OOOOOOOOOOOVx|LLLLLLLLLLLLLLTTTTTTTTvv}wOOOOOOOOOO OOOOOOOOOOOOOOwl)sLLJLs))LLLTTTTTTT(uwOOOOOOOOOOOO OOOOOOOOOOOOOOOOpFsl{exfCfLLLLLsJo9OOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOI)CC{LtJ3LLLLLLLsiqOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOO[LeCLFLl3LLLLLsLLLL5OOOOOOOOOOOOO OOOOOOOOOOOOOOOOOYsYTJ5L}1LsLLL7sLsLL[OOOOOOOOOOOO OOOOOOOOOOOOOOOOOETIlLs7f3LLLLLPIsLTTvYOOOOOOOOOOO OOOOOOOOOOOOOOOOO9TITlIfs1LLsss9p3LTvvJkOOOOOOOOOO OOOOOOOOOOOOOOOOOOv{I3f337LLLLLdOpIvv)JuOOOOOOOOOO OOOOOOOOOOOOOOOOOO{ssLsLLLssLLs4OOV{)J(EOOOOOOOOOO OOOOOOOOOOOOOOOOOOuLsLsLLLLLLLsVOOO6(C3EOOOOOOOOOO OOOOOOOOOOOOOOOOOOjLLLLLLLLLLLspOOOO]o5OOOOOOOOOOO OOOOOOOOOOOOOOOOOOPsLLLLLLLLLLLpOOOOO4OOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOl)iultt|ss)JiypOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOk|fOOOO4}LJ(J7fVOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOC|VOOOOpnv((3pOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOO5|qOOOOOOSC(apOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOVh2(e22]]2ESx|oOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOE5ZlI[55555555CF5OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOphqE]ayjjjya2Sk9OOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOpppOOOOOOOOOOOOOOOOOOOOOOO Dealloc Array Dealloc Array Dealloc Array Dealloc Array Dealloc Array 페이지 10 / 11 부록 – 참조 카운팅 (Reference counting) STL 의 shared_ptr 은 참조 카운팅을 이용하여 동적 할당된 객체를 관리한다. 동작 원리는 다음과 같다. 아래와 같은 코드가 있다고 하자. 1: { 2: string* tmp = new string(“Some String”); 3: shared_ptr ptr1(tmp); 4: { 5: shared_ptr ptr2; 6: ptr2 = ptr1; 7: } 8: } 위의 코드에서 2 번 라인까지 실행되었다고 하자. 이 때 tmp 가 가리키고 있는 string 객체는 heap 영역에 동적 할당된다. 이때 heap 영역을 다음과 같이 나타낼 수 있다. 3 번 라인이 실행되면서 shared_ptr 의 객체인 ptr1 이 생성되고 ptr1 은 tmp 가 가리키던 string 객체를 가리키게 된다. 이 때 마찬가지로 heap 영역에 이 object 를 몇 개의 shared_ptr 객체가 가리키고 있는지를 카운팅하는 변수 (counter)를 생성한다. 그리고 현재 ptr1 이 object 를 가리키고 있으므로 카운팅 변수를 1 로 초기화한다. 이 상태를 도식화하면 다음과 같다. 5 번 라인이 실행되면서 shared_ptr 객체인 ptr2 가 생성된다. 그리고 6 번 라인이 실행되면서 ptr2 에 ptr1 의 값을 대입한다. 이 대입연산에서 ptr2 는 ptr1 이 가리키고 있던 object 를 같이 가리키면서 동시에 counter 도 가리키게 된다. 또한 이 때 counter 의 값을 1 증가시킨다. 페이지 11 / 11 7 번 라인이 실행되면서 안쪽 블록을 벗어나게 되고 블록 내의 local variable 인 ptr2 객체가 소멸된다. ptr2 객체가 소멸되면서 counter 를 1 감소시킨다. 마지막으로 8 번 라인이 실행되면서 바깥쪽 블록을 벗어나게 되고 블록 내의 local variable 인 ptr1 객체가 소멸된다. ptr1 객체가 소멸되면서 다시 counter 를 1 감소시킨다. 그리고 감소된 counter 가 0 이 되었다면 ptr1 객체의 소멸자는 counter 와 object 를 모두 동적 해제한다.

$25.00 View

[SOLVED] Csed 232 object-oriented programing assignment  3 – inheritance & polymorphism

주의 사항 ● 클래스 선언 및 정의를 main.cpp 파일에 작성하는 것을 금지합니다. 그 외에 선언 및 정의의 위치에 대한 제약은 없습니다. ● STL 사용이 가능합니다. ● 모든 C++ 문법이 사용 가능합니다. ● 문제에서 제공한 형식을 준수해야 합니다. ● 문제에 명시되어 있지 않더라도 소멸자(Destructor)와 같은 메모리 누수 방지를 위해 필요한 멤버함수는 필수적으로 구현되어야 합니다. ● 문제 조건이 복잡합니다. 모든 문제의 세부 조건을 꼼꼼히 읽어 보시기 바랍니다. ● 과제 관련 질문은 PLMS를 통해 문의 바랍니다. 감점 ● 제출 기한에서 하루(24시간) 늦을 때마다 20%씩 감점 ○ 1일(20%) , 2일(40%), … 5일(100%) ● 컴파일이 정상적으로 이루어지지 않을 경우 0점 ● 제출 형식 위반 (파일 이름 등) 제출방식 채점은 Windows Visual Studio 2022(윈도우 사용자의 경우) 및 Ubuntu 20.04(lts)와 gcc version 9.4.0 (맥 사용자의 경우) 환경에서 이루어집니다. VS 로 작업했을 경우 작업하신 환경이 있는 visual studio 프로젝트 폴더에 Report 를 포함하여 zip 파일로 압축 후 제출해 주시기를 바랍니다. (x64 및 .vs 폴더는 전부 지워주십시오) 마찬가지로, 맥 이용자의 경우 소스 코드, 보고서, Makefile을 포함한 폴더를 압축해서 제출해주시면 됩니다. 폴더명은 ‘학번’으로 만들어 주시고, Report는 docx 나 pdf 형식으로 제출해주세요. 반드시 PLMS 를 통해 제출해주시기를 바랍니다. 이메일 제출은 인정되지 않습니다. 폴더 이름과 압축파일은 “Assign3_학번”으로 만드시면 됩니다 (e.g., Assign3_20229999). 1 공통 채점 기준 1. 프로그램 기능 ● 프로그램이 요구 사항을 모두 만족하면서 올바로 실행되는가? 2. 프로그램 설계 및 구현 ● 요구 사항을 만족하기 위한 변수 및 알고리즘 설계가 잘 되었는가? ● 문제에서 제시된 세부 조건을 모두 만족하였는가? ● 설계된 내용이 요구된 언어를 이용하여 적절히 구현되었는가? 3. 프로그램 가독성 ● 프로그램이 읽기 쉽고 이해하기 쉽게 작성되었는가? ● 변수명이 무엇을 의미하는지 이해하기 쉬운가? ● 프로그램의 소스 코드를 이해하기 쉽도록 주석을 잘 붙였는가? 4. 보고서 구성 및 내용, 양식 ● 보고서는 적절한 내용으로 이해하기 쉽고 보기 좋게 잘 작성되었는가? ● 보고서의 양식을 잘 따랐는가? 다른 사람의 프로그램이나 인터넷에 있는 프로그램을 복사(copy)하거나 간단히 수정해서 제출하면 학점은 무조건 ‘F’가 됩니다. 이러한 부정행위가 발견되면 학과에서 정한 기준에 따라 추가적인 불이익이 있을 수 있습니다. 2 ASCII Art ASCII art는 ASCII 문자만을 사용하여 그림이나 도형을 만드는 예술 형식이다. 예를 들어서, 그림 1과 같이 임의의 사진에서 어두운 부분에 해당하는 위치에 복잡한 글자를 위치시키고 밝은 부분에는 단순한 글자를 위치시키면 문자로만 이뤄진 그림이 아래와 같이 보이게 된다. 본 과제에서는 클래스 상속과 다형성을 사용해서 간단한 ASCII Art를 생성하는 프로그램을 만드는 것을 목적으로 한다. [ 그림1. ASCII art example] 문제 해결을 위해 사용되는 class와 상속 관계는 아래 그림 2과 같다. 화살표는 상속을 의미하고 방향표시가 있는 class가 부모 class다. 예를 들어서 classic class는 artist class를 상속받는다. [ 그림2. Class diagram ] 3 프로그램을 구현에 아래와 같은 제약사항들이 따른다. ● 그림2에 명시된 멤버변수 및 함수는 반드시 구현되고 사용되어야 한다. ● 그림2에 명시된 멤버함수의 인자와 return type이 준수되어야 한다. ● 그림2에 명시된 class 외에 다른 class를 정의해서 사용할 수 없다. ● 제공된 함수(function) 외에 함수를 정의해서 사용할 수 없다. ● class diagram에 명시된 멤버함수(method)와 멤버변수 외에도 필요한 멤버함수 및 멤버변수를 자유롭게 추가할 수 있다. ● 주어진 main 함수는 절대로 수정할 수 없다. 그림 2에 표현된 클래스 및 main 함수에 대한 자세한 설명은 아래와 같다. int main(int argc, char *argv[]) C++ main 함수에 int 와 char*[] 를 argument로 정의한 경우, 첫 번째 인자는 프로그램 실행시 입력받은 argument의 수, 두 번째 인자는 실제 argument 값들을 갖는다. 예를 들어서 임의의 compile된 프로그램 hello 를 ./hello 2 world 1234 라는 명령어로 실행 시킬 경우 argc 는 4, argv[1] 는 2 argv[2] 는 world, argv[3] 는 1234가 된다. 참고로 argv[0]에는 실행파일경로가 자동으로 할당되며, 따라서 argc 는 3이 아닌 4가 된다. 본 과제에서 최종 compile된 프로그램은 실행 시 3개의 인자를 받는다. 첫 번째 인자는 input파일의 경로, 두 번째 인자는 configuration 파일의 경로, 세 번째 인자는 output 파일의 경로다. 주어진 main함수는 아래와 같으며 절대 수정을 불가한다. int main(int argc, char *argv[]) { if (argc != 4) { cout drawer 생성자가 artist가 아닌 artist*를 인자로 받는 이유를 설명하라 (보고서에 작성) 문제5> artist 클래스를 상속받아서 자신만의 style을 정의하고 그림을 출력하라 (보고서에 작성) 문제6> 제시된 클래스들을 객체 지향 프로그래밍 관점에서 개선할 수 있다면 어떤 점을 더 개선할 수 있을지 토의하라 (보고서에 작성) 11

$25.00 View

[SOLVED] Csed 232 object-oriented programming assignment 2

[안내사항] 1. 모든 문제는 C++의 standard 입출력(i.e., cout, cin)을 기본으로 합니다. 2. 잘못된 입력에 대해서는 예외처리를 기본적으로 수행합니다. 3. 과제에 관한 질문은 PLMS를 통해 문의하시길 바랍니다. [감점] 1. 제출 기한이 지나면 얻은 총점의 20% 감점 2. 하루(24시간) 늦을 때마다 추가 20%씩 감점 – 1일 이내: 20% 감점, 2일 이내: 40% 감점, 3일 이내: 60% 감점 4일 이내:80% 감점 – 4일 이상 지연: 0점 3. 컴파일이 정상적으로 되지 않을 경우 프로그램 기능 점수 0점 [제출] 1. Code (e.g., cpp or hpp), executable file (exe), README.txt, report.pdf를 하나의 폴더에 담아 서 압축하여 제출하시면 됩니다. 만약 MacOS를 이용하는 경우 executable file 대신 makefile 을 제출하시면 됩니다. 2. 이때 makefile을 통해서는 executable file이 생성되어야 하며 README.txt에는 각 코드파일들 에 대한 설명을 간단히 서술하시면 됩니다. 3. Report는 제시된 양식(PLMS 참고)을 따르되, 주어진 프로그램을 객체 지향 프로그래밍의 관점 에서 어떻게 구현하였고 혹은 어떤 기능을 추가할 수 있을지에 대해 본인의 생각을 보고서 “3. 토론 및 개선”에 간략히 작성하면 됩니다. 4. 폴더 이름과 압축파일은 “Assign2_학번”으로 만드시면 됩니다 (e.g., Assign2_20229999). 5. 채점은 Windows Visual Studio 2022 환경에서 이루어집니다. 환경 세팅이 어려운 경우 Visual Studio Code를 이용해서 코드를 작성하셔도 됩니다. 6. 제출은 반드시 PLMS를 통해 제출해주시기 바랍니다. 이메일 제출은 인정되지 않습니다. 4 일 이상 지연 제출할 경우 0점이므로 4 일 ( 4월 11일 23시 59분 59초)이 지난 이후는 PLMS 를 통해 제출하실 수 없습니다. [채점기준] 1. 프로그램 기능 – 50% l 프로그램이 요구 사항을 모두 만족하면서 올바로 실행되는가? 2. 프로그램 설계 및 구현 – 35% l 요구 사항을 만족하기 위한 변수 및 알고리즘 설계가 잘 되었는가? l 각 문제에서 제시한 세부 조건의 유의사항을 모두 만족하였는가? l 입력과 출력이 주어진 형식에 맞게 잘 나타나는가? l 예외처리를 알맞게 하였는가? 3. 프로그램 가독성 – 5% l 프로그램이 읽기 쉽고 이해하기 쉽게 작성되었는가? l 변수 명이 무엇을 의미하는지 파악하기 쉬운가? l 프로그램의 소스 코드를 이해하기 쉽도록 주석을 잘 붙였는가? 4. 보고서 구성 및 내용, 양식 – 10% l 보고서는 적절한 내용으로 이해하기 쉽고 보기 좋게 잘 작성되었는가? l 보고서의 양식을 잘 따랐는가? l 각 문제에서 제시한 질문이 있다면, 그에 대한 답변이 충분한가? [주의사항] 다른 사람의 프로그램이나 인터넷에 있는 프로그램을 단순히 복사(copy)하거나 수정해서 제출하면 부정 행위로 간주됩니다. 부정행위 발견 시 ‘F’ 학점을 받을 수 있으며 학과에서 정한 기준에 따라 추가적인 불이익이 있을 수 있습니다. [문제] 1. Overview 본 과제에서는 학생 데이터를 입력 받은 후 피벗 변환을 수행하고, 수행 결과를 테이블 및 차트 로 시 각화 하는 문제를 해결한다. l 피벗 변환이란? 주어진 데이터를 특정 열의 카테고리 기준으로 묶고 다른 열의 수치에 대해 합계, 평균, 최대값 등을 구하는 변환이다. 그림 1 피벗 변환 예시 2. 학생 데이터 설명 1) Dept: 학과 2) Gender: 성별 3) Name: 이름 4) Age: 나이 l 데이터 세부 설명 – Dept, Gender, Name은 std::string type을 사용한다. – Dept, Gender, Name은 공백을 포함하지 않는다. – Age는 integer type을 사용한다. – Dept의 종류(e.g., CS, Bio)는 9개를 넘지 않는다. (9개까지 가능) – 각 Dept에 소속된 학생 수는 10,000을 넘지 않는다. (10000개까지 가능) – Gender는 M,F 만 입력이 가능하다. (M = male, F = Female) – Dept는 대문자만 입력으로 받는다. – Name은 대소문자 모두 입력으로 받을 수 있다. (e.g., Minsu, MinSu, minsu) – Age의 범위는 18

$25.00 View

[SOLVED] Csed 232 object-oriented programming assignment 1

[안내사항] 1. 모든 문제는 C++의 standard 입출력(i.e., cin, cout)을 기본으로 합니다. 2. 채점용 testcase를 통과한 개수에 비례하여 프로그램 기능 점수가 부여됩니다. – (통과 case / 총 case) * 채점 기준에 명시된 프로그램 기능 점수 – testcase는 공개되지 않습니다. [감점] 1. 제출 기한이 지나면 얻은 총점의 20% 감점 2. 하루(24시간) 늦을 때마다 추가 20%씩 감점 – 1일 이내: 20% 감점, 2일 이내: 40% 감점, 3일 이내: 60% 감점 4일 이내:80% 감점 – 4일 이상 지연: 0점 3. 컴파일이 정상적으로 되지 않을 경우 프로그램 기능 점수 0점 [제출방식] 채점은 Windows Visual Studio 2022 환경에서 이루어집니다. 파일을 업로드하실 때, 작업하신 환경이 있는 프로젝트 폴더에서 디버그 폴더를 삭제한 후 그대로 압축해서 올려 주시기 바랍니다. 폴더명은 문제#_학번(e.g., prob1_20229999)으로 만들어 주십시오. 또한 문제 폴더 안에 각 문제에 해당하는 Report(prob1_20229999_report)도 같이 넣어서 zip파일로 만든 후 제출해 주시기 바랍니다. 이때, 문제마다 따로 프로젝트를 생성하고, 따로 압축하여 제출해 주시기 바랍니다. 즉, 총 3개의 파일을 제출하셔야 합니다. 제출은 반드시 PLMS를 통해 제출해주시기 바랍니다. 이메일 제출은 인정되지 않습니다. 4일 이상 지연 제출할 경우 0점이므로 4 일 ( 3월 21일 23시 59분 59초)이 지난 이후는 PLMS를 통해 제출하실 수 없습니다. 제출파일 예시) prob1_20229999.zip, prob2_20229999.zip, prob3_20229999.zip [채점기준] 1. 프로그램 기능 – 50% l 프로그램이 요구 사항을 모두 만족하면서 올바로 실행되는가? 2. 프로그램 설계 및 구현 – 35% l 요구 사항을 만족하기 위한 변수 및 알고리즘 설계가 잘 되었는가? l 각 문제에서 제시한 세부 조건의 유의사항을 모두 만족하였는가? l 입력과 출력이 주어진 형식에 맞게 프로그램이 잘 작동하는가? 3. 프로그램 가독성 – 5% l 프로그램이 읽기 쉽고 이해하기 쉽게 작성되었는가? l 변수 명이 무엇을 의미하는지 파악하기 쉬운가? l 프로그램의 소스 코드를 이해하기 쉽도록 주석을 잘 붙였는가? 4. 보고서 구성 및 내용, 양식 – 10% l 보고서는 적절한 내용으로 이해하기 쉽고 보기 좋게 잘 작성되었는가? l 보고서의 양식을 잘 따랐는가? l 각 문제에서 제시한 질문이 있다면, 그에 대한 답변이 충분한가? [주의사항] 다른 사람의 프로그램이나 인터넷에 있는 프로그램을 단순히 복사(copy)하거나 수정해서 제출하면 부정행위로 간주됩니다. 부정행위 발견 시 ‘F’ 학점을 받을 수 있으며, 학과에서 정한 기준에 따라 추가적인 불이익이 있을 수 있습니다. 문제 1번 (배점 30점) 포항공대 학생 준영이는 객체 지향 프로그래밍 수업을 수강하기 전, 겨울방학 기간동안 주어진 10진수를 2진수 (혹은 8진수, 16진수)로 변환하는 프로그램을 만들기로 하였다. 10진수와 변환해야 할 진수가 주어질 때, 실행결과를 바르게 출력하시오. [입력] 10진수와 변환해야 할 진수가 int type으로 주어진다. [출력] 주어진 10진수를 변환해야 할 진수로 나타낸다. [세부조건] 1. std::hex, std::oct는 사용이 불가능하다. [입출력 예시] input output 119 2 119 8 119 16 1110111 167 77 문제 2번 (배점 30점) 포항공대 학생 민수는 겨울방학 기간동안 계산기 프로그램을 만들고 있다. 이때 민수가 만들어야 하는 계산기는 ‘+’, ‘-‘, ‘*‘, ‘/‘, ‘sqrt’, ‘square’로 총 6가지 연산이 가능한 계산기이다. 연산과 두 개의 숫자를 입력으로 받아서 연산 결과를 바르게 출력하시오. 이때, sqrt 와 square 연산은 하나의 숫자만 주어진다. [입력] 1. 연산자는 char (array)자료형이며, 두 개의 숫자는 float 자료형이다. 2. 계산기가 받아들일 수 있는 연산자는 ‘+’, ‘-‘, ‘*‘, ‘/‘, ‘sqrt’, ‘square’이며 각각은 순서대로 덧셈, 뺄셈, 곱셉, 나눗셈, 루트(√ ! ), 제곱( !)을 의미한다. 3. 연산자와 각 숫자 사이에는 공백 한 칸이 있다. [출력] 주어진 입력에 기초하여 연산결과를 바르게 출력한다. [세부조건] 2. 계산 결과가 소수점 아래 3자리보다 길 경우 소수점 셋째 자리까지 반올림하여 출력한다. ex) 3.986 ∗ 2.515 = 10.02479 ≅ 10.025 (소수점 셋째 자리까지 반올림) 3. 입력의 두 번째 숫자에 0이 들어오는 상황은 고려하지 않는다. 4. 정수로 떨어지는 경우에는 소수로 표현하지 않아도 된다. [입출력 예시] input output + 1.35 2.47 * 3.986 2.515 / 24.999 3.900 – -101.35 2.47 square 4 sqrt 4 3.820 10.025 6.410 -103.820 16 2 문제 3번 (배점 40점) 포항공대 학생 준영이와 민수는 겨울방학 기간동안 각자가 만든 프로그램(문제1, 문제2)을 기반으로 하나의 통합된 계산기 프로그램을 만들고자 한다. 이들이 만들고자 하는 프로그램은 두 개의 숫자(2진수 or 8진수 or 16진수)와 연산을 입력으로 받은 후, 이를 10진수로 출력하는 것이다. 연산과 두 개의 숫자를 입력으로 받아서 연산 결과를 바르게 출력하시오. [입력] 1. 연산자는 char type, 숫자는 std::string type이 입력으로 들어온다. 이때, 두 개의 숫자는 2진수 or 8진수 or 16진수이다. 각각의 진수는 ‘0b’, ‘0’, ‘0X’가 숫자 앞에 붙어서 표현된다. 예를 들어, 0b1001, 020, 0X2F와 같이 2, 8, 16진수가 표현이 가능하다. 2. 계산기가 받아들일 수 있는 연산은 ‘+’, ‘-‘, ‘*‘, ‘/‘이며 각각 순서대로 덧셈, 뺄셈, 곱셉, 나눗셈을 의미한다. 3. 연산자와 각 숫자 사이에는 공백 한 칸이 있다. [출력] 주어진 입력에 기초하여 연산결과를 10진수로 출력한다. [세부조건] 1. 계산 결과가 소수점 아래 3자리보다 길 경우 소수점 셋째 자리까지 반올림하여 출력한다. 2. 입력의 두 번째 숫자에 0이 들어오는 상황은 고려하지 않는다. 3. 정수로 떨어지는 경우에는 소수로 표현하지 않아도 된다. 4. 입력으로 음수나 소수는 들어오지 않는다. [입출력 예시] input output + 0X52 0b1000 – 070 0XF * 0b10 031 / 0XFF 032 90 41 50 9.808

$25.00 View

[SOLVED] Csed101. programming & problem solving programming assignment 4

◼ 개발 환경: Python 3.x ◼ 제출물 • .py 소스 코드 (assn4_model.py, assn4_app.py) ➢ 프로그램의 소스 코드에 채점자의 이해를 돕기 위한 주석을 반드시 붙여주세요. • 보고서 파일 (.docx, .hwp 또는 .pdf; assn4.docx, assn4.hwp 또는 assn4.pdf) • 보고서는 AssnReadMe.pdf를 참조하여 작성하시면 됩니다. • 명예 서약 (Honor code): 표지에 다음의 서약을 기입하여 제출해 주세요: “나는 이 프로 그래밍 과제를 다른 사람의 부적절한 도움 없이 완수하였습니다.” 보고서 표지에 명예 서약이 기입되어 있지 않은 과제는 제출되지 않은 것으로 처리됩니다. • 작성한 소스 코드와 보고서 파일은 PLMS를 통해 제출해 주세요. ◼ 주의 사항 • 구문 오류(Syntax Error)가 발생하거나 실행이 되지 않는 과제는 0점으로 채점됩니다. • 제출 기한보다 하루 늦게 제출된 과제는 최종 20%, 이틀 늦게 제출된 과제는 최종 40% 감점됩니다. 제출 기한보다 사흘 이상 늦으면 제출 받지 않습니다 (0점 처리). 늦은 제 출시 PLMS에 기록된 최종 수정일시를 기준으로 감점합니다. • 각 문제의 제한 조건과 요구 사항을 반드시 지켜 주시기 바랍니다. • 이번 과제는 추가 기능 구현과 관련된 추가 점수가 따로 없습니다. • 보고서 작성 시, 참고 링크도 포함해주세요. 부정 행위 적발 시 0점 처리됩니다. • 부정행위에 관한 규정은 POSTECH 전자컴퓨터공학부 학부위원회의 “POSTECH 전자컴퓨터공 학부 부정행위 정의”를 따릅니다 (PLMS의 본 과목 공지사항에 등록된 글 중, 제목이 [document about cheating]인 글에 첨부되어 있는 disciplinary.pdf를 참조할 것.) 2 ◼ Problem: 지뢰찾기 (목적) (1) Python tkinter 라이브러리를 이용하여 GUI 프로그래밍을 익힙니다. (2) 클래스 정의 및 인스턴스 생성을 익힙니다. (3) 클래스 상속 및 메서드 오버 라이딩을 익힙니다. (설명) 지뢰 찾기는 기억력과 추리력을 요하는 간단한 게임으로, 지뢰를 피해 모든 빈 칸을 찾는 것이 이 게임의 목표입니다. 보드의 각 칸에는 지뢰가 있는 칸과 없는 칸으로 이루어지며, 플레이어는 마우스 클릭을 통해서 보드와 상호작용하며 지뢰가 없는 구역만 밝혀야 합니다. 사용자가 만약 지뢰가 없는 칸을 클릭할 경우에는 인접한 8칸(자신을 중심으로 한 3×3 구역)에 대하여 지뢰의 개수를 숫자를 통해서 힌트를 줍니다. 이를 기반한 추리를 통해서 지뢰가 없는 모든 칸을 밝혀야 합니다. 아래 그림에서 볼 수 있듯이 파란 네모 안에 3은 자신과 인접한 8칸(빨간 네모 안의 영역)에 3개의 지뢰가 있는 것을 나타냅니다. [게임 규칙] (1) 플레이어는 두 가지 동작(마우스 우 클릭, 좌 클릭)을 통해서 보드와 상호 작용할 수 있습니다. (2) 플레이어가 마우스 우 클릭을 수행했을 때 기대할 수 있는 결과는 다음과 같습니다. A. 이미 밝혀진 칸인 경우, 아무 일도 일어나지 않습니다. B. 아직 밝혀지지 않은 칸인 경우 ⁻아직 깃발이 없는 경우, 깃발을 통해서 마킹을 할 수 있습니다. 깃발의 경우 플레이의 부수적인 도구로 모든 지뢰가 있는 위치를 기억하는 것은 플레이에 부담을 줄 수 있기 때문에 플레이 시에 지뢰를 표시하는 도구로 사용할 수 있습니다. (표시할 수 있는 깃발의 개수의 제한은 없습니다.) ⁻깃발이 있는 경우, 해당 깃발을 지울 수 있습니다. (3) 플레이어가 마우스 좌 클릭을 수행했을 때 기대할 수 있는 결과는 다음과 같습니다. A. 깃발로 표시된 칸인 경우, 아무 일도 일어나지 않습니다. B. 이미 밝혀진 칸인 경우, 아무 일도 일어나지 않습니다. C. 아직 밝혀지지 않은 칸인 경우 ⁻해당 위치가 지뢰라면 게임은 종료되고 플레이어는 패배합니다. ⁻해당 위치가 빈 칸이라면 인접한 8칸의 지뢰의 수를 표시합니다. 만약, 인접한 8칸의 지뢰의 수가 0인 경우, 해당 과정을 각 8 칸에서 다시 반복합니다. (4) 플레이어가 지뢰를 제외한 모든 빈 칸을 밝혔다면, 플레이어는 승리합니다. 3 (구현 목표) (1) 총 4개의 클래스를 통해서 지뢰 찾기를 구현합니다. 클래스를 구현할 때에는 아래에서 제시한 변수 및 메서드들을 반드시 사용하여 프로그램을 구현해야 합니다. 아래 명시된 변수 이름, 메서드 이름 및 메서드의 매개변수 및 리턴 값은 변경 불가능 합니다. 이외에 필요한 변수 및 메서드는 추가로 정의해서 사용할 수 있으며, 추가한 내용에 대해서는 소스코드와 보고서에 설명을 포함하여 작성해야 합니다. A. Panel 지뢰 찾기 게임의 각 칸에 해당하는 class입니다. 아래에 주어진 모든 변수, 함수를 구현해야 합니다. ① [변수] isRevealed : 해당 panel이 밝혀진 상태인지를 나타내는 bool type 변수로, instance를 생성 시 반드시 False로 초기화 합니다. ② [변수] hasFlag : 해당 panel이 flag를 보유하고 있는지를 나타내는 bool type 변수로, instance를 생성 시 반드시 False로 초기화 합니다. ③ [함수] toggleFlag(self) : 해당 panel의 hasFlag를 toggle합니다. 즉, 현재 hasFlag가 True라면 실행 후 False가 되고, False라면 실행 후 True가 됩니다. ④ [함수] unveil(self) : 해당 panel을 밝혀진 상태로 변경됩니다. * Hint: isRevealed의 값이 True가 되어야 합니다. B. EmptyPanel 지뢰가 존재하지 않는 칸을 의미하는 class로 Panel을 상속해야 합니다. 아래에 주어진 모든 함수를 구현해야 합니다. ① [변수] numOfNearMines: 해당 panel과 인접한 mine의 수를 저장하는 num type 변수로, instance를 생성 시 반드시 0으로 초기화 합니다. 4 ② [함수] addNumOfNearMines(self): 해당 panel의 numOfNearMines의 값을 1 증가 시킵니다. ③ [함수] unveil(self): 부모인 Panel의 unveil을 수행하고, 이때 인접한 mine의 수를 return합니다. C. MinePanel 지뢰가 존재하는 칸을 의미하는 class로 Panel을 상속해야 합니다. 아래에 주어진 모든 함수를 구현해야 합니다. ① [함수] unveil(self): 부모인 Panel의 unveil을 수행하고, -1을 return합니다. D. Board 지뢰 찾기 게임에 사용되는 모든 기능을 포함하는 class입니다. 여기서는 앞서 만든 Panel class들을 활용하여 아래에 주어진 모든 함수를 구현해야 합니다. ① [변수] panels : 2차원 리스트로 Panel instance를 저장합니다. 이는 reset 함수가 호출될 때마다 초기화됩니다. (따라서, instance 생성 시에 반드시 특정 값으로 초기화할 필요는 없습니다.) ② [함수] reset(self, numMine, height, width): Board를 초기화합니다. 이 과정에서 panels에 height크기만큼의 행과 width만큼의 열을 가지는 2차원 리스트를 생성합니다. 또한, numMine으로 주어진 숫자만큼 mine을 random한 위치에 분포시킵니다. Mine이 위치한 곳에는 MinePanel이 들어가고, Mine이 없는 위치에는 EmptyPanel이 들어가도록 합니다. 마지막으로, 각 EmptyPanel에는 인접한 Panel에 위치한 Mine의 수만큼 numOfNearMines가 들어가도록 합니다. 이때, EmptyPanel 의 변수인 numOfNearMines 변수에 직접 접근하여 값을 변경해서는 안되고, addNumOfNearMines 함수만을 이용하여 구현하도록 합니다. (해당 지뢰 찾기 게임에서는 Board의 사이즈와 지뢰의 개수가 난이도에 따라서 유동적으로 변화할 수 있습니다. 이 함수는 그 상황마다 Board를 Random하게 초기할 때 사용할 수 있습니다.) ③ [함수] getNumOfRevealedPanels(self): 현재 board에 밝혀져 있는 Panel의 개수를 return합니다. ④ [함수] unveil(self, y, x): panels의 y행 x열에 위치한 Panel을 밝힙니다. 만약, 밝혀낸 Panel이 지뢰라면, -1을 return합니다. 그렇지 않다면, 아무것도 return하지 않습니다. 또한, 만약 밝혀낸 Panel의 numOfNearMines의 값이 0이라면, 인접한 8칸 중에 지뢰가 없는 칸에 대해서 이 과정을 반복합니다. 만약 깃발이 존재하는 칸에도 반복되었고, 해당 칸이 지뢰가 아닌 경우 해당 칸의 깃발을 제거하고, 밝혀 냅니다. 그렇지 않고 지뢰가 있는 경우 깃발을 유지합니다. * Hint: 아래 그림에서 알 수 있듯이 한 번의 y행 x열의 Panel을 밝히는 행위가 얼마나 많은 Panel을 밝히게 될지는 알 수 없습니다. 따라서, 별도의 자료 5 구조(stack 등)을 이용하여 차례대로 밝혀내거나 재귀 함수를 활용하여 이 문제를 해결할 수 있습니다. (해당 함수는 Board의 특정 구역(y행 x열)을 선택하였을 때의 결과를 panels에 반영하는 기능을 합니다. 따라서, GUI에서는 해당 구역의 선택 시 이 함수를 호출하고, panels의 최종 결과를 그대로 화면에 보여주기만 하면 됩니다.) ⑤ [함수] toggleFlag(self, y, x): panels의 y행 x열에 위치한 Panel의 flag를 toggle합니다. 즉, 현재 flag가 존재한다면 실행 후 없어지고, 없다면 실행 후 존재하게 됩니다. ⑥ [함수] checkReveal(self, y, x): panels의 y행 x열에 위치한 Panel이 밝혀져 있는지 확인합니다. 밝혀져 있다면 True를 return하고, 그렇지 않다면 False를 return합니다. ⑦ [함수] checkFlag(self, y, x): panels의 y행 x열에 위치한 Panel에 flag가 있는지 확인합니다. flag가 있다면, True를 return하고, 그렇지 않다면 False를 return합니다. ⑧ [함수] checkMine(self, y, x): panels의 y행 x열에 위치한 Panel에 mine이 있는지 확인합니다. mine이 있다면, True를 return하고, 그렇지 않다면 False를 return합니다. ⑨ [함수] getNumOfNearMines(self, y, x): panels의 y행 x열에 위치한 Panel에 인접한 mine의 수를 return합니다. 이는 해당 Panel이 EmptyPanel임을 가정으로 합니다. E. App GUI 구현 코드를 담당합니다. 전체 GUI를 감싸는 Frame를 상속하고, 각 widget에 Board에 존재하는 함수를 적절하게 사용하여 구현합니다. 쉽게 구현하기 위해서는 board가 변경될 때마다 전체 판을 다시 그리는 것도 좋은 방법이 될 수 있습니다. 별도로 제시하는 method는 없고, 자율적으로 해당 class를 적절히 채워 아래 (2)에서 제시하는 GUI 요구 사항을 만족시켜야 합니다. (추가한 변수 및 메서드에 대한 설명을 6 반드시 주석 및 보고서에 추가해야 합니다.) (2) 해당 시스템에서 요구하는 GUI는 다음과 같습니다. A. 전체는 Header 부분과 Body 부분으로 나뉩니다. B. Header 부분에는 초기화 버튼이 존재하며, 가로 방향에서 중앙에 위치합니다. ① 좌 클릭 시에 Body 부분의 모든 내용이 초기화 합니다. ② 평상 시에는 웃는 모양이 표기되고, 패배 시에는 해골, 성공 시에는 선글라스를 낀 캐릭터가 노출됩니다. C. Body 부분에는 버튼으로 이루어진 지뢰 찾기 보드가 주어집니다. (처음 크기는 10×10으로 고정합니다.) ① 각 버튼은 클릭이 가능해야 하고, 이미 드러난 부분은 시각적으로 명확하게 구분이 가야 합니다. ② 밝혀진 빈 칸 중에서 인근 지뢰의 수가 0인 칸은 0을 표기하지 않고, 비워 둡니다. ③ 좌 클릭 시에 해당 위치에 해당하는 값이 밝혀집니다(숫자, 빈칸, 폭탄 중 하나). 이미 밝혀졌거나 깃발이 존재하는 경우 아무 일도 일어나지 않습니다. ④ 우 클릭 시에 해당 위치에 깃발을 꽂거나 제거할 수 있습니다. 이미 있다면 제거하고, 없다면 꽂을 수 있다. 이미 밝혀진 칸의 경우 아무 일도 일어나지 않습니다. ⑤ 패배한 경우 존재하는 모든 칸을 밝힙니다. 아래의 두 번째 그림과 같이 모든 칸이 밝혀져야 합니다. ⑥ 구현에 필요한 이미지 파일(웃는 사람, 해골, 선글라스, 폭탄, 깃발)은 imgs 폴더 안에 모두 존재하니 이를 사용하시기 바랍니다. ⑦ 이외의 디테일한 디자인은 평가 항목에 들어가지 않습니다. Ex) 왼쪽부터 플레이 중, 패배 시, 성공 시의 결과 7 D. 상단 난이도 메뉴를 통해서 Easy, Normal, Hard로 바꿀 수 있도록 구현합니다. 난이도마다 지뢰의 개수와 보드의 크기가 변하도록 합니다. ① Easy : 10개의 지뢰, 10×10 board ② Normal : 30개의 지뢰, 15×15 board ③ Hard : 50개의 지뢰, 20×20 board Ex) 상단에 난이도라는 메뉴가 존재하고, 왼쪽부터 해당 난이도에 따른 보드의 크기 변화를 보입니다. (Easy, Normal, Hard 순)(주의 사항) (1) 다시 한 번 강조하지만, 디자인은 점수에 반영되지 않습니다. 과도한 시간을 투자하지 마시기 바랍니다. (2) 해당 과제에서는 두 개의 파일(model.py, app.py)이 존재하며, 두 개 모두 제출을 해야 합니다. 그 중 app.py에서는 GUI가 동작하지 않더라도, model.py의 Board, Panel, EmptyPanel, MinePanel의 구현만으로도 점수를 부여합니다. [참고] (1) Demo 동영상 https://drive.google.com/file/d/1cqOAmF7E-QWR1bSH3zkReoaXHUbBKH5R/view?usp=sharing (2) GUI 참고 코드 구현에 도움이 될 수 있는 GUI code입니다. 하지만, 정답이 아니니 편한대로 구현하시면 됩니다. https://github.com/euidong/minesweeper/blob/v0.0.1/gui_test.py

$25.00 View

[SOLVED] Csed101. programming & problem solving programming assignment 3

 파이썬 버전: Python 3.x  제출물  .py 소스 코드 (assn3.py)  프로그램의 소스 코드에 채점자의 이해를 돕기 위한 주석을 반드시 붙여주세요.  보고서 파일 (.docx, .hwp 또는 .pdf; assn3.docx, assn3.hwp 또는 assn3.pdf)  보고서는 AssnReadMe.pdf를 참조하여 작성하시면 됩니다.  명예 서약 (Honor code): 표지에 다음의 서약을 기입하여 제출해 주세요: “나는 이 프로그래밍 과제를 다른 사람의 부적절한 도움 없이 완수하였습니다.” 보고서 표지 에 명예 서약이 기입되어 있지 않은 과제는 제출되지 않은 것으로 처리됩니다.  작성한 소스 코드와 보고서 파일은 PLMS를 통해 제출해 주세요.  주의 사항  구문 오류(Syntax Error)가 발생하거나 실행이 되지 않는 과제는 0점으로 채점됩니다.  제출 기한보다 하루 늦게 제출된 과제는 최종 20%, 이틀 늦게 제출된 과제는 최종 40% 감점됩니다. 제출 기한보다 사흘 이상 늦으면 제출 받지 않습니다 (0점 처리). 늦은 제출시 PLMS에 기록된 최종 수정일시를 기준으로 감점합니다.  각 문제의 제한 조건과 요구 사항을 반드시 지켜 주시기 바랍니다.  모든 문제의 출력 형식은 채점을 위해 아래에 제시된 예시들과 최대한 비슷하게 작성해 주세요.  이번 과제에서는 추가 기능 구현에 대한 추가 점수는 없습니다.  부정행위에 관한 규정은 POSTECH 전자컴퓨터공학부 학부위원회의 “POSTECH 전자컴퓨터 공학부 부정행위 정의”를 따릅니다 (PLMS의 본 과목 공지사항에 등록된 글 중, 제목이 [document about cheating]인 글에 첨부되어 있는 disciplinary.pdf를 참조하세요). 2  Problem: 포스몬 배틀(Posmon Battle) [문제] 포스몬 배틀은 유명한 수집형 RPG게임, 포켓몬스터의 배틀 요소를 간단히 한 게임입니다. 클래스 와 OOP를 활용해 배틀을 구현해봅니다. [목적] 이번 과제에서는 객체지향 프로그래밍(Object Oriented Programming)의 핵심 요소를 익힙니다.  클래스 정의 및 인스턴스 생성을 익힙니다.  클래스 상속 및 메서드 오버라이딩을 익힙니다. [주의사항] (1) 문서에 반드시 구현해야 하는 함수와 클래스가 존재합니다. 잘 확인하고 설명된 요구사항에 맞게 작성해 주세요. (2) 구현 시, 표준 라이브러리만 사용하여 구현해주세요. (추가 설치한 모듈 이용 불가능) (3) 명시된 예외 처리 외에는 고려하지 않아도 됩니다. [설명] 0. 규칙 설명 (1) 포스몬 배틀은 최대 3마리의 포스몬(Posmon)을 사용하여 상대의 포스몬을 전부 쓰러뜨리 면 이기는 게임입니다. 본 과제에서는 두 명의 플레이어(컴퓨터, 사용자)의 대결로 구현 합니다. (2) 배틀은 1:1배틀을 기본 규칙으로 합니다. 각 플레이어는 배틀 시, 소유한 포스몬 중 한 마리를 선택하여 배틀에 내보내어 대결을 하게 합니다. (3) 플레이어는 포스몬 보유기술과 포스몬 교대를 적절히 활용하여 상대의 포스몬을 모두 쓰 러뜨려야 합니다. (4) 각 포스몬은 타입(posmon_type), 체력(health), 공격력(attack), 방어력(defence) 수치 를 가지며, 체력이 0이 되면 쓰러집니다. (5) 포스몬의 타입에는 가위(“Scissors”), 바위(“Rock”), 보(“Paper”), 없음(“Nothing”)이 존재합니다. 상대보다 강한 속성일 경우 주는 피해는 2배가 됩니다. (6) 각 포스몬은 최대 3개의 기술(Move)을 가질 수 있으며, 기술은 상대의 체력을 깎는 공격 기술(PhysicalMove)과 자신 또는 상대의 공격력, 방어력을 변화시키는 변화 기술 (StatusMove)로 구성됩니다. (7) 기술에는 속도(speed)가 존재하며, 속도가 빠른 기술이 먼저 사용됩니다. 즉, 배틀 시 속도가 빠른 기술을 선택한 포스몬이 먼저 기술을 사용합니다. 동점일 경우 사용자의 기 술이 먼저 사용됩니다. (8) 공격 기술에는 추가로 위력(power)이 존재해서, 그 위력만큼 상대에게 피해를 줍니다. 아래 피해 계산식을 참고하세요. 3 포스몬의 체력 피해 계산식은 다음과 같습니다. 상대의 체력 피해 = max(0, 기술의 위력 + 자신의 공격력-상대 방어력) * 상성 배율 상성 배율은 다음과 같이 계산됩니다. 공격자 : 방어자 가위 바위 보 없음 가위 1 1 2 1 바위 2 1 1 1 보 1 2 1 1 없음 1 1 1 1 즉, 가위 바위 보에서 이기는 경우에만 2배의 피해를 입히고, 그 외에는 항상 같은 피해를 줍니다. 1. 게임 준비 포스몬 배틀을 하려면 조건에 맞게 포스몬을 준비해야 합니다. 각 클래스를 구현할 때엔 ‘5.필수 구현 항목’을 참고하고, 아래의 조건에 맞도록 포스몬을 준비합니다. (1) 포스몬의 종류 – 포스몬의 종류는 구현의 편의상 4 종으로 합니다. – 각 포스몬의 타입과 기본 능력치(체력, 공격력, 방어력), 보유 기술은 다음과 같습니다. 포스몬(클래스 이름) 타입 체력 공격력 방어력 보유 기술 Ponix Paper 86 20 23 Tackle, Growl, SwordDance Normie Nothing 80 20 20 Tackle, Swift, TailWhip Rocky Rock 80 15 25 Tackle, Growl Swania Scissors 80 30 10 ScissorsCross, SwordDance – 각 포스몬은 “Rock”, “Paper”, “Scissors”, “Nothing” 중 하나의 타입을 가집니다. – 포스몬마다 사용할 수 있는 기술이 2~3 가지씩 있습니다. (2) 포스몬의 기술 – 포스몬의 기술은 공격 기술과 변화 기술로 나눌 수 있습니다. 구현의 편의상 6 종으로 합니다. – 모든 기술의 속도는 -3 이상 3 이하입니다. (숫자가 클수록 빠르며, 동률이면 사용자가 우선합니다.) A. 공격 기술: 상대의 체력을 감소시킵니다. 기술명(클래스 이름) 위력 속도 몸통박치기(Tackle) 25 0 시저크로스(ScissorsCross) 30 0 스피드스타(Swift) 0 3 B. 변화 기술: 자신/상대의 공격력/방어력을 변화시킵니다. 기술명(클래스 이름) use 효과 속도 울음소리(Growl) 상대 공격력 5 감소 1 칼춤(SwordDance) 자신 공격력 10 증가 0 꼬리 흔들기(TailWhip) 상대 방어력 5 감소 1 4 2. 프로그램 시작 화면 프로그램을 실행하면,다음과 같은 타이틀 화면과 함께 3개의 선택사항이 있는 메뉴를 출력하고, 사용자로부터 3가지 선택사항 중 하나를 입력 받도록 합니다. 예시의 빨간색 밑줄은 사용자 입력에 해당합니다. ____ ___ _____ ___ ___ ___ ____ | / / ___/| T T / | | o )Y Y( _ | _ _ |Y Y| _ Y | _/ | O | __ T| _/ || O || | | | | | | / || | || || | | | | l ! || | |l !| | | l__j ___/ ___jl___j___j ___/ l__j__j ============================================ 0. 포스몬 선택 1. 배틀하기 2. 종료하기 ============================================ 입력: 4 잘못된 입력입니다. 다시 입력하세요. 입력: 예외처리) 0, 1, 2 외의 입력에 대해서는 “잘못된 입력입니다. 다시 입력하세요.” 메시지 출력 후 위의 예시처럼 다시 입력 받습니다. 3. 포스몬 선택(초기 메뉴에서 0을 선택시) 사용자가 0을 선택하면 아래와 같이 배틀에서 사용할 사용자의 포스몬을 선택할 수 있는 화면으 로 이동합니다. 먼저 선택 가능한 포스몬 목록이 출력되고, 사용자의 선택을 기다립니다. 0. 포스몬 선택 1. 배틀하기 2. 종료하기 ============================================ 입력: 0 ============================================ 당신이 사용할 포스몬을 선택하세요. 현재 0 마리/최대 3 마리 0. Ponix 1. Normie 2. Swania 3. Rocky ============================================ 입력: 사용자는 포스몬을 최소 1 마리, 최대 3 마리 선택할 수 있으며, 동일한 종류의 포스몬 선택도 가능합니다. (동일한 종류의 포스몬 선택 시, 같은 객체가 되지 않도록 주의합니다. 생성자를 사 용할 필요가 있습니다.) 1 마리를 고르고 나면 “-1. 그만두기” 항목이 나타나 포스몬 선택을 끝낼 수 있습니다. 아래 예 시는 포스몬 2마리 선택 후 -1을 입력하여 포스몬 선택을 끝낸 예시이며, 선택이 끝난 경우 선택 한 포스몬의 목록을 출력하고 초기 메뉴 화면으로 돌아갑니다. 포스몬 3마리를 모두 선택한 경우, 선택한 포스몬 목록 출력 후 초기 메뉴 화면으로 돌아갑니다. 예외처리) – 0~4 외의 입력은 에러 메시지 출력 후 다시 입력 받습니다. – 아무 포스몬도 고르지 않은 경우, -1은 잘못된 입력입니다. 5 0. 포스몬 선택 1. 배틀하기 2. 종료하기 ============================================ 입력: 0 ============================================ 당신이 사용할 포스몬을 선택하세요. 현재 0 마리/최대 3 마리 0. Ponix 1. Normie 2. Swania 3. Rocky ============================================ 입력: 0 ============================================ 당신이 사용할 포스몬을 선택하세요. 현재 1 마리/최대 3 마리 0. Ponix 1. Normie 2. Swania 3. Rocky -1. 그만두기 ============================================ 입력: 3 ============================================ 당신이 사용할 포스몬을 선택하세요. 현재 2 마리/최대 3 마리 0. Ponix 1. Normie 2. Swania 3. Rocky -1. 그만두기 ============================================ 입력: 5 잘못된 입력입니다. 다시 입력하세요. 입력: -1 ============================================ 당신의 포스몬 목록: Ponix Rocky ============================================ ____ ___ _____ ___ ___ ___ ____ | / / ___/| T T / | | o )Y Y( _ | _ _ |Y Y| _ Y | _/ | O | __ T| _/ || O || | | | | | | / || | || || | | | | l ! || | |l !| | | l__j ___/ ___jl___j___j ___/ l__j__j ============================================ 0. 포스몬 선택 1. 배틀하기 2. 종료하기 ============================================ 입력:6 4. 포스몬 배틀 (초기 메뉴에서 1을 선택시) 포스몬 배틀을 하려면 먼저 포스몬을 가지고 있어야 합니다. 사용자가 보유한 포스몬이 없는 경우, 아래 예시와 같이 에러 메시지 출력 후, 초기 메뉴 화면으 로 돌아갑니다. ____ ___ _____ ___ ___ ___ ____ | / / ___/| T T / | | o )Y Y( _ | _ _ |Y Y| _ Y | _/ | O | __ T| _/ || O || | | | | | | / || | || || | | | | l ! || | |l !| | | l__j ___/ ___jl___j___j ___/ l__j__j ============================================ 0. 포스몬 선택 1. 배틀하기 2. 종료하기 ============================================ 입력: 1 싸울 포스몬이 없습니다! 먼저 포스몬을 선택해 주세요. ____ ___ _____ ___ ___ ___ ____ | / / ___/| T T / | | o )Y Y( _ | _ _ |Y Y| _ Y | _/ | O | __ T| _/ || O || | | | | | | / || | || || | | | | l ! || | |l !| | | l__j ___/ ___jl___j___j ___/ l__j__j ============================================ 0. 포스몬 선택 1. 배틀하기 2. 종료하기 ============================================ 입력: 사용자가 보유한 포스몬이 있는 경우라면, 아래와 같이 먼저 사용자의 포스몬 목록과 컴퓨터 포 스몬 목록이 출력된 후, 배틀이 시작됩니다. 컴퓨터의 포스몬은 배틀 직전에 중복없이 랜덤하게 3마리가 선택되도록 합니다. ============================================ 0. 포스몬 선택 1. 배틀하기 2. 종료하기 ============================================ 입력: 1 ============================================ 당신의 포스몬 목록: Ponix Rocky 컴퓨터 포스몬 목록: Normie Swania Ponix ============================================ 배틀이 시작됩니다. # 배틀하기 시작시에 1 회만 출력 ############################################ 컴퓨터 포스몬: [OOO] 3 / 3 # 컴퓨터가 보유한 포스몬들의 상태 정보 Normie

$25.00 View

[SOLVED] Csed101. programming & problem solving programming assignment 2

Python 3.x  제출물  .py 소스 코드 (assn2.py)  프로그램의 소스 코드를 이해하기 쉽도록 반드시 주석을 붙여 주세요.  보고서 파일 (.docx, .hwp 또는 .pdf; assn2.docx, assn2.hwp 또는 assn2.pdf)  AssnReadMe.pdf 를 참조하여 작성하시면 됩니다.  프로그램 실행화면을 캡처하여 보고서에 포함시키고, 간단히 설명해 주세요.  명예서약(Honor code): 표지에 다음의 내용을 포함하여 제출해 주세요. “나는 이 프 로그래밍 과제를 다른 사람의 부적절한 도움 없이 완수하였습니다.” 보고서 표지에 명예서약이 없는 경우는 과제를 제출하지 않은 것으로 처리됩니다.  소스코드와 보고서 파일을 PLMS를 통하여 제출해 주세요.  PLMS에 제출할 때는 소스파일과 보고서를 압축하지 말고 각각 업로드 해주시면 됩니 다.  주의사항  구문 오류(Syntax Error)가 발생하거나 실행이 되지 않는 과제는 0점으로 채점됩니다.  제출 기한보다 하루 늦게 제출된 과제는 최종 20%, 이틀 늦게 제출된 과제는 최종 40% 감점됩니다. 제출 기한보다 사흘 이상 늦으면 제출 받지 않습니다 (0점 처리). 늦은 제출시 PLMS에 기록된 최종 수정일시를 기준으로 감점합니다.  각 문제의 제한 조건과 요구 사항을 반드시 지켜 주시기 바랍니다.  모든 문제의 출력 형식은 채점을 위해 아래에 제시된 예시들과 최대한 비슷하게 작성해 주세요.  각 문제에 명시된 에러 처리 외에는 고려하지 않아도 됩니다.  이번 과제에서는 추가 기능 구현에 대한 추가 점수는 없습니다.  부정행위에 관한 규정은 POSTECH 전자컴퓨터공학부 학부위원회의 ‘POSTECH 전자컴퓨터 공학부 부정행위 정의’를 따릅니다. (LMS의 과목 공지사항의 제목 [document about cheating]의 첨부파일인 disciplinary.pdf를 참조할 것.) 2  Problem: 요트 다이스 (Yacht dice) (문제) 요트 다이스는 주사위 놀이 게임으로 5개의 주사위를 사용하며 목표는 미리 정해진 주사위 조합으로 최고 점수를 얻는 것입니다. 본 과제의 요트 다이스는 두 명의 플레이어(사용자, 컴퓨터)가 게임을 하게 됩니다. 두 명의 플레이어가 번갈아 가면서 자신의 순서에, 게임 규칙에 따라 주사위를 던져 자신의 점수판에서 항목을 선택하여 점수를 기록 하게 됩니다. 모든 플레이어가 점수판을 모두 채우면 게임이 종료되며, 점수판에 기록한 점수의 총합이 높은 플레이어가 승리합니다. [게임 규칙] 1. 각 플레이어는 자신의 순서에 5개의 주사위를 던집니다. 2. 자신의 순서에 총 3회까지 던질 수 있으며, 원하는 눈이 나온 주사위는 두고 나머지만 다시 던질 수 있습니다. 3. 3회 굴린 주사위 조합으로 자신의 점수판에 항목을 선택하여 점수를 기록합니다. – 이미 선택한 항목에는 다시 기록할 수 없습니다. – 조합과 맞는 항목이 없어도 12개의 항목 중 1개를 선택해야 합니다. 이때 점수는 0점으로 기록됩니다. 4. 총 12라운드(점수판은 12칸)를 하면 게임이 끝나게 되며, 점수판의 총합으로 승패를 정합니다. 기본적으로 이번 과제에서 사용되는 점수판의 항목과 주사위 점수 기준은 다음과 같습니다. [주사위 점수 기준] 항목 점수 계산 방법 예시 1 Aces : 1 이 나온 주사위 눈의 총합 (최대 5 점) [1, 1, 1, 1, 4] = 4 점 2 Deuces: 2 가 나온 주사위 눈의 총합 (최대 10 점) [2, 2, 2, 3, 6] = 6 점 3 Threes: 3 이 나온 주사위 눈의 총합 (최대 15 점) [1, 3, 3, 3, 5] = 9 점 4 Fours : 4 가 나온 주사위 눈의 총합 (최대 20 점) [1, 1, 1, 4, 4] = 8 점 5 Fives : 5 가 나온 주사위 눈의 총합 (최대 25 점) [2, 3, 4, 5, 6] = 5 점 6 Sixes : 6 이 나온 주사위 눈의 총합 (최대 30 점) [2, 3, 6, 6, 6] = 18 점 보너스: 위 항목의 점수 합계가 63 점 이상일 때 보너스 점수 35 점 획득 C Choice : 모든 주사위 눈의 합 (최대 30 점) [1, 1, 2, 5, 5] = 14 점 4K 4 of a Kind : 동일한 주사위 눈이 4 개 이상 일 때, 모든 주사위 눈의 합 (최대 30 점) [5, 5, 5, 5, 6] = 26 점 [1, 1, 2, 2, 2] = 0 점 FH Full House : 동일한 주사위가 각각 3 개, 2 개가 있을 때 모든 주사위 눈의 합 (최대 30 점) [5, 5, 6, 6, 6] = 28 점 [6, 6, 6, 6, 6] = 30 점 [1, 2, 3, 3, 3] = 0 점 SS Small Straight: 연속된 주사위 눈이 4 개이상일 때 (15 점) [1, 3, 4, 5, 6] = 15 점 [2, 3, 3, 5, 6] = 0 점 LS Large Straight: 연속된 주사위 눈이 5 개일 때 (30 점) [1, 2, 3, 4, 5] = 30 점 [1, 1, 2, 2, 2] = 0 점 Y Yacht : 동일한 주사위 눈이 5 개일 때 (50 점) [1, 1, 1, 1, 1] = 50 점 [1, 1, 1, 1, 4] = 0 점 3 [점수판] [목적] 이번 과제를 통하여 1. 2차원 리스트 사용법을 익힙니다. 2. 텍스트를 읽고 활용하는 능력을 기릅니다. 3. 조건문, 반복문, 사용자 정의 함수 및 랜덤 함수 사용법을 익힙니다. [주의사항] (1) 이번 과제는 2차원 리스트 사용을 위한 과제입니다. 두 플레이어의 점수를 반드시 2차원 리스트로 생성하여 활용해야 합니다. (2) 문서에 반드시 정의해서 사용해야 할 사용자 정의 함수가 설명되어 있으니 확인 후 구현하시면 됩니다. – 정의해서 사용해야 할 사용자 정의 함수의 매개변수는 자유롭게 변형하여 사용할 수 있습니다. (3) 본 과제에서는 앞선 과제에서의 clear_screen() 함수의 사용을 의무화하지는 않았습니다. 하지만, 중간중간 적절히 사용해 주세요. (4) int, float, bool, str, list, tuple, dictionary, set 자료형까지 수업시간에 다룬 내용에 한해서 사용 가능합니다. (5) 문제의 출력 형식은 채점을 위해 아래의 실행 예시와 최대한 비슷하게 작성해야 합니다. 4 [설명 및 요구사항] 0. 프로그램 초기화면 프로그램을 실행하면 아래와 같이 사용자가 선택할 수 있는 메뉴가 출력되고, 사용자로부터 3가지 선택사항 중 하나를 입력 받을 준비를 합니다. [Yacht Dice] ———————————- 1. New Game 2. Load Game 3. Exit ———————————- Select a menu: 그림 1. 초기 메뉴 화면 1을 선택하면 새 게임으로, 2를 선택하면 저장된 파일로부터 게임판을 생성하여 게임을 진행하며, 3을 선택하면 그림 2와 같이 간단한 메시지 출력 후, 프로그램을 종료합니다. 예외 처리) 1, 2, 3외의 입력에 대해서는 Wrong Input! 메시지 출력 후 아래와 같이 다시 입력 받습니다. (실행 예시의 빨간색 밑줄은 사용자 입력에 해당) [Yacht Dice] ———————————- 1. New Game 2. Load Game 3. Exit ———————————- Select a menu: 4 Wrong Input! Select a menu: 3 Program ended. Bye! 그림 2. 초기 메뉴에서 범위를 벗어난 입력과 종료 예시 1. New Game(1을 선택 시) 사용자가 1을 선택하면, 사용자(Player)와 컴퓨터(Computer)가 대결하는 새 게임이 시작됩니다. 게임이 시작되면, 아래와 같이 각 플레이어의 점수판을 출력 후, Player부터 주사위를 던져 게임을 시작합니다. (새로운 게임 시작 시, 항상 Player부터 시작하도록 구현합니다.) Select a menu: 1 Starting a game… ┌──────────┬──────────┐ │ Player │ Computer │ ├──────────┴──────────┤ │ 1: │ 1: │ │ 2: │ 2: │ │ 3: │ 3: │ │ 4: │ 4: │ │ 5: │ 5: │ │ 6: │ 6: │ ├─────────────────────┤ │ Sub total: 0/63 │ Sub total: 0/63 │ │ +35 bonus: │ +35 bonus: │ 5 ├─────────────────────┤ │ C: │ C: │ ├─────────────────────┤ │ 4K: │ 4K: │ │ FH: │ FH: │ │ SS: │ SS: │ │ LS: │ LS: │ │ Yacht: │ Yacht: │ ├─────────────────────┤ │ Total: 0 │ Total: 0 │ └─────────────────────┘ [Player’s Turn (1/12)] Roll: [2, 3, 5, 3, 3] Which dice to reroll (1~5)? 그림 3. 초기 메뉴에서 1. New Game 선택 화면 A. Player 순서 (주사위 던지기) 각 플레이어는 5개의 주사위로, 자신의 순서에 최대 3회까지 주사위를 던질 수 있습니다. 원하는 주사위 조합을 맞추기 위해, 주사위를 던지는 각 회마다 다시 던질 주사위를 선택하여 최대 2회 까지 다시 던질 수 있습니다. (각 주사위는 random 모듈의 함수를 사용하여 랜덤하게 선택되도록 합니다.) 그림 3에서 Player는 자신의 순서에 5개의 주사위를 던져 그 결과를 출력한 후, 다시 던질 주사 위 선택을 위하여 입력을 기다리고 있습니다. 이때 Player는 다시 던질 주사위의 위치를 그림 4 의 예시처럼 스페이스를 이용하여 구분하여 입력하도록 합니다. [Player’s Turn (1/12)] Roll: [2, 3, 5, 3, 3] Which dice to reroll (1~5)? 1 o 4 # o 입력으로 인한 에러 메세지 출력 Wrong input! Which dice to reroll (1~5)? 1 3 Roll: [3, 3, 2, 3, 3] Which dice to reroll (1~5)? 3 6 # 6 위치 무시 후 3 번 주사위만 reroll Roll: [3, 3, 4, 3, 3] Sorted Roll: [3, 3, 3, 3, 4] Choose a category: 그림 4. Player의 주사위 던지기 그림 4에서 Player는 [2, 3, 5, 3, 3]의 주사위에서 첫 번째와 세 번째 주사위를 선택하여 다시 던졌고, 그 결과로 첫 번째 주사위는 3, 세 번째 주사위는 2로 바뀐 것을 확인할 수 있습니다. 이때 다시 한번 세 번째 주사위를 선택하여 다시 던졌고, 세 번째 주사위가 4로 바뀌었습니다. 예외 처리) – 입력에 숫자 혹은 스페이스가 아닌 다른 입력 값이 들어오면 “Wrong input!” 문구 출 력과 함께 다시 주사위 위치를 입력 받습니다. (Hint: try, except 활용) – 다시 던질 주사위 위치에 대한 범위(1~5)를 벗어난 입력에 대해서는 해당 주사위 위치를 무시합니다. 6 – 다시 던질 주사위가 없다면 엔터를 입력하도록 합니다. – 중복 주사위가 입력 (ex) 3 3 1)으로 들어올 경우 정상적으로 처리될 수 있도록 합니다. (ex) 3 1로 처리) (점수판 선택) 3회의 주사위 던지기가 끝나면, Player는 자신의 점수판에서 원하는 항목을 선택하여 점수를 기 록해야 합니다. 이를 위해 최종 주사위 결과를 정렬하여 출력 후, 점수판에서 채워지지 않은 항 목 중 하나를 선택하여 입력 받습니다. Player가 입력할 수 있는 점수판의 항목 이름은 “1, 2, 3, 4, 5, 6, C, 4K, FH, SS, LS, Y” 중 하나입니다. (2쪽 ‘[주사위 점수 기준]’의 항목을 참고) 아래 예시에서 Player는 최종 주사위 결과 [3, 3, 3, 3, 4]을 가지고 점수판의 항목 3을 선택하 여 점수판 3의 항목에 12점의 점수가 기록되었습니다. [Sorted Roll] [3, 3, 3, 3, 4] Choose a category: 3 ┌──────────┬──────────┐ │ Player │ Computer │ ├──────────┴──────────┤ │ 1: │ 1: │ │ 2: │ 2: │ │ 3: 12 │ 3: │ │ 4: │ 4: │ │ 5: │ 5: │ │ 6: │ 6: │ ├─────────────────────┤ │ Sub total: 12/63 │ Sub total: 0/63 │ │ +35 bonus: │ +35 bonus: │ ├─────────────────────┤ │ C: │ C: │ ├─────────────────────┤ │ 4K: │ 4K: │ │ FH: │ FH: │ │ SS: │ SS: │ │ LS: │ LS: │ │ Yacht: │ Yacht: │ ├─────────────────────┤ │ Total: 12 │ Total: 0 │ └─────────────────────┘ [Computer’s Turn (1/12)] Roll: [3, 6, 3, 1, 3] 그림 5. Player의 점수판 선택 예외처리) – 이미 채워진 항목 또는 없는 항목을 입력한 경우, Wrong Input! 메시지 출력 후 다시 입 력 받습니다. – 항목 선택 시, 소문자로 입력을 해도 동일한 항목이 선택되도록 합니다. +35 bonus는 1 (Aces) ~ 6 (Sixes)까지의 점수 합이 63이상인 경우 자동적으로 채워지도록 만듭 니다. 1 ~ 6까지의 항목이 모두 채워진 경우 63을 넘지 않으면 0을 채우도록 합니다. 예시) │ +35 bonus: +35 │ 7 B. Computer 순서 Player의 점수판 기록이 끝나면, 컴퓨터의 순서가 됩니다. 이때 컴퓨터는 일정한 룰에 따라 행동 하도록 만듭니다. 만들 수 있는 룰은 다양하지만, 본 과제에서는 최대한 간단하게 다음 룰만 적 용하도록 합니다. 1. 점수판에서 채워지지 않은 칸의 5개의 주사위로 만들 수 있는 점수를 모두 계산합니다. C칸은 총 점수가 20점 이상인 경우만 고려합니다. 2. 그 중, 가장 높은 점수를 만들 수 있는 칸과 다시 던질 주사위를 선택합니다. (가장 높은 점수가 2개 이상이면 가장 높은 점수 칸 중 어떤 칸을 선택해도 무방함) • 1~6: 칸에 해당하는 주사위를 제외하고 나머지 다시 던지기. (ex) [6 6 4 4 6]에서 가장 높은 점수로 “6”이 선택된 경우 [6 6 4 4 6]에서 유지 할 조합으로 주사위 1, 2, 5번째 선택, 다시 던질 주사위로 3, 4번째 주사위 선택. • C: 주사위 눈이 3 이하인 주사위는 다시 던지기. • 4K, FH, SS, LS, Y: 해당 칸을 완성한 조합이면 다시 던질 주사위 없음, 나머지는 모든 주사위 다시 던지기. (ex) [1 2 3 4 6]으로 SS 선택된 경우, 다시 던질 주사위 없음. 3. 선택된 다시 던질 주사위를 다시 던져 주사위 조합을 업데이트 합니다. 이 과정을 2회 반복합니다. 아래 예시에서 컴퓨터는 자신의 순서에, 주사위를 3회 던지고 최종 조합 [5, 5, 5, 5, 5]으로 Y(Yacht)를 선택하여 컴퓨터 점수판의 Y 항목에 50점이 기록되었습니다. [Computer’s Turn (1/12)] Roll: [5, 3, 5, 1, 5] Which dice to reroll (1~5)? 2 4 # ‘5’ 선택, 다시 던질 주사위 2, 4 번째 선택 Roll: [5, 2, 5, 5, 5] Which dice to reroll (1~5)? 2 # ‘C’ 선택, 다시 던질 주사위 2 선택 Roll: [5, 5, 5, 5, 5] Sorted Roll: [5, 5, 5, 5, 5] Choose a category: Y ┌──────────┬──────────┐ │ Player │ Computer │ ├──────────┴──────────┤ │ 1: │ 1: │ │ 2: │ 2: │ │ 3: 12 │ 3: │ │ 4: │ 4: │ │ 5: │ 5: │ │ 6: │ 6: │ ├─────────────────────┤ │ Sub total: 12/63 │ Sub total: 0/63 │ │ +35 bonus: │ +35 bonus: │ ├─────────────────────┤ │ C: │ C: │ ├─────────────────────┤ │ 4K: │ 4K: │ 8 │ FH: │ FH: │ │ SS: │ SS: │ │ LS: │ LS: │ │ Yacht: │ Yacht: 50 │ ├─────────────────────┤ │ Total: 12 │ Total: 50 │ └─────────────────────┘ [Player’s Turn (2/12)] Roll: [1, 1, 4, 2, 1] 그림 6. 컴퓨터의 순서 (주사위 던지기, 점수판 기록) C. 게임 종료 모든 플레이어가 모든 점수판(총 12칸)을 채우면 최종 점수판이 출력되고, 최종 점수를 비교하여 승패를 결정합니다. Player가 이긴 경우 “You win!”, 진 경우 “You lose!”, 비긴 경우 “Draw”로 간단하게 아래의 예시와 같이 출력합니다. ┌──────────┬──────────┐ │ Player │ Computer │ ├──────────┴──────────┤ │ 1: 2 │ 1: 2 │ │ 2: 6 │ 2: 8 │ │ 3: 12 │ 3: 9 │ │ 4: 8 │ 4: 12 │ │ 5: 15 │ 5: 10 │ │ 6: 12 │ 6: 6 │ ├─────────────────────┤ │ Sub total: 55/63 │ Sub total: 47/63 │ │ +35 bonus: 0 │ +35 bonus: 0 │ ├─────────────────────┤ │ C: 16 │ C: 21 │ ├─────────────────────┤ │ 4K: 14 │ 4K: 6 │ │ FH: 18 │ FH: 14 │ │ SS: 15 │ SS: 15 │ │ LS: 30 │ LS: 0 │ │ Yacht: 50 │ Yacht: 50 │ ├─────────────────────┤ │ Total: 198 │ Total: 153 │ └─────────────────────┘ You win! Press Enter to continue… 그림 7. 게임 종료 화면 그림 7의 화면에서 엔터키를 입력하면 아래 실행 예시처럼 초기 메뉴가 출력됩니다. 이때 엔터키 외의 입력은 고려하지 않습니다. Press Enter to continue… 9 [Yacht Dice] ———————————- 1. New Game 2. Load Game 3. Exit ———————————- Select a menu: 그림 8. 게임 종료 후 초기 메뉴로 이동 화면 D. 게임 중단 및 점수판 저장 게임 중간에 사용자 입력이 있을 때는 언제든지, ‘Q’를 입력하여 현재 진행중인 게임을 중단할 수 있습니다. 아래 예시와 같이 게임 중간에 ‘Q’를 입력하면 현재까지 기록된 점수판을 저장할 파일이름을 입력 받아, 입력 받은 파일명으로 점수판을 저장합니다. 저장 후, 초기 메뉴로 돌아 갑니다. ┌──────────┬──────────┐ │ Player │ Computer │ ├──────────┴──────────┤ │ 1: │ 1: │ │ 2: 2 │ 2: │ │ 3: 9 │ 3: 9 │ │ 4: │ 4: 8 │ │ 5: │ 5: │ │ 6: │ 6: │ ├─────────────────────┤ │ Sub total: 11/63 │ Sub total: 17/63 │ │ +35 bonus: │ +35 bonus: │ ├─────────────────────┤ │ C: │ C: 24 │ ├─────────────────────┤ │ 4K: │ 4K: │ │ FH: 18 │ FH: │ │ SS: │ SS: │ │ LS: │ LS: │ │ Yacht: │ Yacht: │ ├─────────────────────┤ │ Total: 29 │ Total: 41 │ └─────────────────────┘ [Player’s Turn (4/12)] Roll: [1, 3, 2, 5, 3] Which dice to reroll (1~5)? 4 5 Roll: [1, 3, 2, 2, 3] Which dice to reroll (1~5)? Q Game paused. Enter the filename to save: game1.txt File saved. [Yacht Dice] ———————————- 1. New Game 2. Load Game 3. Exit ———————————- Select a menu: 그림 9. 게임 중단 및 점수판 저장 game1.txt 1: x x 2: 2 x 3: 9 9 4: x 8 5: x x 6: x x C: x 24 4K: x x FH: 18 x SS: x x LS: x x Y: x x 10 점수판을 파일에 저장 시, – 총 12 줄이며, 각 줄은 “[항목이름:] [Player 점수] [Computer 점수]” 형식으로 저장합니다. – 아직 채워지지 않은 점수는 ‘x’로 표기합니다. 2. Load Game(2를 선택 시) 초기 메뉴에서 사용자가 2를 선택하면 점수판이 저장된 파일을 읽어와 점수판을 채운 후, 게임이 진행됩니다. 중단된 게임(9쪽)을 저장한 파일을 불러와 게임을 계속 진행할 수 있는 기능입니다. [Yacht Dice] ———————————- 1. New Game 2. Load Game 3. Exit ———————————- Select a menu: 2 Enter filename to load: test1.txt 그림 10. 초기 메뉴에서 2. Load Game 선택 예시 불러오게 될 txt 파일의 예시는 다음과 같습니다. Starting a game… ┌──────────┬──────────┐ │ Player │ Computer │ ├──────────┴──────────┤ │ 1: │ 1: │ │ 2: │ 2: │ │ 3: 6 │ 3: │ │ 4: │ 4: 8 │ │ 5: │ 5: 10 │ │ 6: 18 │ 6: 24 │ ├─────────────────────┤ │ Sub total: 24/63 │ Sub total: 42/63 │ │ +35 bonus: │ +35 bonus: │ ├─────────────────────┤ │ C: │ C: 21 │ ├─────────────────────┤ │ 4K: │ 4K: 26 │ │ FH: │ FH: │ │ SS: 15 │ SS: │ │ LS: 30 │ LS: │ │ Yacht: 50 │ Yacht: │ ├─────────────────────┤ │ Total: 119 │ Total: 89 │ └─────────────────────┘ [Player’s Turn (6/12)] Roll: [1, 4, 3, 5, 6] Which dice to reroll (1~5)? 그림 11. txt 파일 불러오기 예시 – 유효한 파일 이때 파일은 텍스트(.txt) 파일이며, 파일의 구성은 다음과 같습니다. test1.txt 1: x x 2: x x 3: 6 x 4: x 8 5: x 10 6: 18 24 C: x 21 4K: x 26 FH: x x SS: 15 x LS: 30 x Y: 50 x 11 – 총 12줄이며, 각 줄에는 player와 computer의 점수가 적혀 있습니다. – 아직 채워지지 않은 점수는 ‘x’로 표기합니다. – 각 줄의 점수가 숫자와 ‘x’외의 다른 문자가 들어가는 것은 고려하지 않습니다. – 두 플레이어의 남은 턴 수가 다른 경우는 없다고 가정합니다. 만일, 사용자로부터 파일명을 입력 받았을 때, – 존재하지 않은 파일명이라면 “File does not exist.” 라고 출력합니다. – 유효하지 않은 내용이라면 “Invalid file content.”문구 출력 후, 다시 파일을 불러올 것인지를 입력 받습니다. 해당 과제에서 고려하고자 하는 유효하지 않은 내용은 두가지입니다. 1. 총 줄의 개수가 12가 아닌 경우 2. 주사위 조합으로 불가능한 점수가 적혀 있는 경우 그림 12. Txt 파일 불러오기 예시 – 유효하지 않은 파일 위 예시에서 test11.txt는 존재하지 않는 txt file이며, test_w1.txt는 1번 오류, test_w2.txt는 2번 오류에 해당합니다. test_w1.txt test_w2.txt 1: x x 2: x x 3: 6 x 4: x 8 5: x 10 6: 18 24 C: x 21 4K: 17 x FH: 18 x SS: 15 x LS: 30 x Y: 50 x W: 12 12 1: x x 2: x x 3: 6 x 4: x 8 5: x 11 6: 18 24 C: x 21 4K: 17 x FH: 18 x SS: 15 x LS: 30 x Y: 50 x Select a menu: 2 Enter filename to load: test11.txt File does not exist. Enter filename to load: test_w1.txt Invalid file content. Enter filename to load: test_w2.txt Invalid file content. Enter filename to load: 12 [사용자 정의 함수] 다음 함수들을 반드시 작성하여 프로그램을 구현해야 합니다. 아래 명시된 함수 이름은 변경하지 말아주세요. 각 함수의 매개변수의 개수 및 리턴 값 등은 자유롭게 변경 가능합니다. 그러나 동 일한 기능을 하는 함수는 반드시 있어야 하며, 변경 시 무엇을 어떻게 변경했는지 보고서에 기록 하도록 합니다. 이 외에 필요한 함수는 자유롭게 정의해서 사용할 수 있습니다.  print_score_board(score_list) – 현재까지 얻은 점수 리스트(score_list)를 매개변수로 전달받아, 아래 예시와 같이 점수 판의 현재 상태를 출력하는 함수입니다. – 게임 시작화면과 더불어 게임 진행 과정 중에 호출하여 사용하도록 합니다. – 달라지는 점수 리스트에 따라 점수 표 형태가 어그러지지 않도록 주의합니다. ┌──────────┬──────────┐ │ Player │ Computer │ ├──────────┴──────────┤ │ 1: │ 1: │ │ 2: │ 2: │ │ 3: 6 │ 3: │ │ 4: │ 4: 8 │ │ 5: │ 5: 10 │ │ 6: 18 │ 6: 24 │ ├─────────────────────┤ │ Sub total: 24/63 │ Sub total: 42/63 │ │ +35 bonus: │ +35 bonus: │ ├─────────────────────┤ │ C: │ C: 21 │ ├─────────────────────┤ │ 4K: │ 4K: 26 │ │ FH: │ FH: │ │ SS: 15 │ SS: │ │ LS: 30 │ LS: │ │ Yacht: 50 │ Yacht: │ ├─────────────────────┤ │ Total: 119 │ Total: 89 │ └─────────────────────┘ 그림 13. 점수판 출력 예시  load_file2list(filename) – 파일명을 매개변수로 전달받아 해당 파일의 스코어를 리스트로 생성하여 반환하는 함수 입니다.  check_error(score_list) – 텍스트로부터 생성된 점수 리스트(score_list)가 유효한지 알려주는 함수입니다. 11쪽에 명시되어 있는 유효하지 않은 파일 조건을 만족하면 True, 유효한 파일이라면 False를 반환하도록 합니다.  roll_dice(dice_set=[], reroll_indices=[]) – 현재 주사위 조합(dice_set)과 다시 던질 주사위의 인덱스 리스트(reroll_indices)를 매 개변수로 전달받아 업데이트 된 주사위 목록을 반환하도록 합니다. – 각 플레이어가 자신의 순서에 주사위를 3회 던질 때, 해당 함수를 적절하게 호출하여 사 13 용하도록 합니다.  calc_score(dice_set, sel) – 주사위 조합(dice_set)과 알고자 하는 점수칸(sel)을 매개변수로 전달받아 알맞은 점수 를 반환하는 함수입니다. (Hint, 주사위 조합(dice_set)을 sorting한 뒤 점수를 계산하 면 수월합니다.)  computer_pattern(dice_set, score_list) – 현재 주사위 조합과 현재 점수 리스트(score_list)를 매개변수로 전달받아 7쪽에 명시되 어 있는 컴퓨터 룰에 따라 선택된 점수 칸(sel), 다시 던질 주사위의 인덱스 리스트를 생성해 반환하는 함수입니다. 현재 점수 리스트는 아직 채워지지 않은 칸을 판별하기 위 해 사용되며, 현재 주사위 조합은 해당 주사위 조합으로 얻을 수 있는 점수들을 알기 위 해 사용됩니다.

$25.00 View

[SOLVED] Csed101. programming & problem solving programming assignment 1

◼ 파이썬 버전: Python 3.x ◼ 제출물  .py 소스 코드 (assn1.py) ➢ 프로그램의 소스 코드를 이해하기 쉽도록 반드시 주석을 붙일 것.  보고서 파일 (.docx, .hwp 또는 .pdf; assn1.docx, assn1.hwp 또는 assn1.pdf) ➢ AssnReadMe.pdf 를 참조하여 작성할 것. ➢ 프로그램 실행화면을 캡처하여 보고서에 포함시키고, 간단히 설명할 것 ➢ 명예서약(Honor code): 표지에 다음의 내용을 포함한다. “나는 이 프로그래밍 과제 를 다른 사람의 부적절한 도움 없이 완수하였습니다.” 보고서 표지에 명예서약이 없 는 경우는 과제를 제출하지 않은 것으로 처리한다.  소스코드와 보고서 파일을 PLMS를 통하여 제출한다. ➢ PLMS에 제출할 때는 소스파일과 보고서를 압축하지 말고 각각 업로드 할 것. ◼ 주의사항  구문 오류(Syntax Error)가 발생하거나 실행이 되지 않는 과제는 0점으로 채점됩니다.  제출 기한보다 하루 늦게 제출된 과제는 최종 20%, 이틀 늦게 제출된 과제는 최종 40% 감점됩니다. 제출 기한보다 사흘 이상 늦으면 제출 받지 않습니다 (0점 처리). 늦은 제출시 PLMS에 기록된 최종 수정일시를 기준으로 감점합니다.  각 문제의 제한 조건과 요구 사항을 반드시 지켜 주시기 바랍니다.  모든 문제의 출력 형식은 채점을 위해 아래에 제시된 예시들과 최대한 비슷하게 작성해 주세요.  각 문제에 명시된 에러 처리 외에는 고려하지 않아도 됩니다.  이번 과제에서는 추가 기능 구현에 대한 추가 점수는 없습니다.  운영체제 및 개발 환경마다 화면 지우기 명령어가 달라지므로 화면 지우기 요구사항을 반드시 따라야 합니다.  부정행위에 관한 규정은 POSTECH 전자컴퓨터공학부 학부위원회의 ‘POSTECH 전자컴퓨터 공학부 부정행위 정의’를 따른다. (LMS의 과목 공지사항의 제목 [document about cheating]의 첨부파일인 disciplinary.pdf를 참조할 것.) 2 ◼ Problem: 묵찌빠 계단오르기 (목적) 이번 과제를 통하여 조건문, 반복문, 사용자 정의 함수 및 랜덤 함수 사용법을 익힌다. (주의사항) (1) 이번 과제는 함수를 정의하고 사용하는 방법을 익히는 문제이므로 함수를 정의하지 않고 기능을 구현한 경우 감점 처리된다. 문서에 반드시 정의해서 사용해야 할 사용자 정의 함수가 설명되어 있으니 확인 후 구현하도록 한다. – 정의해서 사용해야 할 사용자 정의 함수의 매개변수는 자유롭게 변형하여 사용할 수 있다. (2) int, float, bool, str, list, tuple 자료형까지 수업시간에 다룬 내용에 한해서 사용 가능하다. (3) 문제의 출력 형식은 채점을 위해 아래의 실행 예시와 최대한 비슷하게 작성해야 한다. (설명) 이 게임은 2인으로 진행이 되며, 본 과제에서는 컴퓨터와 사용자가 플레이를 하게 된다. 컴퓨터와 사용자가 서로 맞은편 언덕 위 계단에서 묵찌빠를 하면서 규칙에 따라 계단을 오르거나 내려가게 된다. 이때, 먼저 상대편의 시작점에 도착하는 플레이어가 이기는 게임이다. 승패를 위한 ‘묵찌빠’는 아래 규칙을 사용하도록 한다. (1) 공격권 결정 가위바위보 게임을 위해 각 플레이어(컴퓨터, 사용자)들은 가위, 바위, 보 중에 하나를 선택하여 낸 다. 만약 두 플레이어가 같은 선택을 한 경우 승부가 날 때까지 가위바위보를 계속하며 가위바위보 승부에서 이긴 플레이어가 공격권을 갖는다. (2) 묵찌빠 수행 플레이어들은 가위, 바위, 보 중 하나를 선택한다. 공격권을 가진 사람의 손 모양이 상 대의 손 모양과 일치하면 공격권을 가진 사람이 승리한다. 승부가 갈리지 않은 경우 현 상태에서 가위바위보 규칙 상 이긴 사람이 공격권을 가져간다. (3) 승패 결정 및 계단 이동 규칙 묵찌빠에서 승리한 플레이어가 승부가 날 때까지 소모된 턴 수만큼 계단을 이동한다. 3 I. 게임 시작 프로그램이 시작되면, 아래 그림 1과 같이 계단의 개수를 입력 받기 위한 텍스트가 출력되고 사용자로부터 입력을 받을 준비를 한다. 단 계단의 개수는 10개~30개로 한정한다. 범위를 벗어난 입력에 대해서는 아래의 예시처럼 다시 입력 받도록 한다. 정수 이외의 입력은 고려하지 않는다. (실행 예시의 빨간색 밑줄은 사용자 입력에 해당한다.) ====================== [묵찌빠 계단 오르기] ====================== ○ ● ▨ ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨▨▨▨▨▨ 게임을 위한 계단의 개수를 입력해주세요. >> 7 게임을 위한 계단의 개수를 입력해주세요. >> 388 게임을 위한 계단의 개수를 입력해주세요. >> 그림 1. 게임 초기 화면 범위 내의 계단의 개수를 입력하면 화면을 지운 후 컴퓨터와 플레이를 할 화면이 그림 2와 같이 출력되도록 한다. 이 부분 구현에 대해서는 Tips(마지막 쪽)의 ‘화면 지우기’ 설명을 참조한다. (이 과제의 모든 출력화면은 화면을 지운다고 명시한 경우, 그에 맞게 지운 후 출력한다. 화면 지우기를 수행할 시 엔터 이외의 입력은 고려하지 않는다.) 총 계단 수: 12 PLAYER: ○ < 0> COMPUTER: ● < 0> ○ ● ▨ ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ 계속하려면 엔터를 눌러주세요… 그림 2. 계단이 생성된 화면 예시(12개의 계단을 입력한 경우) ◆ 그림 2의 (1) – 사용자가 입력한 총 계단 수 – PLAYER의 위치를 표시하는 기호 ‘○’와 현재까지 이동한 계단 수 – COMPUTER의 위치를 표시하는 기호 ‘●’와 현재까지 이동한 계단 수 ◆ 그림 2의 (2) PLAYER는 왼쪽 계단 위에서 COMPUTER는 오른쪽 계단 위에서 게임을 시작한다. PLAYER는 ‘○’, COMPUTER는 ‘●’ 기호로 현재 위치를 나타내고 있다. 현재는 둘 다 이동한 계단수가 (1) (2) 4 0인 상태이다. 게임 도중에 같은 계단에 서게 되면 기호 ‘◑’로 표시하도록 한다. 게임을 위해 이동해야 할 계단의 수는 홀수일 때와 짝수일 때의 구성이 다르니 그림 3과 Appendix의 그림 17을 참고하여 작성하도록 한다. 그림 3의 빨간색으로 표시된 숫자는 플레이어가 이동하게 될 순서이며 플레이어가 현재 위치에서 한 계단을 이동하게 되면, 1이라고 적힌 위치로 이동하게 된다. 플레이어와는 반대로 컴퓨터는 현재 위치에서 한 계단을 이동하게 되면 그림 3의 (a)의 경우 10, 3의 (b)의 경우 11이라고 적힌 위치로 이동하게 된다. 총 계단 수: 11 PLAYER: ○ < 0> COMPUTER: ● < 0> ○ ● ▨ ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨▨▨▨▨▨▨ 계속하려면 엔터를 눌러주세요… (a) 총 계단수가 홀수인 경우 (b) 총 계단수가 짝수인 경우 그림 3. 총 계단 수 예시 화면 ➢ 계단을 출력하기 위해서 다음과 같은 함수를 정의한 후 사용한다. ⚫ print_stairs(): 컴퓨터와 플레이어의 현재 이동한 계단 수와 이동해야 할 총 계단 수를 매개변수를 전달받아 화면에 현재 진행상황을 출력한다. 승부가 결정될 때마다 해당함수를 호출하여 현재 진행상황을 지속적으로 출력한다. (중첩 for문을 사용하여 구현할 것) 그림 3의 상태에서 엔터를 누르면 화면 지우기 후 그림 4와 같이 가위, 바위, 보 중 하나를 선택하는 화면으로 넘어간다. 플레이어는 ‘가위’, ‘바위’, ‘보’ 중 하나를 선택하여 입력한다. 선택 범위를 벗어나는 입력에 대한 실행 예시는 그림 14를 참조하도록 한다. 컴퓨터는 random 모듈의 함수를 사용하여 ‘가위’, ‘바위’, ‘보’ 중 하나의 후보를 선택하게 된다. (단, 컴퓨터는 프로그램을 실행할 때마다 랜덤하게 가위바위보를 내도록 구현해야 한다.) ➢ 컴퓨터의 선택을 생성하기 위해서 다음과 같은 함수를 정의한 후 사용한다. ⚫ computer_choice(): ‘가위’, ‘바위’, ‘보’ 중 무작위로 하나의 후보 선택 후 return 플레이어의 선택 후 그림 4와 같이 플레이어와 컴퓨터가 각각 무엇을 냈는지 출력해 준다. 그림 4는 컴퓨터가 바위, 플레이어가 보를 선택한 후 출력한 예시, 그림 5는 컴퓨터와 플레이어 모두 가위를 선택한 후 출력한 예시이다. 총 계단 수: 12 PLAYER: ○ < 0> COMPUTER: ● < 0> ○ ● ▨ ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ 계속하려면 엔터를 눌러주세요… 11 1 10 2 9 3 8 4 7 5 6 12 1 11 2 10 3 9 4 8 5 7 6 5 [공격권 결정 가위바위보] 가위, 바위, 보 중 하나 선택: 보 [컴퓨터 선택] ┌──────────────────┐ │ │ │ ▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩ │ │ │ └──────────────────┘ [플레이어 선택] ┌──────────────────┐ │ │ │ ▩▩▩▩▩ │ │ ▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩ │ │ │ └──────────────────┘ [결과] 플레이어 공격, 컴퓨터 수비입니다. 계속하려면 엔터를 눌러주세요… 그림 4. 공격권 결정을 위한 가위바위보 – 플레이어 승리 예시 ➢ 가위바위보 출력을 위해 아래의 함수를 정의하고 사용한다. ⚫ print_scissors() 그림 5의 [컴퓨터 선택] 출력과 같이 가위 이미지를 출력 ⚫ print_rock() 그림 4의 [컴퓨터 선택] 출력과 같이 바위 이미지를 출력 ⚫ print_paper() 그림 4의 [플레이어 선택]의 출력과 같이 보 이미지를 출력 그림 4와 같이 가위바위보에서 승부가 가려진 경우 “[결과] 플레이어 공격, 컴퓨터 수비입니다.” 혹은 “[결과] 컴퓨터 공격, 플레이어 수비입니다.” 를 출력하고 엔터 입력을 기다린다. 만약 ‘공격권 결정 가위바위보’에서 승부가 가려지지 못한 경우 그림 5와 같이 “[결과] 무승부입니다.” 를 출력한 후 엔터 입력을 기다린다. 엔터 입력이 들어온 경우 화면을 지우고 위의 과정을 승부가 결정될 때까지 반복한다. 6 [공격권 결정 가위바위보] 가위, 바위, 보 중 하나 선택: 가위 [컴퓨터 선택] ┌──────────────────┐ │ ▩▩ │ │ ▩▩ ▩▩▩▩▩ │ │ ▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩ ▩▩▩▩▩ │ │ ▩▩▩ ▩▩ │ └──────────────────┘ [플레이어 선택] ┌──────────────────┐ │ ▩▩ │ │ ▩▩ ▩▩▩▩▩ │ │ ▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩ ▩▩▩▩▩ │ │ ▩▩▩ ▩▩ │ └──────────────────┘ [결과] 무승부입니다. 계속하려면 엔터를 눌러주세요… 그림 5. 공격권 결정을 위한 가위바위보 – 무승부 예시 그림 4와 같이 공격과 수비가 결정된 상태에서 엔터 입력이 들어온 경우 화면을 지우고 그림 6과 같이 다시 가위바위보 입력을 받는다. 이 때 화면 최상단에 승리 시 이동 칸 수를 출력하도록 한다. 승리 시 이동 칸 수는 처음에 1로 시작하며, 승부가 나지 않을 때마다 1씩 증가한다. [묵찌빠] 승리 시 이동 칸 수: 1 플레이어 공격, 컴퓨터 수비입니다. 가위, 바위, 보 중 하나 선택: 그림 6. 공격/수비 결정 후 화면 입력 대기 컴퓨터는 앞서 이야기한 computer_choice() 함수를 활용하여 가위, 바위, 보 중 무작위로 하나를 선택하도록 한다. 플레이어의 선택 후 승부가 갈리지 않았다면 현 상태에서 묵찌빠 규칙 상 이긴 사람이 공격권을 가져가고 승부가 날 때까지 위의 과정을 반복한다. 그림 7은 플레이어가 공격권을 가진 상태에서 공격에 실패한 후 컴퓨터가 공격권을 가져갔을 때의 출력 예시로, 하단에 “컴퓨터 공격, 플레이어 수비입니다.” 가 출력되었다. 7 [묵찌빠] 승리 시 이동 칸 수: 1 플레이어 공격, 컴퓨터 수비입니다. 가위, 바위, 보 중 하나 선택: 보 [컴퓨터 선택] ┌──────────────────┐ │ ▩▩ │ │ ▩▩ ▩▩▩▩▩ │ │ ▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩ ▩▩▩▩▩ │ │ ▩▩▩ ▩▩ │ └──────────────────┘ [플레이어 선택] ┌──────────────────┐ │ │ │ ▩▩▩▩▩ │ │ ▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩ │ │ │ └──────────────────┘ [결과] 컴퓨터 공격, 플레이어 수비입니다. 계속하려면 엔터를 눌러주세요… 그림 7. 플레이어 공격 실패 후 컴퓨터 공격권인 상태인 예시 승부가 결정나지 않으면 승부가 날 때까지 위의 과정을 반복하되, 매 턴마다 ‘승리 시 이동 칸 수’를 1씩 증가시킨다. 그림 8은 그림 7의 상태에서 엔터를 입력한 후의 예시로 화면을 지운 후 다시 가위바위보 입력을 기다리고 있는 상태이다. ‘승리 시 이동 칸 수’가 그림 7과 달리 1에서 2로 증가한 것을 확인할 수 있고 컴퓨터가 공격권을 가진 상태임을 확인할 수 있다. [묵찌빠] 승리 시 이동 칸 수: 2 컴퓨터 공격, 플레이어 수비입니다. 가위, 바위, 보 중 하나 선택: 그림 8. 그림 7의 상태에서 엔터를 입력한 후 화면 입력 대기 그림 9와 같이 컴퓨터와 플레이어가 같은 선택을 하여 승부가 결정되었을 때 묵찌빠를 종료한다. 그림 9는 플레이어가 공격권을 가진 상태에서 플레이어와 컴퓨터가 모두 ‘보’를 선택했을 때의 예시이며 5턴만에 승부가 결정되어 플레이어가 5칸을 이동하게 되는 예시이다. 8 [묵찌빠] 승리 시 이동 칸 수: 5 플레이어 공격, 컴퓨터 수비입니다. 가위, 바위, 보 중 하나 선택: 보 [컴퓨터 선택] ┌──────────────────┐ │ │ │ ▩▩▩▩▩ │ │ ▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩ │ │ │ └──────────────────┘ [플레이어 선택] ┌──────────────────┐ │ │ │ ▩▩▩▩▩ │ │ ▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩ │ │ │ └──────────────────┘ [결과] 묵찌빠 종료 플레이어 승, 5 칸 이동합니다. 계속하려면 엔터를 눌러주세요… 그림 9. 플레이어 승리로 승부가 결정되었을 때의 예시 그림 9와 같이 승부가 결정된 상태에서 플레이어가 엔터를 입력하면 화면 지우기 후 바로 다음 판을 진행한다. 이때, 플레이어와 컴퓨터의 현재 계단에서의 위치를 숫자와 그림으로 그림 10과 같이 표시한다. 5턴만에 승부가 결정되었기 때문에 앞에서 명시한 계단 이동 규칙을 적용하여 플레이어가 5칸 이동하게 되었음을 확인할 수 있다. 총 계단 수: 12 PLAYER: ○ < 5> COMPUTER: ● < 0> ● ▨ ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨○ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ 계속하려면 엔터를 눌러주세요… 그림 10. 그림 2의 상태에서 그림 9와 같이 플레이어가 승리 후 5칸 이동하였을 때의 예시 9 그림 11 및 12는 그림 10의 상태에 이어 컴퓨터가 4턴만에 승리한 경우의 예시이다. 플레이어의 위치 이동 5, 컴퓨터의 위치 이동 0인 상태에서 컴퓨터가 4턴만에 이겨 컴퓨터가 4계단 이동하게 되었다. 승부의 결과는 그림 11과 같이 “컴퓨터 승, 4칸 이동합니다”가 출력된다. 플레이어가 엔터를 입력하면 화면을 지우고 그림 12의 예시처럼 승부의 결과가 반영된 결과를 출력한다. [묵찌빠] 승리 시 이동 칸 수: 4 컴퓨터 공격, 플레이어 수비입니다. 가위, 바위, 보 중 하나 선택: 가위 [컴퓨터 선택] ┌──────────────────┐ │ ▩▩ │ │ ▩▩ ▩▩▩▩▩ │ │ ▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩ ▩▩▩▩▩ │ │ ▩▩▩ ▩▩ │ └──────────────────┘ [플레이어 선택] ┌──────────────────┐ │ ▩▩ │ │ ▩▩ ▩▩▩▩▩ │ │ ▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩ ▩▩▩▩▩ │ │ ▩▩▩ ▩▩ │ └──────────────────┘ [결과] 묵찌빠 종료 컴퓨터 승, 4 칸 이동합니다. 계속하려면 엔터를 눌러주세요… 그림 11. 컴퓨터 승리로 승부가 결정되었을 때의 예시 총 계단 수: 12 PLAYER: ○ < 5> COMPUTER: ● < 4> ▨ ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ●▨▨▨▨ ▨▨▨▨▨○ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ 계속하려면 엔터를 눌러주세요… 그림 12. 컴퓨터 승리 후 4칸 이동하였을 때의 예시 10 그림 13은 게임 중간에 플레이어와 컴퓨터가 같은 계단 위치에 서게 된 경우로 기호 ‘◑’로 위치가 표시됨을 보여준다. 총 계단 수: 12 PLAYER: ○ < 3> COMPUTER: ● < 9> ▨ ▨ ▨▨ ▨▨ ▨▨▨◑ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ 계속하려면 엔터를 눌러주세요… 그림 13. 게임 중간에 플레이어와 컴퓨터의 위치가 같은 경우 플레이어가 가위, 바위, 보에서 벗어난 후보를 선택하여 입력하면 특별한 에러 메시지 없이 그림 14처럼 정상적인 입력을 받을 때까지 다시 입력을 받도록 한다. [공격권 결정 가위바위보] 가위, 바위, 보 중 하나 선택: 묵 가위, 바위, 보 중 하나 선택: 빠 가위, 바위, 보 중 하나 선택: 가위 [컴퓨터 선택] ┌──────────────────┐ │ │ │ ▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩ │ │ │ └──────────────────┘ [플레이어 선택] ┌──────────────────┐ │ ▩▩ │ │ ▩▩ ▩▩▩▩▩ │ │ ▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩▩ ▩▩▩▩▩▩▩ │ │ ▩▩▩▩▩▩ ▩▩▩▩▩ │ │ ▩▩▩ ▩▩ │ └──────────────────┘ [결과] 컴퓨터 공격, 플레이어 수비입니다. 계속하려면 엔터를 눌러주세요… 그림 14. 플레이어의 잘못된 입력 예시 11 II. 게임 종료 게임이 끝나는 경우는 컴퓨터 혹은 플레이어가 상대방의 시작점까지 도달한 경우이다. 그림 15의 왼쪽 예시는 12개의 계단 중 플레이어와 컴퓨터 모두 11번째 계단에 위치한 상태의 예시이다. 그림 15의 왼쪽 상태에서 플레이어가 2턴만에 승리를 가져와 2계단을 이동하게 되었다. 플레이어는 11번째 계단에서 2계단을 이동해야 하지만 총 12개의 계단이 존재하므로 플레이어의 최종 위치는 12번째 계단이 되고 이는 컴퓨터의 게임 시작위치이다. 그리고, 그 아래 그림 15의 오른쪽 예시와 같이 “플레이어 최종 승리!!!”를 출력 후 게임을 종료한다. 총 계단 수: 12 PLAYER: ○ COMPUTER: ● ▨● ○▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ 계속하려면 엔터를 눌러주세요… 그림 15. 게임 종료 예시 (플레이어 승) (플레이어 최종 승리 위치 수정) 그림 16은 컴퓨터가 먼저 플레이어의 시작 위치에 도착한 경우로 “컴퓨터 최종 승리!!!” 출력 후 프로그램을 종료한다. 총 계단 수: 12 PLAYER: ○ < 8> COMPUTER: ● ● ▨ ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ○▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨▨▨▨▨▨▨▨ 컴퓨터 최종 승리!!! ▨▨▨▨▨▨▨▨▨▨▨▨▨ 게임을 종료합니다… 그림 16. 게임 종료 예시 (컴퓨터 승) 총 계단 수: 12 PLAYER: ○ COMPUTER: ● ○ ▨● ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨▨▨▨▨▨▨▨ 플레이어 최종 승리!!! ▨▨▨▨▨▨▨▨▨▨▨▨▨ 게임을 종료합니다… 12 Tips ◼ 화면 지우기 본 과제에서는 화면 지우기를 활용해야 하는 경우가 많다. 그러나 jupyter notebook, windows/linux 등 개발 환경 및 실행 차이로 인해 사용해야 하는 화면 지우기 명령어가 환경에 따라 달라질 수 있다. 본 과제에서는 아래와 같이 화면 지우기를 위해 clear_screen() 함수를 만 들어 사용하도록 하며, 이를 따르지 않을 경우 감점된다. Windows/Linux 환경인 경우 os module을 사용하여 현재 콘솔 창에 출력된 내용을 지울 수 있다. jupyter notebook 환경인 경우 IPython module을 사용하여 현재 출력된 내용을 지울 수 있다. 아 래 코드를 환경에 맞게 만들어 실행해본 뒤 clear_screen() 함수 부분을 주석 처리하여 실행해봄 으로써 차이를 파악하도록 한다. import os from IPython.display import clear_output def clear_screen(): # os.system(‘cls’) # Windows 콘솔 창에서 실행 시 주석 해제 # os.system(‘clear’) # Linux 콘솔 창에서 실행 시 주석 해제 clear_output() # jupyter notebook 외 실행 시 주석 처리할 것 return print(‘Hello, World!’) clear_screen() # 해당 부분 주석처리한 후 실행하여 결과 비교 print(‘Hello, World!’) 13 Appendix ◼ 계단의 개수 예시 총 계단 수: 13 PLAYER: ○ < 0> COMPUTER: ● < 0> ○ ● ▨ ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨▨▨▨▨▨▨▨▨ 계속하려면 엔터를 눌러주세요… 총 계단 수: 14 PLAYER: ○ < 0> COMPUTER: ● < 0> ○ ● ▨ ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨▨ ▨▨▨▨▨▨▨ 계속하려면 엔터를 눌러주세요… (a) 총 계단수가 13개인 경우 (b) 총 계단수가 14개인 경우 총 계단 수: 15 PLAYER: ○ < 0> COMPUTER: ● < 0> ○ ● ▨ ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨▨ ▨▨▨▨▨▨▨ ▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨ 계속하려면 엔터를 눌러주세요… 총 계단 수: 16 PLAYER: ○ < 0> COMPUTER: ● < 0> ○ ● ▨ ▨ ▨▨ ▨▨ ▨▨▨ ▨▨▨ ▨▨▨▨ ▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨ ▨▨▨▨▨▨▨ ▨▨▨▨▨▨▨ ▨▨▨▨▨▨▨▨ ▨▨▨▨▨▨▨▨ 계속하려면 엔터를 눌러주세요… (c) 총 계단수가 13개인 경우 (d) 총 계단수가 14개인 경우 그림 17. 총 계단 수 예시 화면 그림 17은 계단의 개수가 증가하면서 계단 출력이 어떻게 변화하는지에 대한 예시이다. 가운데 칸이 가장 낮은 위치이고 가장자리로 갈수록 층이 높아지는 V자 형태를 띄고 있음을 확인할 수 있다.

$25.00 View