c语言井字游戏

2025-05-16 版权声明 我要投稿

c语言井字游戏(精选5篇)

c语言井字游戏 篇1

//自制-拼图游戏   作者:高坤  请标明出处  谢谢www.dnzg.cn

//代码笨拙  高手勿笑   欢迎批评指正

#include

#include

#include

#include

#include “resource.h”

HINSTANCE hInst;

HBITMAP pic.ruiwen.compare_pic,pict[8],compare_pict[8],other;   //所有图的变量名

HDC hdc,mdc;                                                   //DC名

int mouse_x,mouse_y,n=0,line=3,high3=100,high4=200,high5=300;   //鼠标X Y 移动步数 难度 记录

char str[10]=“ ”;                                               //字符串,显示步数和记录时用

bool fin=false,new3=true,new4=false,new5=false;                 //完成 难度三 四 五 的重绘

struct Point

{

int x;

int y;

int num;

}point[26];                                                     //块

ATOM MyRegisterClass(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

void MyPaint;                                                  //显示

void Change_Block(int block1,int block2);                        //交换两块的属性

void Save();                                                     //保存记录

void GetPos();                                                   //为重绘做的随机排列

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{

MSG msg;

MyRegisterClass(hInstance);

if (!InitInstance (hInstance, nCmdShow))   //如果实例化失败,退出

{

return FALSE;

}

while (GetMessage(&msg, NULL, 0, 0))        //消息循环,一直获取消息,直到消息返回值为假

{

TranslateMessage(&msg);                 //翻译消息

DispatchMessage(&msg);                  //将消息发到适当的对象上

}

return msg.wParam;

}

ATOM MyRegisterClass(HINSTANCE hInstance)   //注册窗口类,通知你要建的窗口是什么样的.可以有多个,用类名来区分

{

WNDCLASSEX wcex;                                      //类名

wcex.cbSize = sizeof(WNDCLASSEX);                     //类的长度      cb...表示存储空间

wcex.style            = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;        //窗口风格  水平horizontal.垂直vertical.重画redraw

wcex.lpfnWndProc    = (WNDPROC)WndProc;               //指向函数的一个指针 指向WndProc

//LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

wcex.cbClsExtra        = 0;                              //类变量占用的存储 (cb表示存储空间的前缀)

wcex.cbWndExtra        = 0;                              //实例变量占用的存储

wcex.hInstance        = hInstance;                     //定义该类的应用程序实例的句柄

wcex.hIcon            = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));                     //图标对象的句柄

wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);   //光标图像的句柄

wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);      //用于擦掉用户区的刷子的句柄

wcex.lpszMenuName    = (LPCSTR)IDR_MENU1;                           //标识选单对象的字符串

wcex.lpszClassName    = “CAN”;                          //该类名字的字符串  lpsz长指针,以结束

wcex.hIconSm        = NULL;                           //

return RegisterClassEx(&wcex);                        //定义完类的各个对象后注册

}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance;

char filename[30]=“ ”;

hWnd = CreateWindow(“CAN”, “游戏窗口”, WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)         //类名,用于标识创建的窗口属于哪个类.

{

return FALSE;

}

MoveWindow(hWnd,80,100,1087,526,true);

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

hdc=GetDC(hWnd);

mdc=CreateCompatibleDC(hdc);                          //创建缓存

empty=(HBITMAP)LoadImage(hInstance,“Sourcepicempty.bmp”,IMAGE_BITMAP,687,526,LR_LOADFROMFILE);

for(int m=0;m<=7;m++)

{

sprintf(filename,“Sourcepicpic%d.bmp”,m);      //读图,没什么好说的

pict[m] = (HBITMAP)LoadImage(hInstance,filename,IMAGE_BITMAP,600,480,LR_LOADFROMFILE);

compare_pict[m]=(HBITMAP)LoadImage(hInstance,filename,IMAGE_BITMAP,450,360,LR_LOADFROMFILE);

}

pic=pict[0];

compare_pic=compare_pict[0];

FILE *fp;                                       //读入record文件中的记录

if((fp=fopen(“Sourcerecord”,“ab+”))==NULL)

{

MessageBox(NULL,“不能打开record文件,可能被删除,请在Source中重新建立.”,“”,NULL);

return false;

}

else

{

fread(&high3,sizeof(high3),1,fp);

fread(&high4,sizeof(high4),1,fp);

fread(&high5,sizeof(high5),1,fp);

fclose(fp);

}

