C语言简易文字冒险游戏源代码

Python015

C语言简易文字冒险游戏源代码,第1张

记忆游戏

#include<stdio.h>

#include<time.h>

#include<stdlib.h>

#include<windows.h>

#define N 10

int main(  )

{int i,k,n,a[N],b[N],f=0

srand(time(NULL))

printf("  按1开始\n  按0退出:_")

scanf("%d",&n)

system("cls")

while(n!=0)

{for(k=0k<Nk++)a[k] = rand( )%N

printf("\n\t\t[请您牢记看到颜色的顺序]\n\n")

for(k=0k<Nk++)

{switch(a[k])

{case 0:system("color 90")printf("  0:淡蓝色\n")break  //淡蓝色

case 1:system("color f0")printf("  1:白色\n")break  //白色

case 2:system("color c0")printf("  2:淡红色\n")break  //淡红色

case 3: system("color d0")printf("  3:淡紫色\n")break  //淡紫色

case 4: system("color 80")printf("  4:灰色\n") break  //灰色

case 5: system("color e0")printf("  5:黄色\n")break  //黄色

case 6: system("color 10")printf("  6:蓝色\n") break  //蓝色

case 7: system("color 20")printf("  7:绿色\n")break  //绿色

case 8: system("color 30")printf("  8:浅绿色\n")break  //浅绿色

case 9: system("color 40")printf("  9:红色\n")break  //红色

}

Sleep(1500)

system("color f")  //单个控制 文字颜色

Sleep(100)

}

system("cls")

printf(" 0:淡蓝色,1:白色,2:淡红色,3:淡紫色,4:灰色,5:黄色,6:蓝色7:绿色,8:浅绿色,9:红色\n")

printf("\n\t请输入颜色的顺序:")

for(k=0k<Nk++)scanf("%d",&b[k])

for(k=0k<Nk++)if(a[k] == b[k]) f++

if(f==0) printf("  你的记忆弱爆了0\n")

else if(f==1) printf("  你的记忆有点弱1\n")

else if(f<5) printf("  你的记忆一般<5\n")

else printf("  你的记忆力很强!\n")

Sleep(2000)

system("cls")

printf("\t\t按0退出\n\t\t按任意键继续游戏:\n")

scanf("%d",&n)

system("cls")

}

return 0

}

注:DEVc++运行通过,每输入一个数字要加入一个空格。

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

}

# include<stdio.h>

# include <conio.h>

# include <graphics.h>

# include <time.h>

# pragma comment(lib,”Winmm.lib”) //引用Windows Multimedia APT

int score =0 //全局变量********整型的分数

char s[5] //全局变量****字符型的分数

struct player_ //自定义的结构体,并顺便定义一个结构体变量

{

char name[20]

int score_

}player[11]

/***************函数声明*****************/

void record_() //记录彼此成绩函数

void welcome( ) //欢迎界面函数

void instructions( ) //游戏说明界面函数

void gane (int rank2) //游戏函数

void record ( ) //显示记录函数

int rank_(char rank1) //等级选择函数

void goodbye ( ); //退出界面函数

/**************主函数**************/

int main ()

