问题描述:
急需一个C语言 猜拳游戏的源代码!!!!急需一个C语言 猜拳游戏的源代码!!!!急需一个C语言 猜拳游戏的源代码!!!!急需一个C语言 猜拳游戏的源代码!!!!急需一个C语言 猜拳游戏的源代码!!!!急需一个C语言 猜拳游戏的源代码!!!!急需一个C语言 猜拳游戏的源代码!!!!
解析:
enum p_r_s{
paper,rock,scissors,game,help,instructions,quit
}
#include <stdio.h>
main()
{
enum p_r_s player,machine
enum p_r_s selection_by_player(),selection_by_machine()
int win,lose,tie
win=lose=tie=0
instructions_for_the_player()
while((player=selection_by_player())!=quit)
switch(player){
case paper:
case rock:
case scissors:
machine=selection_by_machine()
if(player==machine){
++tie
printf("\n a tie")
}
else if(you_won(player,machine)){
++win
printf("\n you won")
}
else{
++lose
printf("\n i won")
}
break
case game:
game_status(win,lose,tie)
break
case instructions:
instructions_for_the_player()
break
case help:
help_for_the_player()
break
}
game_status(win,lose,tie)
printf("\n\nBYE\n\n")
}
instructions_for_the_player()
{
printf("\n%s\n\n%s\n\n%s\n%s\n%s\n\n%s\n%s\n%s\n\n%s\n%s\n%s",
"PAPER,ROCK,SCISSORS",
"In this game",
"p is for paper,",
"r is for rock,",
"s is for scissors.",
"Both the player and the machine will choose one",
"of p,r,or s. If the o choices are the same,",
"then the game is a tie. Otherwise:",
"\"paper covers the rock\" (a win for paper),",
"\"rock breaks the scissors\" (a win for rock),",
"\"scissors cut the paper\" (a win for scissors).")
printf("\n\n%s\n\n%s\n%s\n%s\n%s\n\n%s\n\n%s",
"There are other allowable inputs:",
"g for game status (the number of wins so far),",
"h for help,",
"i for instructions (reprin these instructions),",
"q for quit (to quit the game).",
"This game is played repeatedly until q is entered.",
"Good luck!")
}
enum p_r_s selection_by_player()
{
char c
enum p_r_s player
printf("\n\ninput p,r,or s:")
while((c=getchar())==''||c=='\n'||c=='t')
switch(c){
case 'p':
player=paper
break
case 'r':
player=rock
break
case 's':
player=scissors
break
case 'g':
player=game
break
case 'i':
player=instructions
break
case 'q':
player=quit
break
default:
player=help
}
return(player)
}
enum p_r_s selection_by_machine()
{
static int i
i=++i%3
return((i==0)? paper:((i==1)? rock:scissors))
}
you_won(player,machine)
enum p_r_s player,machine
{
int victory
if(player==paper)
victory=machine==rock
else if(player==rock)
victory=machine==scissors
else/*player==scissors*/
victory=machine==paper
return(victory)
}
game_status(win,lose,tie)
{
printf("\nGAME STATUS")
printf("\n\n%7d%s\n%7d%s\n%7d%s\n%7d%s",
win,"games won by you",
lose,"games won by me",
tie,"game tied",
win+lose+tie,"games played:")
}
help_for_the_player()
{
printf("\n%s\n\n%s\n%s\n%s\n%s\n%s\n%s\n%s",
"the following characters can be used for input:",
" p for paper",
" r for rock",
" s for scissors",
" g to find out the game status",
" h to print this list",
" i to reprint the instructions for this game",
" q to quit this game")
}
这是一个简单的猜拳游戏(剪子包子锤),让你与电脑对决。你出的拳头由你自己决定,电脑则随机出拳,最后判断胜负。下面的代码会实现一个猜拳游戏,让你与电脑对决。你出的拳头由你自己决定,电脑则随机出拳,最后判断胜负。
启动程序后,让用户出拳,截图:
用户出拳,显示对决结果:截图:
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
char gamer// 玩家出拳
int computer// 电脑出拳
int result// 比赛结果
// 为了避免玩一次游戏就退出程序,可以将代码放在循环中
while (1){
printf("这是一个猜拳的小游戏,请输入你要出的拳头:\n")
printf("A:剪刀\nB:石头\nC:布\nD:不玩了\n")
scanf("%c%*c",&gamer)
switch (gamer){
case 65: //A
case 97: //a
gamer=4
break
case 66: //B
case 98: //b
gamer=7
break
case 67: //C
case 99: //c
gamer=10
break
case 68: //D
case 100: //d
return 0
default:
printf("你的选择为 %c 选择错误,退出...\n",gamer)
getchar()
system("cls")// 清屏
return 0
break
}
srand((unsigned)time(NULL))// 随机数种子
computer=rand()%3// 产生随机数并取余,得到电脑出拳
result=(int)gamer+computer// gamer 为 char 类型,数学运算时要强制转换类型
printf("电脑出了")
switch (computer)
{
case 0:printf("剪刀\n")break//4 1
case 1:printf("石头\n")break//7 2
case 2:printf("布\n")break //10 3
}
printf("你出了")
switch (gamer)
{
case 4:printf("剪刀\n")break
case 7:printf("石头\n")break
case 10:printf("布\n")break
}
if (result==6||result==7||result==11) printf("你赢了!")
else if (result==5||result==9||result==10) printf("电脑赢了!")
else printf("平手")
system("pause>nul&&cls")// 暂停并清屏
}
return 0
}
代码分析
1) 首先,我们需要定义3个变量来储存玩家出的拳头(gamer)、电脑出的拳头(computer)和最后的结果(result),然后给出文字提示,让玩家出拳。
接下来接收玩家输入:
scanf("%c%*c",&gamer)
DOS模式下的(文字游戏):#define SHITOU 0
#define JIANDAO 1
#define BU 2
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
int x,y
srand ((unsigned)time(NULL))
x = rand() % 3//随机生成0、1、2
printf ("该你出:0-石头,1-剪刀,2-布\n")
scanf ("%d", &y)
switch (x){
case SHITOU:
switch (y){
case SHITOU:
printf("电脑-石头,玩家-石头,平\n")
break
case JIANDAO:
printf("电脑-石头,玩家-剪刀,电脑赢\n")
break
case BU:
printf("电脑-石头,玩家-布,玩家赢\n")
break
}
break
case JIANDAO:
switch (y){
case SHITOU:
printf("电脑-剪刀,玩家-石头,玩家赢\n")
break
case JIANDAO:
printf("电脑-剪刀,玩家-剪刀,平\n")
break
case BU:
printf("电脑-剪刀,玩家-布,电脑赢\n")
break
}
break
case BU:
switch (y){
case SHITOU:
printf("电脑-布,玩家-石头,电脑赢\n")
break
case JIANDAO:
printf("电脑-布,玩家-剪刀,玩家赢\n")
break
case BU:
printf("电脑-布,玩家-布,平\n")
break
}
break
}
return 0
}
WINDOWS模式下的,用MFC写成(可视,但我不会画那些图案,只好用文字代替):
(PRS.h)
#define SHITOU 0
#define JIANDAO 1
#define BU 2
class CMyApp: public CWinApp
{
public:
virtual BOOL InitInstance ()
}
class CMainWindow: public CFrameWnd
{
protected:
int m_nPlayer
int m_nComputer
int m_nWinner
static CRect m_Buttons[3]
static CRect m_ViewPart[2]
static CRect m_Text[2]
public:
CMainWindow ()
protected:
int GetIndex(CPoint&point)
void Judge ()
void ComputerTurn()
void DrawGameText (CDC *pDC, int pos)
void DrawButton (CDC *pDC)
void DrawTittle (CDC *pDC)
protected:
afx_msg void OnPaint ()
afx_msg void OnLButtonDown (UINT nFlags, CPoint point)
DECLARE_MESSAGE_MAP()
}
(PRS.cpp)
#include <afxwin.h>
#include <stdlib.h>
#include <time.h>
#include "PRS.h"
CMyApp theApp
BOOL CMyApp::InitInstance ()
{
m_pMainWnd = new CMainWindow
m_pMainWnd->ShowWindow (m_nCmdShow)
m_pMainWnd->UpdateWindow()
return TRUE
}
BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
ON_WM_PAINT ()
ON_WM_LBUTTONDOWN ()
END_MESSAGE_MAP ()
CRect CMainWindow::m_Buttons[3] =
{
CRect (0, 540, 200, 600),
CRect (200, 540, 400, 600),
CRect (400, 540, 600, 600)
}
CRect CMainWindow::m_ViewPart[2] =
{
CRect (0, 200, 300, 540),
CRect (300, 200, 600, 540)
}
CRect CMainWindow::m_Text[2] =
{
CRect (0, 0, 300, 200),
CRect (300, 0, 600, 200)
}
CMainWindow::CMainWindow ()
{
CString strWnd = AfxRegisterWndClass (
CS_HREDRAW | CS_VREDRAW,
AfxGetApp () ->LoadStandardCursor (IDC_ARROW),
(HBRUSH)(COLOR_3DFACE + 1),
AfxGetApp () ->LoadStandardIcon (IDI_WINLOGO)
)
CreateEx (0, strWnd, _T("猜拳"),
WS_OVERLAPPED | WS_SYSMENU |
WS_CAPTION | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL)
CRect rect (0, 0, 600, 600)
CalcWindowRect (&rect)
SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(),
SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW)
}
void CMainWindow::OnPaint()
{
CPaintDC dc(this)
DrawTittle(&dc)
DrawButton(&dc)
CPen pen(PS_SOLID, 5, RGB(0, 255, 255))
CPen* pOldPen = dc.SelectObject (&pen)
dc.MoveTo (300, 200)
dc.LineTo (300, 480)
dc.SelectObject (pOldPen)
}
void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point)
{
int i
i = GetIndex(point)
if (i == -1)
return
switch (i){
case SHITOU:
m_nPlayer = SHITOU
break
case JIANDAO:
m_nPlayer = JIANDAO
break
case BU:
m_nPlayer = BU
break
}
ComputerTurn()
Judge()
}
void CMainWindow::DrawTittle(CDC *pDC)
{
CFont font
font.CreatePointFont (300, _T("黑体"))
pDC->SetBkMode(TRANSPARENT)
CFont* pOldFont = pDC->SelectObject (&font)
pDC->DrawText (_T("电脑"), -1, &m_Text[0], DT_CENTER | DT_SINGLELINE | DT_VCENTER)
pDC->DrawText (_T("玩家"), -1, &m_Text[1], DT_CENTER | DT_SINGLELINE | DT_VCENTER)
pDC->SelectObject (pOldFont)
}
void CMainWindow::DrawButton(CDC *pDC)
{
CBrush brushes[3]
brushes[0].CreateSolidBrush(RGB(100, 60, 30))
brushes[1].CreateSolidBrush(RGB(20, 120, 90))
brushes[2].CreateSolidBrush(RGB(30, 80, 150))
for (int i = 0i<3i++){
pDC->Draw3dRect(&m_Buttons[i], RGB(255, 0, 0), RGB(0, 0, 255))
pDC->FillRect(&m_Buttons[i], &brushes[i])
}
CFont font
font.CreatePointFont(300, _T("黑体"))
pDC->SetBkMode (TRANSPARENT)
CFont* pOldFont = pDC->SelectObject(&font)
pDC->DrawText(_T("石"), -1, &m_Buttons[0], DT_VCENTER | DT_SINGLELINE | DT_CENTER)
pDC->DrawText(_T("剪"), -1, &m_Buttons[1], DT_VCENTER | DT_SINGLELINE | DT_CENTER)
pDC->DrawText(_T("布"), -1, &m_Buttons[2], DT_VCENTER | DT_SINGLELINE | DT_CENTER)
}
void CMainWindow::ComputerTurn()
{
srand((unsigned)time(NULL))
m_nComputer = rand()%3
}
void CMainWindow::Judge()
{
CClientDC dc(this)
CFont font
font.CreatePointFont (500, _T("黑体"))
dc.SetTextColor(RGB(255, 0, 0))
dc.SetBkMode (TRANSPARENT)
CFont* pOldFont = dc.SelectObject(&font)
switch(m_nComputer){
case SHITOU:
dc.DrawText(_T("石头"), &m_ViewPart[0], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
dc.SetTextColor(RGB(0, 0, 255))
switch(m_nPlayer){
case SHITOU:
dc.DrawText(_T("石头"), &m_ViewPart[1], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
m_nWinner = 0
break
case JIANDAO:
dc.DrawText(_T("剪刀"), &m_ViewPart[1], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
m_nWinner = 1
break
case BU:
dc.DrawText(_T("布"), &m_ViewPart[1], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
m_nWinner = 2
break
}
break
case JIANDAO:
dc.SetTextColor(RGB(255, 0, 0))
dc.DrawText(_T("剪刀"), &m_ViewPart[0], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
dc.SetTextColor(RGB(0, 0, 255))
switch(m_nPlayer){
case SHITOU:
dc.DrawText(_T("石头"), &m_ViewPart[1], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
m_nWinner = 2
break
case JIANDAO:
dc.DrawText(_T("剪刀"), &m_ViewPart[1], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
m_nWinner = 0
break
case BU:
dc.DrawText(_T("布"), &m_ViewPart[1], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
m_nWinner = 1
break
}
break
case BU:
dc.SetTextColor(RGB(255, 0, 0))
dc.DrawText(_T("布"), &m_ViewPart[0], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
dc.SetTextColor(RGB(0, 0, 255))
switch(m_nPlayer){
case SHITOU:
dc.DrawText(_T("石头"), &m_ViewPart[1], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
m_nWinner = 1
break
case JIANDAO:
dc.DrawText(_T("剪刀"), &m_ViewPart[1], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
m_nWinner = 2
break
case BU:
dc.DrawText(_T("布"), &m_ViewPart[1], DT_CENTER | DT_VCENTER | DT_SINGLELINE)
m_nWinner = 0
break
}
break
}
switch(m_nWinner){
case 0:
MessageBox (_T("平局"), _T("Result"))
Invalidate()
break
case 1:
MessageBox (_T("电脑胜"), _T("Result"))
Invalidate()
break
case 2:
MessageBox (_T("玩家胜"), _T("Result"))
Invalidate()
break
}
}
int CMainWindow::GetIndex(CPoint &point)
{
register int i
for (i = 0i <3i++)
if (m_Buttons[i].PtInRect(point))
return i
return -1
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)