急需一个C语言 猜拳游戏的源代码!!!!

急需一个C语言 猜拳游戏的源代码!!!!,第1张

分类: 电脑/网络 >>程序设计 >>其他编程语言

问题描述:

急需一个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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8037819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存