MyPaint();

return TRUE;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps;

int block_num=0;                        //用于鼠标所指的块的编号,非NUM号 要区分

switch (message)

{

case WM_PAINT:                          //显示

hdc = BeginPaint(hWnd, &ps);

hdc=GetDC(hWnd);

MyPaint();

EndPaint(hWnd, &ps);

break;

case WM_COMMAND:                                      //菜单命令

switch(LOWORD(wParam))

{

case ID_NEWGAME:

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;           //读图后要重排图

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC0:

pic=pict[0];                       //读入大图

compare_pic=compare_pict[0];      //读入参照图

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;           //读图后要重排图

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC1:

pic=pict[1];

compare_pic=compare_pict[1];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC2:

pic=pict[2];

compare_pic=compare_pict[2];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC3:

pic=pict[3];

compare_pic=compare_pict[3];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC4:

pic=pict[4];

compare_pic=compare_pict[4];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC5:

pic=pict[5];

compare_pic=compare_pict[5];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC6:

pic=pict[6];

compare_pic=compare_pict[6];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC7:

pic=pict[7];

compare_pic=compare_pict[7];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC8:

if(LoadImage(NULL,“Sourcepicother.bmp”,IMAGE_BITMAP,600,480,LR_LOADFROMFILE))   //成功载入other.bmp

{

pic = (HBITMAP)LoadImage(NULL,“Sourcepicother.bmp”,IMAGE_BITMAP,600,480,LR_LOADFROMFILE);

compare_pic=(HBITMAP)LoadImage(NULL,“Sourcepicother.bmp”,IMAGE_BITMAP,450,360,LR_LOADFROMFILE);

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

}

else MessageBox(hWnd,“pic文件夹中无other.bmp文件.”,“说明”,NULL);   //未成功载入other.bmp

break;

case ID_THREE:

new3=true;new4=false;new5=false;line=3;fin=0;n=0;  //如果选难度三,则要重排图,不许四,五重排.难度设为三,标记未完成,n从0记数.

MyPaint();

break;

case ID_FOUR:

new3=false;new4=true;new5=false;line=4;fin=0;n=0;

MyPaint();

break;

case ID_FIVE:

new3=false;new4=false;new5=true;line=5;fin=0;n=0;

MyPaint();

break;

case ID_INTRODUCE:

MessageBox(hWnd,“鼠标点击移动,拼完整即胜利!如果想自添加图需要用BMP格式,文件名为other.bmp,并放入pic文件夹中.”,“说明”,NULL);

break;

case ID_ABOUT:

MessageBox(hWnd,“如发现BUG或有好的建议。请致信EMAIL:29648634@qq.com。谢谢!    Special Thank 老婆--悦 对我的大力支持! 作者:高坤”,“说明”,NULL);

break;

case ID_EXIT:

DestroyWindow(hWnd);

break;

default:

MessageBox(hWnd,“菜单命令错误!”,“”,NULL);

}

break;

case WM_LBUTTONDOWN:                              //鼠标左键控制块的移动

mouse_x=LOWORD(lParam);                        //记录鼠标的位置

mouse_y=HIWORD(lParam);

block_num=0;

switch(line)

{

case 3:

if(mouse_x<600 && mouse_y<480)                     //鼠标在允许点击的大图上才赋块值

block_num=mouse_x/200+1+(mouse_y/160)*3;

if(!fin && block_num>0)

{

sndPlaySound(“Sourcesoundclick.wav”,SND_ASYNC | SND_FILENAME);

switch(block_num)

{

case 1:

if(point[2].num==9)                  //第一块可以与第二块交换

{

Change_Block(1,2);

n++;                                         //移动步数加1

}

else if(point[4].num==9)           //第一块可以与第四块交换

{

Change_Block(1,4);

n++;                                         //移动步数加1

}

break;

case 2:

if(point[1].num==9)                          //第二块可以与第一块交换

{

Change_Block(2,1);

n++;   //移动步数加1

}

else if(point[5].num==9)                          //第二块可以与第五块交换

{

Change_Block(2,5);

n++;   //移动步数加1

}

else if(point[3].num==9)                          //第二块可以与第三块交换

{

Change_Block(2,3);

n++;   //移动步数加1

}

break;

case 3:

if(point[2].num==9)                              //第三块可以与第二块交换

{

Change_Block(3,2);

n++;  //移动步数加1

}

else if(point[6].num==9)                              //第三块可以与第六块交换

{

Change_Block(3,6);

n++;  //移动步数加1

}

break;

case 4:

if(point[1].num==9)                          //第四块可以与第一块交换

{

Change_Block(4,1);

n++;   //移动步数加1

}

else if(point[5].num==9)                          //第四块可以与第五块交换

{

Change_Block(4,5);

n++;   //移动步数加1

}

else if(point[7].num==9)                          //第四块可以与第七块交换

{

Change_Block(4,7);

n++;   //移动步数加1

}

break;

case 5:

if(point[2].num==9)                          //第五块可以与第二块交换

{

Change_Block(5,2);

n++;   //移动步数加1

}

else if(point[4].num==9)                          //第五块可以与第四块交换

{

Change_Block(5,4);

n++;   //移动步数加1

}

else if(point[6].num==9)                          //第五块可以与第六块交换

{

Change_Block(5,6);

n++;   //移动步数加1

}

else if(point[8].num==9)                          //第五块可以与第八块交换

{

Change_Block(5,8);

n++;   //移动步数加1

}

break;

case 6:

if(point[3].num==9)                          //第六块可以与第三块交换

{

Change_Block(6,3);

n++;   //移动步数加1

}

else if(point[5].num==9)                          //第六块可以与第五块交换

{

Change_Block(6,5);

n++;   //移动步数加1

}

else if(point[9].num==9)                          //第六块可以与第九块交换

{

Change_Block(6,9);

n++;   //移动步数加1

}

break;

case 7:

if(point[8].num==9)                  //第七块可以与第八块交换

{

Change_Block(7,8);

n++;                                         //移动步数加1

}

else if(point[4].num==9)           //第七块可以与第四块交换

{

Change_Block(7,4);

n++;                                         //移动步数加1

}

break;

case 8:

if(point[7].num==9)                          //第八块可以与第七块交换

{

Change_Block(8,7);

n++;   //移动步数加1

}

else if(point[5].num==9)                          //第八块可以与第五块交换

{

Change_Block(8,5);

n++;   //移动步数加1

}

else if(point[9].num==9)                          //第八块可以与第九块交换

{

Change_Block(8,9);

n++;   //移动步数加1

}

break;

case 9:

if(point[8].num==9)                              //第九块可以与第八块交换

{

Change_Block(9,8);

n++;  //移动步数加1

}

else if(point[6].num==9)                              //第九块可以与第六块交换

{

Change_Block(9,6);

n++;  //移动步数加1

}

break;

default:;

}

}

break;

case 4:

if(mouse_x<600 && mouse_y<480)

block_num=mouse_x/150+1+(mouse_y/120)*4;

if(!fin && block_num>0)                        //如果block_num没能从鼠标坐标上获取值则说明点的位置不对,

{

sndPlaySound(“Sourcesoundclick.wav”,SND_ASYNC | SND_FILENAME);

switch(block_num)

{

case 1:

if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

break;

case 4:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

break;

case 13:

if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

else if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

break;

case 16:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

break;

case 2:

case 3:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

else if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

break;

case 5:

case 9:

if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

else if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

break;

case 8:

case 12:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

else if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

break;

case 14:

case 15:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

break;

default:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

else if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

}

}

break;

case 5:

if(mouse_x<600 && mouse_y<480)

block_num=mouse_x/120+1+(mouse_y/96)*5;

if(!fin && block_num>0)                        //如果block_num没能从鼠标坐标上获取值则说明点的位置不对。

{

sndPlaySound(“Sourcesoundclick.wav”,SND_ASYNC | SND_FILENAME);

switch(block_num)                                 //移动两块

{

case 1:

if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

break;

case 5:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

break;

case 21:

if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

else if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

break;

case 25:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

break;

case 2:

case 3:

case 4:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

else if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

break;

case 6:

case 11:

case 16:

if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

else if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

break;

case 10:

case 15:

case 20:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

else if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

break;

case 22:

case 23:

case 24:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

break;

default:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

else if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

}

}

break;

default:;

}

MyPaint();

break;

case WM_CLOSE:

if(IDYES==MessageBox(hWnd,“真的不玩了?”,“提示”,MB_YESNO))

{

DestroyWindow(hWnd);

}

break;

case WM_DESTROY:

int k;

for(k=0;k<7;k++)

{

DeleteObject(pict[k]);

DeleteObject(compare_pict[k]);

}

DeleteObject(compare_pic);

DeleteObject(pic);

DeleteObject(empty);

ReleaseDC(hWnd,hdc);

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

void MyPaint()

{

SelectObject(mdc,empty);                        //贴上背景图

BitBlt(hdc,600,0,487,526,mdc,200,0,SRCCOPY);

SelectObject(mdc,compare_pic);                  //贴上参照图

BitBlt(hdc,617,0,450,360,mdc,0,0,SRCCOPY);

sprintf(str,“%d”,n);                             //显示移动步数

TextOut(hdc,817,433,str,strlen(str));

if(3==line)

{

sprintf(str,“%d”,high3);                    //在其位置显示最高记录

TextOut(hdc,1007,433,str,strlen(str));

if(new3)               //如果要重排

{

GetPos();            //重排

new3=false;

}

SelectObject(mdc,pic);

for(int i=1;i<=9;i++)

{

switch(i)            //按属性贴图

{

case 1:

BitBlt(hdc,0,0,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 2:

BitBlt(hdc,200,0,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 3:

BitBlt(hdc,400,0,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 4:

BitBlt(hdc,0,160,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 5:

BitBlt(hdc,200,160,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 6:

BitBlt(hdc,400,160,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 7:

BitBlt(hdc,0,320,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 8:

BitBlt(hdc,200,320,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 9:

BitBlt(hdc,400,320,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

default:

MessageBox(NULL,“贴图序列号错误!”,“”,NULL);

}

c语言井字游戏 篇2

1 游戏功能说明

1.1 游戏过程

⑴系统产生一个不重复的N位随机数 (N的大小设置为等级相关:如初级设置为2, 中级设置为3, 高级设置为4) ;

⑵玩家输入所猜测的不重复N位数, 按回车提交 (如果输入的数字个数应与N一致, 若不一致, 应当重新输入) ;

⑶系统比对产生的随机数和提交的猜测数, 输出形如“A*B*”的提示信息 (该信息中A后的数字代表数值正确、位置也正确的数目, B后的数字代表数值正确但位置不正确的数目, 如“A1B2”, 表示玩家已经猜出了3个数字, 其中有1个数值正确位置也正确, 有2个猜对了数值, 但位置不对) ;

以上的后两步骤重复进行, 但系统可以限定猜测比对次数。在规定次数以内猜测成功, 即为游戏成功, 否则, 游戏失败。猜数次数也可设置与等级相关:如初级设置为9次, 中级设置为8次, 高级设置为7次。

1.2 游戏结果排行

按游戏完成所猜数的次数为主关键字, 历时时间为次关键字, 对游戏结果进行排序统计。在最佳排行中显示前五的记录, 若玩家的成绩高于已有的记录, 则提示输入玩家信息, 并更新最佳排行。

2 总体设计

根据上述的游戏功能说明, 将猜字游戏的模块设计如图1所示:

⑴“系统功能菜单”模块:用于玩家进行操作选择, 也是本游戏的入口, 玩家在此选择相应模块并调用对应的功能。

⑵“开始游戏”模块:根据游戏等级设置的猜数位数和猜数次数, 记录游戏的开始时间和结束时间, 并显示游戏结果。

⑶“等级设置”模块:设置游戏的初、中、高级别, 等级信息保存于文件。初次游戏的默认等级为初级, 而下次打开游戏时默认等级为上次退出时的等级。

⑷“最佳排行”模块:显示当前等级的前五佳成绩, 不同等级的排行存放于不同文件。

⑸“游戏说明”模块:显示游戏玩法规则。

⑹“退出游戏”模块:退出游戏并显示相应信息。

3 详细设计

3.1 数据结构设计

本游戏中涉及的主要数据结构是存放玩家最高分信息的结构体, 具体如下:

3.2 程序流程

游戏从功能菜单的选择开始执行, 依据玩家的选择进行相应的处理直到退出游戏为止。程序流程图如图2所示。

3.3 函数原型及功能说明

3.3.1 选择菜单函数:void Menu ()

功能:此函数的功能是依据玩家的选择项进行相应处理, 直到玩家选择退出游戏为止, 包括开始游戏、等级设置、最佳排行、游戏说明、退出游戏等选择项。

3.3.2 初始化文件函数:void Init File ()

功能:初始化用于保存游戏历史记录的文件, 其中rank.txt用于存放游戏等级信息, top1.txt用于存放初级的历史最佳五佳记录, top2.txt和top3.txt分别用于存放中级和高级的历史最佳五佳记录。

3.3.3 开始游戏函数:void Start Game ()

功能:记录游戏的开始时间和结束时间, 条用Execute Game () 、Game Result () 等函数, 对游戏进行整体控制。

⑴产生随机数函数:void Create Number (int*cl, int digit)

功能:由系统产生不重复的digit位随机数, 其中的参数1是整型指针, 指向所产生的随机数, 参数2表示所产生随机数的位数。

⑵运行游戏函数:int Execute Game (int digit, int gnumber)

功能:执行游戏, 调用Create Number () 以产生随机数, 由玩家输入所猜测的数据, 输出猜测结果供玩家参考, 其中的参数1是所猜数字的位数, 参数2是允许猜测的次数。

3.3.4 游戏结果处理函数:void Geme Result (int tim, int digit, int number, int rank)

功能:对游戏结果进行处理。游戏不成功, 重新开始游戏或返回主菜单;游戏成功时, 根据游戏耗时和实际猜数次数, 判断是否能进入本等级的历史五佳, 若能则修改本等级的历史五佳记录, 提示玩家是否进入下一等级。其中的参数1是游戏耗时, 参数2是猜测数字的位数, 参数3是实际猜测次数, 参数4师当前游戏等级。

另外, 还应设计设置游戏等级函数Set Rank () 、输出游戏说明函数Show Explain () 、设置历史五佳函数Set Top () 、显示历史五佳函数Show Top () 等功能函数。

4 函数实现示例

下面将运行游戏函数:int Execute Game (int digit, int gnumber) 的实现简介如下:

在本函数调用Create Number () 函数产生了digit位随机数后, 执行一个循环gnumber次的for语句, 在本循环语句体中, 需要输入玩家所猜测的digit位数字, 完成猜测数和随机数的比对, 输出猜测结果A*B*, 并在猜数成功后结束猜数过程。

5 总结

在本游戏的设计完成过程中, 严格遵守结构化的程序设计思想, 广泛应用C语言的数组、指针、函数、结构体、文件等知识。通过一个实例将C语言知识进行综合运用, 对学习C语言并提高其应用能力是非常有益处的。

摘要:作为高校很多专业的入门计算机编程语言, C语言有着强大的应用能力。本文介绍了猜字游戏的从设计到C语言实现的全过程, 综合运用了C语言的各方面知识, 体现了结构化的程序设计思想, 以提高学生对C语言的认识水平。

c语言井字游戏 篇3

课题:

教学目的: 教学重点: 教学难点: 第一章 C语言概述

1、了解C语言出现的背景

2、掌握C语言程序的构成、书写格式和上机步骤 C语言程序的构成 上机操作

步骤一 引入新课

从计算机应用基础中学过的计算机语言及语言处理系统引出C语言。步骤二 讲授新课

一、C语言出现的背景

1.ALGOL60 :1960年面向问题、结构化,可读性、可移植性好,不能对硬件操作; 2.CPL:63年接近硬件,规模较大、难以应用;

3.SIMULA:1966~1967 SIMULA 66是ALGOL 60的扩充;SIMULA 67引进了“对象”和“类”等概念而成为第一个面向对象的语言;

4.BCPL :67年由CPL改制,结构化、直接处理硬件;

5.B语言:1970年贝尔实验室的Ken Thompson以BCPL语言为基础设计的,开发了第一个UNIX操作系统;

6.C语言:1972-73年间,保持了BCPL和B语言的精炼与接近硬件的优点,克服了它们过于简单、数据无类型的缺点,重写了UNIX操作系统的90%;

7.标准 C:以1978年发表的UNIX第七版中的C编译程序为基础,Brain W.Kernighan&Dennis M.Ritchie合著的《The C Programming Language》问世; 8.ANSI C:1983年美国国家标准化协会(ANSI)制定的标准

9.C++:1986年 与C兼容,保持了C的所有优点并进行了增强:增强了面向对象的机制,成为典型的面向对象和面向过程的混合语言,适用于大型系统软件和应用软件的开发;

10.87 ANSI C:1987年制定的新标准;

11.ISO C:1990年ISO接受87 ANSI C为ISO C的标准,该标准是目前C编译器的标准。

二、C语言的特点

1.语言简洁、紧凑,使用方便、灵活; 2.运算符丰富

3.数据类型多(整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类等)4.具有结构化的控制语句 5.语法不太严格,自由度大

6.既是高级语言,又具有低级语言的功能 7.生成目标代码质量高,程序执行效率 8.可移植性好

三、C语言程序的构成

1.C语言是由函数构成的,至少有一个main()函数;

2.每个函数由函数首部和函数体组成;函数体由说明语句、执行语句组成; 3.每个C程序从main()函数开始执行,并在main()中结束; 4.每个语句和数据定义的最后必须加分号;

5.C程序无输入、输出语句

输入功能由scanf()函数完成;输出功能由printf()函数完成; 6.可加注释/*……*/

借助程序实例加以说明,并提倡良好的程序设计书写风格: 1)每个语句占一行;

2)同一层次的语句从同一位置处开始书写;

3)同一层次中嵌套的结构,应从不同位置开始书写;

4)编译控制行、外部数据定义、函数定义之间空一行书写; 5)对于函数体的大括号的书写约定 6)学会使用注释。

四、上机步骤

1.进入环境c:tctc 或进入ms-dos,>cd,>cd tc,>tc 2.编辑源程序 3.保存源程序 4.编译源程序F9 5.执行程序Ctrl-F9,查看结果Alt-F5 6.退出C环境Alt-X

步骤三 课堂小结

1、C语言的构成要素,main函数在程序中的作用

2、上机操作的过程

步骤四 布置作业 上机练习:

1、进入C编辑环境,按良好的程序设计风格输入例题,按步骤编译、运行、查看结果

C语言中的复数C基础 篇4

复数比较详细的内容请参考:复数代数

C支持复数的数学计算,复数Z可以在笛卡尔坐标表示为:Z=x+y*I;其中x和y是实数,I是虚数单位,数x被称为实部,数y为虚部。在c语言中,一个复数是有浮点类型表示的实部和虚部。两部分都具有相同的类型,无论是float,double或者long double。

float _complex:实虚都为float

double _complex:实虚都为double

long double _complex:实虚都为long double

如果在c 源文件中包含了头文件 complex.h ,complex.h定义了complex 和 I宏。宏定义complex和一个关键字_complex 同义。我们可以用complex代替_complex.

下面是个简单的例子,运行在debian 7 (32bit)

代码截图:

运行结果:    详细代码:

View Code

creal(x):得到复数的实部(对于 double),如果对于float,使用crealf(x),如果对于long double ,请使用 creall(x)

cimag(x):得到复数的虚部(对于double),如果对于float,使用crealf(x),如果对于long double ,请使用 creall(x)

此外还有一点值得注意的是:

cos(), exp() 和 sqrt()同样也会有对应得复数方法,例如:ccos(),cexp(),csqrt()

本人是个初学者,如果博客中有任何错误或者有更好的技术知识,请多多指教!

c语言函数 篇5

一、实验目的(1)掌握定义函数的方法;

(2)掌握函数实参与形参的对应关系以及“值传递”的方式;

(3)掌握函数的嵌套调用和递归调用的方法;

(4)掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。

(5)学习对多文件程序的编译和运行。

二、实验内容

编程序并上机调试运行。

(1)写一个判别素数的函数,在主函数输入一个整数,输出是否是素数的信息。(习

题8.3)

本程序应当准备以下测试数据:17、34、2、1、0。分别输入数据,运行程序并检查结果是否正确。

(2)用一个函数来实现将一行字符串中最长的单词输出。此行字符串从主函数传递

给该函数。(习题8.10)

把两个函数放在同一程序文件中,作为一个文件进行编译和运行。

把两个函数分别放在两个程序文件中,作为两个文件进行编译、连接和运行。

(3)用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。

n的为数不确定,可以是任意的整数。(习题8.17)

(4)求两个整数的最大公约数和最小公倍数。用一个函数求最大公约数,用另一个

函数根据求出的最大公约数求最小公倍数。(习题8.1)

① 不用全局变量,分别用两个函数求最大公约数和最小公倍数。两个整数在主函数中输入,并传送给函数1,求出的最大公约数返回主函数,然后再与两个整数一起作为实参传递给函数2,以求出最小公倍数,再返回主函数输出最大公约数和最小公倍数。

② 用全局变量的方法,分别用两个函数求最大公约数和最小公倍数,但其值不由函数带回。将最大公约数和最小公倍数都设为全局变量,在主函数中输出它们的值。

上一篇:车险总监岗位职责下一篇:教授讲话稿