{

char rank1 //rank1接受从键盘输入的字符,根据字符判断等级

int rank2=15 // 控制延时时间,从而控制速度

intsign=1 // 当做标记,用于标记是否弹出MessageBox对话框

welcome ( ) //调用欢迎界面函数

instructions ( )//调用游戏什么函数

record( )//调用显示记录函数

InputBox(player[10].name,20,"请输入玩家昵称" //以对话框形式获取用户输入函数

rank1=getch()//读入一个字母

rank2=rank_(rank1)//调用等级函数

game (rank2)//调用游戏函数

HWND wnd =GetHWnd()

while (sign) //sign作为标记,执行循环

if (MessageBox(wnd,"游戏结束!!!\n再来一局,挑战更高分数","询问",MB_YESNO|MB_ICONQUESTION)==IDYES)

game (rank2)

else

{

sign=0

goodbye( )

}

closegraph( )

return 0

}

/***************记录本次成绩函数***************/

void record_()

{

FILE*fp //文件指针

int i,j

struct player_t //定义结构体变量t,冒泡法比较大小时用

player[10].score_=score //把该局的分数赋给该局用户的结构体变量中

fp=fopen("记录.dat","rb") //打开二进制文件

for (i=0i<10i++)

{

fread(player[i].name,20,l,fp) //读入记录中的成绩和名字

fread (&player[i].score_,4,l,fp)

}

fclose(fp) //关闭二进制文件

for (j=0j<10j++) //冒泡法排序

for (i=0i<10-ji++)

if (player[i].score_)

{

t=player[i]

player[i]=player[i+1]

player[i+1]=t

}

fp=fopen("记录.dat","wb") //打开文件

for (i=0i<10i++) //把排好序列的数据存入记录文件

{

fwrite(player[i].name,20,l,fp)

fwrite (&player[i].score_,4,l,fp)

}

fclose(fp) //关闭文件

}

/****************欢迎界面函数****************/

void welcome ( )

{

char ch

mciSendString("open\"res\\Sleep Away.mp3\"alias mymusic",NULL,0,NULL)

initgraph(640,480) //初始化画图界面

IMAGE img //定义IMAGE对象

loadimage (&img,"res\\00.jpg") //读取图片到img对象中

putimage (0,0,&img) //在坐标(0,0)位置显示IMAGE对象

ch=getch() //吸收掉一个按键

cleardevice() //清屏

}

/***************游戏说明界面函数**************/

void instructions()

{

int c=255 //控制变色的变量

setcolor(YELLOW) //设置颜色

setfont (30,0,"黑体") //设置字体

outtextxy(0,0,"游戏说明") //输出文字

setcolor(WHITE)

setfont(28,0,"宋体")

outtextxy(0,30,"一、每次游戏下落200个字母") //输出文字

outtextxy(0,58,"二、请按数字键选择游戏等级")

outtextxy(0,86,"三、统计被击中的个数")

setfont(30,0,"华文行楷")

outtextxy (20,220,"等级一二三四 五六七八九")

outtextxy(20,260,“按键 1 2 3 4 5 6 7 8 9”);

while (!kbhit()) //kihit()作用是判断是否有字幕输入

{

setcolor(RGB(c,255,0))

setfont (80,0,"楷体")

outtextxy(140,130,"请选择等级")

setcolor(RGB(c,0,255))

setfont(100,0,"Wickenden Cafe NDP")

outtextxy(100,135,"Let's go!!!")

c-=25 //控制颜色的变量自减

if(c<0)c=255 //控制颜色的变量小于0时,再把255赋给c

cleardevice() //清屏

}

/***************退出界面函数***************/

void goodbye()

{

int c=255 //控制变色变量

cleardevice() //清屏

setcolor(YELLOW)

setfont (48,0,"黑体")

outtextxy (104,120,"的最终成绩是: ")

setfont (48,0,"华文楷体")

setcolor(RGB(255,255,0))

outtextxy(140,320,"按任意键退出游戏")

setcolor(YELLOW)

setfont(48,0,"黑体")

outtextxy (104,120,"的最终成绩是: ")

outtextxy(104,70,player[10].name)

record_() //调用记录本次成绩函数

while(!kbhit())

{

setcolor(RGB(255,0,c-100)) //设置颜色

setfont(100,0,”Wickenden Café NDP”)

outtextxy(400,90,s) //输出数字

setcolor(RGB(c,0,255))

setfont(48,0,”黑体”)

if (score==200)

outtextxy(100,200,”全部击中!!!”)

else

if(score>190)

outtextxy(100,200,”不错!继续加油!”);

else

outtextxy(100,200,”不要灰心!继续加油!”);

c-=25

if(c<0)

c=255

Sleeep(20) //延时20秒

}

getch( ) //提供给用户时需要等待输入后再退出

}

/**************等级选择函数**************/

int rank_(char rank1)

{

int rank2

switch(rank1) //判断字符,确定等级

{

case’0’:rank2=11break

case’1’:rank2=10break

case’2’:rank2=9break

case’3’:rank2=8break

case’4’:rank2=7break

case’5’:rank2=6break

case’6’:rank2=5break

case’7’:rank2=4break

case’8’:rank2=3break

case’9’:rank2=2break

default:rank2=15break

}

return rank2

}

/**************显示记录函数***********/

void record( )

{

FILE *p //文件指针

int a[10],j

char b[10][10]

fp=fopen(“记录。dat”,”rb”) //打开文件

for (j=0j<10j++)

{

fread(player[j].name,20,1,fp) //读取文件中的信息

fread(&player[j].score_,4,1,fp)

}

fclose(fp) //关闭文件

setfont(60,0,”Arial”)

setcolor(RGB(250,250,0))

outtextxy(250,0,”TOP10”)

for(j=0j<10j++)

{

sprintf(“b[j],%d”,player[j].score_) //把整型转换为字符型

setcolor(RGB(0,100,255))

setfont(40,0,”Arial”)

outtextxy(420,50+40*j,b[j])

outtextxy(120,50+40*j,player[j].name) //输出名字

/**********游戏函数******************/

void game (int rank2)

{

cleardevice( ) //清屏

score=0 //清除掉原有的分数

outtextxy(0,0,”玩家:”);

outtextxy(90,0,player[10].name)

setfont(20,0,”Arial”)

outtextxy(100,460,” 人生有享受片刻优雅恬适的权力,让打字母游戏放松你一下吧!”);

int i;

char target //目标字母

char key //用户的按键

intx,y //字母的位置

int flag =1 //标记是否按了退出键

int sum=0 //成绩计数

int num =200 //规定下落字母的个数

srand (time(NULL)) //随机时间种子,设置第一个随机函数的值

setfillstyle(BLACK) //设置下面矩形内图的颜色

setcolor(YELLOW) //

line(0,450,640,450) //用3条线规定一下工作区

line(0,440,640,440) //用3条线规定一下工作区

line(0,40,640,40) //用3条线规定一下工作区

while (flag&&num)

{

setfont(40,0,”宋体”); //设置字母的字体和大小

i=rand()%2 //rand()函数返回0~32767之间的一个整数

if(i)

target=97+rand()%26 //产生任意小写字母

else

target=65+rand()%26 //产生任意大写字母

x=rand()%610 //产生任意下落位置

for (y=41y<380y++)

{

setcolor (RGB(255,0,255))

outtextxy(x,y,target) //显示字母

if(kbhit())

{

key=getch() //获取用户按键

if ((key==target)||( key==target-32)||( key==target+32))

{

score++ //分数统计

sprintf(s,”%d”score)

setfont(30,0,”Arial”)

outtextxy(500,0,“分数”)

outtextxy(600,0,s) //输出分数

bar(x-10,y-10,x+35,y+50) // 击中用黑框形擦去字母

break //跳出循环,进行下一个字母

}

else if (key==27) //判断是否按了

{

flag=0 //若果按ESC,退出游戏主循环

break

}

}

Sleep(rank2) //控制清除字母的时间爱你也就是控制下落速度

bar(x,y,x+35,y+60) //擦最下面的字符

}

num-- //计数

}

}