C语言实现生命游戏
生命游戏 C++源码
#include "windows.h"#include "stdio.h"#include "stdlib.h"#include "math.h"#define IDB_PUSHBUTTON1 10#define IDB_PUSHBUTTON2 11#define IDB_PUSHBUTTON3 12int dot[200][100],dot2[200][100];HBITMAP hBm;BITMAP bm;HDC hdcmem;HDC hdcc;HINSTANCE hInst;char lpszClassName1[]="BUTTON";intnCheckBoxSt;HWNDhwndPush,hwndDefPush,hwndRadio,hwndAutoRadio,hwndCheckBox,hwndAutoCheckBox,hwnd GroupBox;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){HWND hwnd;MSG Msg;WNDCLASS wndclass;char lpszClassName[]="ÉúÃü";char lpszTitle[]="ÉúÃüÓÎÏ·";wndclass.style =0;wndclass.lpfnWndProc =WndProc;wndclass.cbClsExtra =0;wndclass.cbWndExtra =0;wndclass.hInstance =hInstance;wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName =NULL;wndclass.lpszClassName =lpszClassName;if(!RegisterClass(&wndclass)){MessageBeep(0);return FALSE;}hwnd=CreateWindow(lpszClassName,lpszTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);hInst=hInstance;ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);while(GetMessage(&Msg,NULL,0,0)){TranslateMessage(&Msg);DispatchMessage(&Msg);}return Msg.wParam ;}LRESULT CALLBACK WndProc(HWND hwnd,UINTmessage,WPARAMwParam,LPARAMlParam) {int n=0,i,j;int X=10,Y=10;HDC hdc;PAINTSTRUCT ps;PAINTSTRUCT ps1;HBRUSH hb;HPEN hp;switch(message){case WM_CREATE:SetTimer(hwnd,1,100,NULL);hwndPush=CreateWindow(lpszClassName1,"״̬һ",BS_PUSHBUTTON|WS_CHILD|WS_VISI BLE,X,Y,100,25,hwnd,(HMENU)IDB_PUSHBUTTON1,hInst,NULL);hwndDefPush=CreateWindow(lpszClassName1,"״̬¶þ",BS_PUSHBUTTON|WS_CHILD|WS_ VISIBLE,X+130,Y,100,25,hwnd,(HMENU)IDB_PUSHBUTTON2,hInst,NULL);hwndDefPush=CreateWindow(lpszClassName1,"Ëæ»ú",BS_PUSHBUTTON|WS_CHILD|WS_VISIBL E,X+260,Y,100,25,hwnd,(HMENU)IDB_PUSHBUTTON3,hInst,NULL);break;case WM_COMMAND:switch (LOWORD(wParam)){case IDB_PUSHBUTTON1:for(i=0;i<200;i++){for(j=0;j<110;j++){dot2[i][j]=0;dot[i][j]=0;}}dot[1][4]=1;dot[1][5]=1;dot[2][4]=1;dot[2][5]=1;dot[11][4]=1;dot[11][5]=1;dot[11][6]=1;dot[12][3]=1;dot[12][7]=1;dot[13][2]=1;dot[13][8]=1;dot[14][2]=1;dot[14][8]=1;dot[15][5]=1;dot[16][3]=1;dot[16][7]=1;dot[17][4]=1;dot[17][5]=1;dot[17][6]=1;dot[18][5]=1;dot[21][2]=1;dot[21][3]=1;dot[21][4]=1;dot[22][2]=1;dot[22][3]=1;dot[22][4]=1;dot[23][1]=1;dot[23][5]=1;dot[25][0]=1;dot[25][1]=1;dot[25][5]=1;dot[25][6]=1;dot[35][2]=1;dot[35][3]=1;dot[36][2]=1;dot[36][3]=1;dot2[1][4]=1;dot2[1][5]=1;dot2[2][4]=1;dot2[2][5]=1;dot2[11][4]=1;dot2[11][6]=1;dot2[12][3]=1;dot2[12][7]=1;dot2[13][2]=1;dot2[13][8]=1;dot2[14][2]=1;dot2[14][8]=1;dot2[15][5]=1;dot2[16][3]=1;dot2[16][7]=1;dot2[17][4]=1;dot2[17][5]=1;dot2[17][6]=1;dot2[18][5]=1;dot2[21][2]=1;dot2[21][3]=1;dot2[21][4]=1;dot2[22][2]=1;dot2[22][3]=1;dot2[22][4]=1;dot2[23][1]=1;dot2[23][5]=1;dot2[25][0]=1;dot2[25][1]=1;dot2[25][5]=1;dot2[25][6]=1;dot2[35][2]=1;dot2[35][3]=1;dot2[36][2]=1;dot2[36][3]=1;break;case IDB_PUSHBUTTON2: for(i=0;i<200;i++){for(j=0;j<110;j++){dot2[i][j]=0;dot[i][j]=0;}}dot[1][4]=1;dot[1][5]=1;dot[2][4]=1;dot[11][4]=1;dot[11][5]=1;dot[11][6]=1;dot[12][3]=1;dot[12][7]=1;dot[13][2]=1;dot[13][8]=1;dot[14][2]=1;dot[14][8]=1;dot[15][5]=1;dot[16][3]=1;dot[16][7]=1;dot[17][4]=1;dot[17][5]=1;dot[17][6]=1;dot[18][5]=1;dot[21][2]=1;dot[21][3]=1;dot[21][4]=1;dot[22][2]=1;dot[22][3]=1;dot[22][4]=1;dot[23][1]=1;dot[23][5]=1;dot[25][0]=1;dot[25][1]=1;dot[25][5]=1;dot[25][6]=1;dot[35][2]=1;dot[35][3]=1;dot[36][2]=1;dot[36][3]=1;dot2[1][4]=1; dot2[1][5]=1;dot2[2][4]=1;dot2[2][5]=1;dot2[11][4]=1;dot2[11][5]=1;dot2[11][6]=1;dot2[12][3]=1;dot2[12][7]=1;dot2[13][2]=1;dot2[13][8]=1;dot2[14][8]=1; dot2[15][5]=1; dot2[16][3]=1; dot2[16][7]=1; dot2[17][4]=1; dot2[17][5]=1; dot2[17][6]=1; dot2[18][5]=1; dot2[21][2]=1; dot2[21][3]=1; dot2[21][4]=1; dot2[22][2]=1; dot2[22][3]=1; dot2[22][4]=1; dot2[23][1]=1; dot2[23][5]=1; dot2[25][0]=1; dot2[25][1]=1; dot2[25][5]=1; dot2[25][6]=1; dot2[35][2]=1; dot2[35][3]=1; dot2[36][2]=1; dot2[36][3]=1; dot[65][55]=1; dot[65][56]=1; dot[66][55]=1; dot[66][56]=1; dot[65][54]=1; dot[66][60]=1; dot[65][60]=1; dot[66][54]=1; dot[67][54]=1; dot[67][55]=1; dot[68][54]=1; dot[68][55]=1; dot[68][56]=1; dot2[65][55]=1; dot2[65][56]=1; dot2[66][55]=1; dot2[66][56]=1; dot2[65][54]=1; dot2[66][60]=1;dot2[66][54]=1;dot2[67][54]=1;dot2[67][55]=1;dot2[68][54]=1;dot2[68][55]=1;dot2[68][56]=1;break;case IDB_PUSHBUTTON3:int x;for(i=0;i<200;i++){for(j=0;j<110;j++){dot2[i][j]=0;dot[i][j]=0;}}for(i=0;i<200;i++){for(j=0;j<110;j++){x=rand()%100;if(x>85){dot2[i][j]=1;dot[i][j]=1;}else{dot2[i][j]=0;dot[i][j]=0;}}}break;}break;case WM_PAINT:hdc=BeginPaint(hwnd,&ps);hdcc=GetDC(hwnd);hBm=CreateCompatibleBitmap(hdcc,1000,1000);hdcmem=CreateCompatibleDC(hdcc); ReleaseDC(hwnd,hdcc);SelectObject(hdcmem,hBm);SetMapMode(hdcmem,MM_TEXT);hb=CreateSolidBrush(BLACK_BRUSH);hp=CreatePen(PS_SOLID,1,RGB(0,0,0));Rectangle(hdcmem,0,0,1000,1000);SelectObject(hdcmem,hb);SelectObject(hdcmem,hp);for(i=0;i<1000;){MoveToEx(hdcmem,i,50,NULL);LineTo(hdcmem,i,550);i=i+5;}for(i=50;i<550;){MoveToEx(hdcmem,0,i,NULL);LineTo(hdcmem,1000,i);i=i+5;}for(i=0;i<200;i++){for(j=0;j<99;j++){if(dot[i][j]==1)Rectangle(hdcmem,i*5,50+j*5,i*5+5,50+j*5+5);if(dot[i-1][j-1]==1){n=n+1;}if(dot[i-1][j]==1){n=n+1;}if(dot[i-1][j+1]==1){n=n+1;}if(dot[i][j-1]==1){n=n+1;}if(dot[i][j+1]==1){n=n+1;}if(dot[i+1][j-1]==1){n=n+1;}if(dot[i+1][j]==1){n=n+1;}if(dot[i+1][j+1]==1){n=n+1;}if(n>=4)dot2[i][j]=0;if(n<=1)dot2[i][j]=0;if(n==3)dot2[i][j]=1;n=0;}}BitBlt(hdc,0,0,1000,1000,hdcmem,0,0,SRCCOPY); DeleteObject(hdcmem);DeleteObject(hBm);DeleteObject(hb);DeleteObject(hp);EndPaint(hwnd,&ps);break;case WM_TIMER:InvalidateRect(hwnd,NULL,0);for(i=0;i<200;i++)for(j=0;j<110;j++)dot[i][j]=dot2[i][j];break;case WM_DESTROY:PostQuitMessage(0);KillTimer(hwnd,1);break;default:return DefWindowProc(hwnd,message,wParam,lParam);}return 0;}。
生命游戏c语言源代码
生命游戏c语言源代码#include#include#define hs 10 //这能改行数#define ls 10 //这能改列数#define tiaojian1 2 //这里可改周围几个细胞时存活#define tiaojian2 3 //这里可改周围几个细胞时繁殖int world[hs][ls];void shuru(int[hs][ls]); //为数组赋初始值void shuchu(int[hs][ls]); //提供输出int huanjin(int,int); //计算周围细胞数void jisuanweilai(int[hs][ls]); //计算未来void chashou(int[hs][ls]); //运行后插手杀死或复活某些细胞int main(void){printf("生命游戏\n");printf("默认世界大小10*10,世界大小及规则代码定义中可改\n");printf("输入需要添加细胞的点的坐标,添加完成后输入一组负数坐标即可终止输入\n");int i,j;for(i=0;i<hs;i++)for(j=0;j<ls;j++)world[i][j]=0; //1为生0为死归零shuchu(world);shuru(world);shuchu(world);system("pause");while(1){char i;jisuanweilai(world);shuchu(world);printf("继续按回车,插手按a,终止按b\n"); i=getchar();if(i=='\n') ;else if(i=='a'){chashou(world);shuchu(world);system("pause");}else break;}system("pause");return 0;}void shuru(int world[hs][ls]){int i,j;while(1){scanf("%d%d",&i,&j);if(i<0||j<0) break; //任意为负终止输入else if(i>=hs||j>=ls){printf("输入数据超范围\n"); }world[i][j]=1; //1为生0为死}}void shuchu(int world[hs][ls]) {int i,j,k=0;for(i=0;i{printf(" %d",i);}printf("\n");printf(" ┌"); //第二行for(i=0;i<ls-1;i++){printf("─┬");}printf("─┐\n");for(i=0;i{printf("%d│",i);for(j=0;j<ls;j++){if(world[i][j]==1){printf("●│");k++;}else printf("○│");}printf("\n");if(i==hs-1) break;printf(" ├");for(j=0;j<ls-1;j++){printf("─┼");}printf("─┤\n");}printf(" └");for(i=0;i<ls-1;i++)printf("─┴");printf("─┘\n");printf(" 现有%d个存活细胞\n",k); }int huanjin(int h,int l){int sum=0,i,j;for(i=h-1;i<=h+1;i++){for(j=l-1;j<=l+1;j++){if(i<0||i>=hs)continue;if(j<0||j>=ls)continue;if(i==h&&j==l)continue;if(world[i][j]==1)sum++;}</ls-1;i++)</ls-1;j++)</ls;j++)</ls-1;i++)</ls;j++)</hs;i++)}return sum;}void jisuanweilai(int world[hs][ls]) {int i,j,k;for(i=0;i<hs;i++){for(j=0;j<ls;j++){k=huanjin(i,j);switch(k){case tiaojian1: break;case tiaojian2: world[i][j]=1;break; default : world[i][j]=0;break;}}}void chashou(int world[hs][ls]){int i,j;printf("加入要复活的细胞坐标,添加完成后输入一组负数坐标即可终止输入\n");while(1){scanf("%d%d",&i,&j);if(i<0||j<0) break; //任意为负终止输入else if(i>=hs||j>=ls){printf("输入数据超范围\n");}world[i][j]=1; //1为生0为死}printf("加入要杀死的细胞坐标,添加完成后输入一组负数坐标即可终止输入\n");while(1){scanf("%d%d",&i,&j);if(i<0||j<0) break; //任意为负终止输入else if(i>=hs||j>=ls){printf("输入数据超范围\n");}world[i][j]=0; //1为生0为死}</ls;j++) </hs;i++)。
生命游戏c++程序
生命游戏c++程序// 生命游戏.cpp : Defines the class behaviors for the application.//#include "stdafx.h"#include "生命游戏.h"#include "MainFrm.h"#include "生命游戏Doc.h"#include "生命游戏View.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////// //////////// CMyAppBEGIN_MESSAGE_MAP(CMyApp, CWinApp)//{{AFX_MSG_MAP(CMyApp)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard file based document commandsON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////// //////////// CMyApp constructionCMyApp::CMyApp(){// TODO: add construction code here,// Place all significant initialization in InitInstance}/////////////////////////////////////////////////////////////////// //////////// The one and only CMyApp objectCMyApp theApp;/////////////////////////////////////////////////////////////////// //////////// CMyApp initializationBOOL CMyApp::InitInstance(){AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL #elseEnable3dControlsStatic(); // Call this when linking to MFC statically#endif// Change the registry key under which our settings are stored.// TODO: You should modify this string to be something appropriate// such as the name of your company or organization.SetRegistryKey(_T("Local AppWizard-Generated Applications"));LoadStdProfileSettings(); // Load standard INI file options (including MRU)// Register the application's document templates. Document templates// serve as the connection between documents, frame windows and views.CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CMyView));AddDocTemplate(pDocTemplate);// Parse command line for standard shell commands, DDE, file openCCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);// Dispatch commands specified on the command lineif (!ProcessShellCommand(cmdInfo))return FALSE;m_pMainWnd->MoveWindow(0,0,630,730,true);// The one and only window has been initialized, so show and update it.m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;}/////////////////////////////////////////////////////////////////// //////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)// No message handlers//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()// App command to run the dialogvoid CMyApp::OnAppAbout(){CAboutDlg aboutDlg;aboutDlg.DoModal();}/////////////////////////////////////////////////////////////////// ////////// // CMyApp message handlers。
生命游戏源代码
// game of life.cpp//function head#include <stdio.h>(standard input &output输入输出)#include <stdlib.h>(定义杂项函数及内存分配函数)#include <windows.h>(对话框程序或者窗口程序)#include <time.h>(从系统时钟获取时间方式)#include <ctype.h>(字符函数)//define the size of the two-dimensional array(定义大小的二维数组)#define SIZE 40void rule(int array[SIZE][SIZE]);//function prototype(函数原型)void SetColor(unsigned short ForeColor=5,unsigned short BackGroundColor=2) //change color(改变颜色){HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hCon,ForeColor|BackGroundColor); }int main(){int data[SIZE][SIZE]={0};//0->virus(病毒)1->cell(细胞)2->boundary(边界)int i,j,instruct;srand(time(NULL));//use the current time to seed the random number generator(使用当前时间种子的随机数发生器)for(i=0;i<=SIZE-1;i++){for(j=0;j<=SIZE-1;j++){if(i*j==0||i==SIZE-1||j==SIZE-1){data[i][j]=22;}//end if(如果结束)elsedata[i][j]=11*(rand()%2);}//end for(结束)}//end forsystem("mode con cols=100 & color 0f");//to set the size and the color of the window (设置大小和颜色的窗口)//input a random number except 0 to continue the game (输入一个随机数除0继续游戏)while(scanf("%d",&instruct)!=0){system("cls");//clear the screenfor(i=0;i<=SIZE-1;i++){for(j=0;j<=SIZE-1;j++){if(data[i][j]%10==1){SetColor(10);//function call(函数的调用)printf("%c ",6);//display the character(显示字符)}else if(data[i][j]%10==0){SetColor(6);//function call(函数的调用)printf("%c ",4);//display the character(显示字符)}else{SetColor(3);//function call(函数的调用)printf("%c ",3);//display the character (显示字符)}if(i*j==0||i==SIZE-1||j==SIZE-1){;}elsedata[i][j]=(data[i][j]%10)*10;}printf("\n");}rule(data);//function call(函数的调用)printf("请输入1继续0结束\n");}//end while(结束时)return 0;}void rule(int array[SIZE][SIZE]){int amount,i,j,k,l;for(i=1;i<=SIZE-2;i++){for(j=1;j<=SIZE-2;j++){amount=0;for(k=i-1;k<=i+1;k++){for(l=j-1;l<=j+1;l++){if(array[k][l]/10==1&&(k!=i||l!=j)){amount++;}//end if(如果结束)}//end for(结束)}//end for//** the rule of the game of life(游戏的规则生活)if(amount==3){array[i][j]++;}else if(amount==2){array[i][j]+=array[i][j]/10;}else;}//end for}//end for}。
C#生命游戏控制台程序
生命游戏又称细胞自动机。
反映了生命演化的规则。
生命游戏原理:生命生活在二维环境中,每个生命生活在一个方格中,每个细胞在下一个时刻的状态取决于周围8个细胞的活着或死了的状态。
1) 如果周围活着的细胞数量少于设定的值,细胞将孤独而死。
2) 如果周围活着的细胞数量多于设定的值,细胞将拥挤而死。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Demo03{class Program{static void Main(string[] args){CLifeGame g1 = new CLifeGame();Console.WriteLine("游戏初始化:");Console.WriteLine();g1.Initial();g1.Run();Console.WriteLine();Console.Write("是否继续(Y or N):");string i = Console.ReadLine();while (i == "y" || i == "Y"){Console.WriteLine();g1.Run();Console.WriteLine();Console.Write("是否继续(Y or N):");i = Console.ReadLine();}Console.WriteLine();Console.Write("游戏中止!");}}}using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Demo03{class CLifeGame{int[,] struArr = new int[10, 10];int[,] struArr2 = new int[10, 10];Random rad = new Random();public void Initial(){for (int i = 0; i < 10; i++)for (int j = 0; j < 10; j++){int a = rad.Next(0, 2);struArr[i, j] = a;struArr2[i, j] = struArr[i, j];}}public void Run(){for (int i = 0; i < 10; i++)for (int j = 0; j < 10; j++){int count = 0;if (i == 0){if (j == 0){if (struArr[i, j + 1] == 1) { count++; }if (struArr[i + 1, j] == 1) { count++; }if (struArr[i + 1, j + 1] == 1) { count++; }}else if (j == 9){if (struArr[i, j - 1] == 1) { count++; }if (struArr[i + 1, j] == 1) { count++; }if (struArr[i + 1, j - 1] == 1) { count++; }}else{if (struArr[i, j - 1] == 1) { count++; }if (struArr[i, j + 1] == 1) { count++; }if (struArr[i + 1, j] == 1) { count++; }if (struArr[i + 1, j + 1] == 1) { count++; }if (struArr[i + 1, j - 1] == 1) { count++; }}}else if (i == 9){if (j == 0){if (struArr[i, j + 1] == 1) { count++; }if (struArr[i - 1, j] == 1) { count++; }if (struArr[i - 1, j + 1] == 1) { count++; }}else if (j == 9){if (struArr[i, j - 1] == 1) { count++; }if (struArr[i - 1, j] == 1) { count++; }if (struArr[i - 1, j - 1] == 1) { count++; } }else{if (struArr[i, j - 1] == 1) { count++; }if (struArr[i, j + 1] == 1) { count++; }if (struArr[i - 1, j] == 1) { count++; }if (struArr[i - 1, j + 1] == 1) { count++; }if (struArr[i - 1, j - 1] == 1) { count++; } }}else if (j == 0){if (struArr[i - 1, j] == 1) { count++; }if (struArr[i - 1, j + 1] == 1) { count++; }if (struArr[i, j + 1] == 1) { count++; }if (struArr[i + 1, j + 1] == 1) { count++; }if (struArr[i + 1, j] == 1) { count++; }}else if (j == 9){if (struArr[i - 1, j] == 1) { count++; }if (struArr[i - 1, j - 1] == 1) { count++; }if (struArr[i, j - 1] == 1) { count++; }if (struArr[i + 1, j - 1] == 1) { count++; }if (struArr[i + 1, j] == 1) { count++; }}else{if (struArr[i - 1, j - 1] == 1) { count++; }if (struArr[i - 1, j] == 1) { count++; }if (struArr[i - 1, j + 1] == 1) { count++; }if (struArr[i, j - 1] == 1) { count++; }if (struArr[i, j + 1] == 1) { count++; }if (struArr[i + 1, j - 1] == 1) { count++; }if (struArr[i + 1, j] == 1) { count++; }if (struArr[i + 1, j + 1] == 1) { count++; }}switch (count){case 3:struArr2[i, j] = 1;break;case 2:if (struArr[i, j] == 1){ struArr2[i, j] = 1; }break;default:struArr2[i, j] = 0;break;}}for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){if (struArr[i, j] == 1) Console.Write("1");if (struArr[i, j] == 0) Console.Write("0");}Console.WriteLine();}for (int i = 0; i < 10; i++)for (int j = 0; j < 10; j++)struArr[i, j] = struArr2[i, j];}}}。
生命游戏-JAVA语言代码-细胞自动机-毕业论文
生命游戏-JAVA语言代码-细胞自动机-毕业论文浙江理工大学毕业论文(设计)诚信声明我谨在此保证:本人所写的毕业论文(设计),凡引用他人的研究成果均已在参考文献或注释中列出。
论文(设计)主体均由本人独立完成,没有抄袭、剽窃他人已经发表或未发表的研究成果行为。
如出现以上违反知识产权的情况,本人愿意承担相应的责任。
声明人(签名):年月日摘要本文利用Java 作为编程语言,Java swing编写图形界面实现了生命游戏的可视化编程,并且在生命游戏的基础上进行了一定的扩展,增加了系统复杂性,给定了简单的初始状态以此进一步研究细胞自动机在复杂系统中所表现的能力,为细胞自动机及生命游戏的后续研究奠定基础。
结论:计算机实现的细胞自动机在计算机模拟的复杂系统中确实拥有复杂系统所表现出来的自适应性,不确定性等特性关键词:生命游戏;细胞自动机;复杂系统ABSTRACTUsing Java as a programming language, Java Swing as graphical interface to achieve a visual programming of the Game of Life. Expand the basis of the game of life, increased system complexity, given the simple initial state in order to further studythe demonstrated ability of cellular automata in a complex system, lay the foundation for the follow-up study of cellular automata and the Game of Life. Conclusion:The computer-implemented cellular automaton computer simulation of complex systems do have complex systems demonstrated by the self-adaptive, uncertainties and other characteristicsKeywords: Game of Life; Cellular Automata;Complex System目录摘要Abstract第一章绪论 ..................................................................... .........................................................1 1.1引言 ..................................................................... ..................................................................1 1.2生命游戏 ..................................................................... ..........................................................2 1.2.1什么是生命游戏 ..................................................................... ..........................................2 1.2.2生命游戏、细胞自动机的研究意义 ..................................................................... ............2 第二章细胞自动机、生命游戏与复杂系统 ..................................................................... .3 2.1复杂系统 ...............................................................................................................................3 2.2细胞自动机...................................................................... ......................................................4 第三章我的生命游戏的实现 ..................................................................... ...........................4 3.1 我的生命游戏与传统生命游戏的区别 ..................................................................... ............4 3.1.1传统生命游戏 ..................................................................... ..............................................4 3.1.2我的生命游戏 ..................................................................... ..............................................4 3.2 基本思想 ..................................................................... .........................................................5 3.3 基本概念 ..................................................................... ...........................................................6 3.3.1系统基本概念 ..................................................................... ..............................................6 3.3.2个体基本属性 ..................................................................... ..............................................7 3.3.3环境基本定义 ..................................................................... ..............................................7 3.4 程序主流程...........................................................................................................................8 3.5 核心算法介绍 ..................................................................... ..................................................9 3.6 生物个体方法 ..................................................................... ................................................ 10 3.6.1生长 ..................................................................... ........................................................... 10 3.6.2获取竞争力,竞争力基于个体所处环境, ....................................................................10 3.6.3繁殖,变异,进化, ................................................................... ................................... 10 3.6.4获取所需食物量 ..................................................................... ........................................ 11 3.7 环境规则 ..................................................................... . (11)3.8 关键参数设置 ..................................................................... ................................................ 11 3.9 预测结果及理论分析 ..................................................................... .................................... 12 3.10 运行结果及结论分析...................................................................... . (13).................................................................... ....................................... 17 3.11 本文尚未完成部分致谢 ..................................................................... ................................................................ 19 参考文献 ..................................................................... .. (20)浙江理工大学本科毕业设计(论文)第一章绪论1.1引言系统是由相互关联,相互制约,相互作用的部分所组成的具有某种功能的有机整体。
约瑟夫生死游戏(C )数据结构实现
题目二:约瑟夫生者死者游戏(链表存储)一:【内容与要求】约瑟夫游戏的大意是:每30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半的旅客投入还中,其余人才能幸免遇难。
无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人数起,依次报数,数到第9人,便把他投入大海中,然后再从他的下一个人数起,数到第9人,再将他扔进大海中,如此循环地进行,直到剩下15个乘客为止。
问哪些位置是将被扔下大海的位置。
二:概要设计利用链表循环来解决。
首先,就必须先定义一个链表,按照所需要的长度进行定义,然后令其为指针指向头指针,即完成了一个循环链表的创建。
接下来先打印链表输出。
其次,就是算法实现,需要利用指针来进行,数据域标记人员编号,先用一个指针循环查找,找到第一个需要删除的人,标记为1,先输出节点数,再进行删除。
依次循环查找,直到被删除的节点数量为总人数的一半的时候则结束。
三:程序执行流程图三:详细代码结构1.链表的创建(1)创建头节点Josephring(){head=new Node;//为头结点申请空间head->no=1;//为数据域赋值head->next=head;//形成循环链表}(2) 循环插入链表void Josephring::CreateJosephus(int n) {Node*s=head;//标记头结点totalnum=n;for(int i=2;i<=n;i++){ Node*w=new Node;//新建一个节点w->no=i;w->next=head;s->next=w;s=w;//S作为尾指针}}首先申请一个节点,并且W指针指向它,然后从2开始赋值,此时先令新节点的W指针指向头结点,再令S指针指向它,依次循环插入创建。
2.打印输出链表void Josephring::show(){cout<<head->no<<"\t";//先输出头节点Node*q=head->next;while(q!=head){cout<<q->no<<"\t";q=q->next;}}先打印输出头结点,然后循环判定,将不等于头结点的全部输出。
过河死代码c语言
过河死代码c语言在C语言中,我们可以创建一个模拟程序来模拟"过河死"的场景。
这个程序将模拟一个人试图过河,但是如果他遇到危险,他就会"死"。
以下是一个简单的C语言代码示例:```cinclude <>int main() {int river_crossing = 0; // 初始状态为0,表示人不在河的任何一边int is_danger = 0; // 初始状态为0,表示没有危险printf("开始过河...\n");while (1) { // 无限循环,直到遇到危险或成功过河if (river_crossing == 0 && is_danger == 0) { // 如果人不在河的任何一边,并且没有危险river_crossing = 1; // 人开始过河printf("正在过河...\n");} else if (river_crossing == 1 && is_danger == 0) { // 如果人在河的另一边,并且没有危险printf("成功过河!\n");break; // 跳出循环,表示成功过河} else if (river_crossing == 0 && is_danger == 1) { // 如果人还在河的一边,但是有危险printf("遇到危险,游戏结束!\n");break; // 跳出循环,表示游戏结束} else if (river_crossing == 1 && is_danger == 1) { // 如果人在河的另一边,但是有危险printf("在河的另一边也有危险,游戏结束!\n");break; // 跳出循环,表示游戏结束}}return 0;}```在这个程序中,`river_crossing`变量表示人是否在河的一边或另一边,`is_danger`变量表示是否遇到危险。
《C语言课程设计与游戏开发实践课程》1-3章总结
《C语⾔课程设计与游戏开发实践课程》1-3章总结⽬录:⼀、知识点归纳第⼆章知识点第三章⽣命游戏思考题⼆、代码实践2.1飞机⼤战 2.2反弹⼩球 2.3flappying bird 3.1⽣命游戏⼀、知识点归纳1//第⼀章2 system("cls"); // 清屏函数34 Sleep(50); // 等待若⼲毫秒56if(kbhit()) // 判断是否有输⼊7 {8 input = getch(); // 不必输⼊回车9 }1//第⼆章23//飞机游戏4//解决画⾯闪烁严重5 #include <windows.h>6void gotoxy(int x,int y) //光标移动到(x,y)位置7 {8 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);9 COORD pos;10 pos.X = x;11 pos.Y = y;12 SetConsoleCursorPosition(handle,pos);13 }1415void show() // 显⽰画⾯16 {17 gotoxy(0,0); // 光标移动到原点位置,以下重画清屏18 }19202122//解决光标闪烁严重23void HideCursor() // ⽤于隐藏光标24 {25 CONSOLE_CURSOR_INFO cursor_info = {1, 0}; // 第⼆个值为0表⽰隐藏光标26 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);27 }2829void startup() // 数据初始化30 {31 HideCursor(); // 隐藏光标32 }3334//增加esc键游戏暂停35if(input==27)3637 system("pause");383940//2.2反弹球411//开头加,因为kbhit()报4996错422#pragma warning(disable:4996);3 #include <cwindow.h>需要改成#include <windows.h>判断接触障碍物43if ( (ball_y>=left) && (ball_y<=right) ) // 被挡板挡住44未接触45if ((bird_x >= bar1_xDown) && (bird_x <= bar1_xTop)) //⼩鸟通过障碍4647⽣成⼀个范围内的随机数48 block_y = rand()%width; // 产⽣范围内的新的⽅块49502.3 flappy bird5152障碍物循环出现53if (bar1_y <= 0) // 再新⽣成⼀个障碍物55 bar1_y = width;//从最右边移动56int temp = rand() % int(high * 0.8);//画⾯内随机⼀个缝隙57 bar1_xDown = temp - high / 10;//缝隙点上下留high/1058 bar1_xTop = temp + high / 10;59 }1第三章233.1⽣命游戏⼜称细胞⾃动机、康威⽣命游戏4规则:以格⼦内是否存活,与周围8个格⼦有关,3个⽣为⽣,2个为⽣死不明,1个为死5简单的就上下左右加⼀遍判断6 NeibourNumber = cells[i-1][j-1] + cells[i-1][j] + cells[i-1][j+1]+ cells[i][j-1] + cells[i][j+1] + cells[i+1][j-1] + cells[i+1][j] + cells[i+1][j+1];思考题:(⽐较有趣)尝试修改规则,⽐如初始化不同的数据,或者3,2的时候都增加;增加另⼀个物种,⾷⾁动物、⾷草动物,互相抑制;增加不同地形,⽐如某块区域有⽔源,⽣命更容易⽣存;交互投⾷,按+加速、按-减速;模拟⽣态进化、还有模拟⼤⽓污染、谣⾔传播等等。
(完整word版)约瑟夫生死游戏(C )数据结构实现
Node*s=head;//标记头结点
totalnum=n;
for(int i=2;i<=n;i++)
{Node*w=new Node;//新建一个节点
w->no=i;
w->next=head;
s->next=w;
s=w;//S作为尾指针
}
}
首先申请一个节点,并且W指针指向它,然后从2开始赋值,此时先令新节点的W指针指向头结点,再令S指针指向它,依次循环插入创建。
3.程序主算法
void Josephring::Joseph(int k,int m)//从第k个人开始数数,数到m的人出列
{
Node*p=head;//工作指针
int j=1;//计数器
while(j!=k)
{
j++;
p=p->next;//指针后移
}//找到第k个人开始数1的那个人
for(int i=1;i<=totalnum/2;i++)
}
}
首先,先要找到第一个报数人的位置,用一个计数器进行循环对比查找,从第一个位置起依次后移一个位置,直到输入的数值等于链表上的某个位置数据域上的数值时,停止查找并且标记为P指针。
其次,从P位置开始,再用一个W指针标记,两个指针一次后移循环查找,当W指针指向的数据域等于所输入的报数间隔M时,则打印输出该节点上的数据,并且删除该节点,P指针后移,作为下一次开始数的起始位置。
最后,依次循环打印输出,知道人数为总人数的一半时候,程序停止。
四:运行结果图如下
1.输出船上的总人数
2.输入报数的起始位置
3.输入报数人的间隔之后便是最终界面
C语言游戏代码(里面揽括扫雷_俄罗斯方块_推箱子_五子棋_贪吃蛇)
五子棋#include <stdio.h>#include <bios.h>#include <ctype.h>#include <conio.h>#include <dos.h>#define CROSSRU 0xbf /*右上角点*/#define CROSSLU 0xda /*左上角点*/#define CROSSLD 0xc0 /*左下角点*/#define CROSSRD 0xd9 /*右下角点*/#define CROSSL 0xc3 /*左边*/#define CROSSR 0xb4 /*右边*/#define CROSSU 0xc2 /*上边*/#define CROSSD 0xc1 /*下边*/#define CROSS 0xc5 /*十字交叉点*//*定义棋盘左上角点在屏幕上的位置*/#define MAPXOFT 5#define MAPYOFT 2/*定义1号玩家的操作键键码*/#define PLAY1UP 0x1157/*上移--'W'*/#define PLAY1DOWN 0x1f53/*下移--'S'*/#define PLAY1LEFT 0x1e41/*左移--'A'*/#define PLAY1RIGHT 0x2044/*右移--'D'*/#define PLAY1DO 0x3920/*落子--空格键*//*定义2号玩家的操作键键码*/#define PLAY2UP 0x4800/*上移--方向键up*/#define PLAY2DOWN 0x5000/*下移--方向键down*/ #define PLAY2LEFT 0x4b00/*左移--方向键left*/#define PLAY2RIGHT 0x4d00/*右移--方向键right*/ #define PLAY2DO 0x1c0d/*落子--回车键Enter*//*若想在游戏中途退出, 可按Esc 键*/#define ESCAPE 0x011b/*定义棋盘上交叉点的状态, 即该点有无棋子*//*若有棋子, 还应能指出是哪个玩家的棋子*/#define CHESSNULL 0 /*没有棋子*/#define CHESS1 'O'/*一号玩家的棋子*/#define CHESS2 'X'/*二号玩家的棋子*//*定义按键类别*/#define KEYEXIT 0/*退出键*/#define KEYFALLCHESS 1/*落子键*/#define KEYMOVECURSOR 2/*光标移动键*/#define KEYINV ALID 3/*无效键*//*定义符号常量: 真, 假--- 真为1, 假为0 */#define TRUE 1#define FALSE 0/**********************************************************/ /* 定义数据结构*//*棋盘交叉点坐标的数据结构*/struct point{int x,y;};/**********************************************************/ /*自定义函数原型说明*/void Init(void);int GetKey(void);int CheckKey(int press);int ChangeOrder(void);int ChessGo(int Order,struct point Cursor);void DoError(void);void DoOK(void);void DoWin(int Order);void MoveCursor(int Order,int press);void DrawCross(int x,int y);void DrawMap(void);int JudgeWin(int Order,struct point Cursor);int JudgeWinLine(int Order,struct point Cursor,int direction);void ShowOrderMsg(int Order);void EndGame(void);/**********************************************************//**********************************************************/ /* 定义全局变量*/int gPlayOrder; /*指示当前行棋方*/struct point gCursor; /*光标在棋盘上的位置*/char gChessBoard[19][19];/*用于记录棋盘上各点的状态*//**********************************************************//**********************************************************/ /*主函数*/void main(){int press;int bOutWhile=FALSE;/*退出循环标志*/printf("Welcome ");Init();/*初始化图象,数据*/while(1){press=GetKey();/*获取用户的按键值*/switch(CheckKey(press))/*判断按键类别*/{/*是退出键*/case KEYEXIT:clrscr();/*清屏*/bOutWhile = TRUE;break;/*是落子键*/case KEYFALLCHESS:if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/DoError();/*落子错误*/else{DoOK();/*落子正确*//*如果当前行棋方赢棋*/if(JudgeWin(gPlayOrder,gCursor)==TRUE){DoWin(gPlayOrder);bOutWhile = TRUE;/*退出循环标志置为真*/}/*否则*/else/*交换行棋方*/ChangeOrder();ShowOrderMsg(gPlayOrder);}break;/*是光标移动键*/case KEYMOVECURSOR:MoveCursor(gPlayOrder,press);break;/*是无效键*/case KEYINV ALID:break;}if(bOutWhile==TRUE)break;}/*游戏结束*/EndGame();}/**********************************************************//*界面初始化,数据初始化*/void Init(void){int i,j;char *Msg[]={"Player1 key:"," UP----w"," DOWN--s"," LEFT--a"," RIGHT-d"," DO----space","","Player2 key:"," UP----up"," DOWN--down"," LEFT--left"," RIGHT-right"," DO----ENTER","","exit game:"," ESC",NULL,/* 先手方为1号玩家*/gPlayOrder = CHESS1;/* 棋盘数据清零, 即棋盘上各点开始的时候都没有棋子*/ for(i=0;i<19;i++)for(j=0;j<19;j++)gChessBoard[i][j]=CHESSNULL;/*光标初始位置*/gCursor.x=gCursor.y=0;/*画棋盘*/textmode(C40);DrawMap();/*显示操作键说明*/i=0;textcolor(BROWN);while(Msg[i]!=NULL){gotoxy(25,3+i);cputs(Msg[i]);i++;}/*显示当前行棋方*/ShowOrderMsg(gPlayOrder);/*光标移至棋盘的左上角点处*/gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);}/*画棋盘*/void DrawMap(void){int i,j;clrscr();for(i=0;i<19;i++)for(j=0;j<19;j++)DrawCross(i,j);}/*画棋盘上的交叉点*/void DrawCross(int x,int y){gotoxy(x+MAPXOFT,y+MAPYOFT); /*交叉点上是一号玩家的棋子*/if(gChessBoard[x][y]==CHESS1) {textcolor(LIGHTBLUE);putch(CHESS1);return;}/*交叉点上是二号玩家的棋子*/if(gChessBoard[x][y]==CHESS2) {textcolor(LIGHTBLUE);putch(CHESS2);return;}textcolor(GREEN);/*左上角交叉点*/if(x==0&&y==0){putch(CROSSLU);return;}/*左下角交叉点*/if(x==0&&y==18){putch(CROSSLD);return;}/*右上角交叉点*/if(x==18&&y==0){putch(CROSSRU);return;}/*右下角交叉点*/if(x==18&&y==18){putch(CROSSRD); return;}/*左边界交叉点*/if(x==0){putch(CROSSL); return;}/*右边界交叉点*/if(x==18){putch(CROSSR); return;}/*上边界交叉点*/if(y==0){putch(CROSSU); return;}/*下边界交叉点*/if(y==18){putch(CROSSD); return;}/*棋盘中间的交叉点*/ putch(CROSS);}/*交换行棋方*/int ChangeOrder(void) {if(gPlayOrder==CHESS1) gPlayOrder=CHESS2; elsegPlayOrder=CHESS1;return(gPlayOrder);}/*获取按键值*/int GetKey(void){char lowbyte;int press;while (bioskey(1) == 0);/*如果用户没有按键,空循环*/press=bioskey(0);lowbyte=press&0xff;press=press&0xff00 + toupper(lowbyte); return(press);}/*落子错误处理*/void DoError(void){sound(1200);delay(50);nosound();}/*赢棋处理*/void DoWin(int Order){sound(1500);delay(100);sound(0); delay(50);sound(800); delay(100);sound(0); delay(50);sound(1500);delay(100);sound(0); delay(50);sound(800); delay(100);sound(0); delay(50);nosound();textcolor(RED+BLINK);gotoxy(25,20);if(Order==CHESS1)cputs("PLAYER1 WIN!");elsecputs("PLAYER2 WIN!");gotoxy(25,21);cputs(" \\<^+^>/");getch();}/*走棋*/int ChessGo(int Order,struct point Cursor){/*判断交叉点上有无棋子*/if(gChessBoard[Cursor.x][Cursor.y]==CHESSNULL){/*若没有棋子, 则可以落子*/gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT); textcolor(LIGHTBLUE);putch(Order);gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT); gChessBoard[Cursor.x][Cursor.y]=Order;return TRUE;}elsereturn FALSE;}/*判断当前行棋方落子后是否赢棋*/int JudgeWin(int Order,struct point Cursor){int i;for(i=0;i<4;i++)/*判断在指定方向上是否有连续5个行棋方的棋子*/if(JudgeWinLine(Order,Cursor,i))return TRUE;return FALSE;}/*判断在指定方向上是否有连续5个行棋方的棋子*/int JudgeWinLine(int Order,struct point Cursor,int direction) {int i;struct point pos,dpos;const int testnum = 5;int count;switch(direction){case 0:/*在水平方向*/pos.x=Cursor.x-(testnum-1);pos.y=Cursor.y;dpos.x=1;dpos.y=0;break;case 1:/*在垂直方向*/pos.x=Cursor.x;pos.y=Cursor.y-(testnum-1);dpos.x=0;dpos.y=1;break;case 2:/*在左下至右上的斜方向*/pos.x=Cursor.x-(testnum-1);pos.y=Cursor.y+(testnum-1);dpos.x=1;dpos.y=-1;break;case 3:/*在左上至右下的斜方向*/pos.x=Cursor.x-(testnum-1);pos.y=Cursor.y-(testnum-1);dpos.x=1;dpos.y=1;break;}count=0;for(i=0;i<testnum*2+1;i++)/*????????i<testnum*2-1*/ {if(pos.x>=0&&pos.x<=18&&pos.y>=0&&pos.y<=18) {if(gChessBoard[pos.x][pos.y]==Order){count++;if(count>=testnum)return TRUE;}elsecount=0;}pos.x+=dpos.x;pos.y+=dpos.y;}return FALSE;}/*移动光标*/void MoveCursor(int Order,int press) {switch(press){case PLAY1UP:if(Order==CHESS1&&gCursor.y>0) gCursor.y--;break;case PLAY1DOWN:if(Order==CHESS1&&gCursor.y<18) gCursor.y++;break;case PLAY1LEFT:if(Order==CHESS1&&gCursor.x>0) gCursor.x--;break;case PLAY1RIGHT:if(Order==CHESS1&&gCursor.x<18) gCursor.x++;break;case PLAY2UP:if(Order==CHESS2&&gCursor.y>0) gCursor.y--;break;case PLAY2DOWN:if(Order==CHESS2&&gCursor.y<18) gCursor.y++;break;case PLAY2LEFT:if(Order==CHESS2&&gCursor.x>0) gCursor.x--;break;case PLAY2RIGHT:if(Order==CHESS2&&gCursor.x<18) gCursor.x++;break;}gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT); }/*游戏结束处理*/void EndGame(void){textmode(C80);}/*显示当前行棋方*/void ShowOrderMsg(int Order){gotoxy(6,MAPYOFT+20);textcolor(LIGHTRED);if(Order==CHESS1)cputs("Player1 go!");elsecputs("Player2 go!");gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT); }/*落子正确处理*/void DoOK(void){sound(500);delay(70);sound(600);delay(50);sound(1000);delay(100);nosound();}/*检查用户的按键类别*/int CheckKey(int press){if(press==ESCAPE)return KEYEXIT;/*是退出键*/elseif( ( press==PLAY1DO && gPlayOrder==CHESS1) || ( press==PLAY2DO && gPlayOrder==CHESS2))return KEYFALLCHESS;/*是落子键*/elseif( press==PLAY1UP || press==PLAY1DOWN || press==PLAY1LEFT || press==PLAY1RIGHT || press==PLAY2UP || press==PLAY2DOWN ||press==PLAY2LEFT || press==PLAY2RIGHT)return KEYMOVECURSOR;/*是光标移动键*/elsereturn KEYINV ALID;/*按键无效*/}贪吃蛇#define N 200#include <graphics.h>#include <stdlib.h>#include <dos.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bint i,key;int score=0;/*得分*/int gamespeed=50000;/*游戏速度自己调整*/ struct Food{int x;/*食物的横坐标*/int y;/*食物的纵坐标*/int yes;/*判断是否要出现食物的变量*/ }food;/*食物的结构体*/struct Snake{int x[N];int y[N];int node;/*蛇的节数*/int direction;/*蛇移动方向*/int life;/* 蛇的生命,0活着,1死亡*/}snake;void Init(void);/*图形驱动*/void Close(void);/*图形结束*/void DrawK(void);/*开始画面*/void GameOver(void);/*结束游戏*/void GamePlay(void);/*玩游戏具体过程*/void PrScore(void);/*输出成绩*//*主函数*/void main(void){Init();/*图形驱动*/DrawK();/*开始画面*/GamePlay();/*玩游戏具体过程*/Close();/*图形结束*/}/*图形驱动*/void Init(void){int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc");cleardevice();}/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawK(void){/*setbkcolor(LIGHTGREEN);*/setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/for(i=50;i<=600;i+=10)/*画围墙*/{rectangle(i,40,i+10,49); /*上边*/rectangle(i,451,i+10,460);/*下边*/}for(i=40;i<=450;i+=10){rectangle(50,i,59,i+10); /*左边*/rectangle(601,i,610,i+10);/*右边*/}}/*玩游戏具体过程*/void GamePlay(void){randomize();/*随机数发生器*/food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/snake.life=0;/*活着*/snake.direction=1;/*方向往右*/snake.x[0]=100;snake.y[0]=100;/*蛇头*/snake.x[1]=110;snake.y[1]=100;snake.node=2;/*节数*/PrScore();/*输出得分*/while(1)/*可以重复玩游戏,压ESC键结束*/{while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/{if(food.yes==1)/*需要出现新食物*/{food.x=rand()%400+60;food.y=rand()%350+60;while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!=0)food.y++;food.yes=0;/*画面上有食物了*/}if(food.yes==0)/*画面上有食物了就要显示*/{setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);}for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/{snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction){case 1:snake.x[0]+=10;break;case 2: snake.x[0]-=10;break;case 3: snake.y[0]-=10;break;case 4: snake.y[0]+=10;break;}for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/{if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){GameOver();/*显示失败*/snake.life=1;break;}}if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)/*蛇是否撞到墙壁*/{GameOver();/*本次游戏结束*/snake.life=1; /*蛇死*/}if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/ break;if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/{setcolor(0);/*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/snake.node++;/*蛇的身体长一节*/food.yes=1;/*画面上需要出现新的食物*/score+=10;PrScore();/*输出新得分*/}setcolor(4);/*画出蛇*/for(i=0;i<snake.node;i++)rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);delay(gamespeed);setcolor(0);/*用黑色去除蛇的的最后一节*/rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);} /*endwhile(!kbhit)*/if(snake.life==1)/*如果蛇死就跳出循环*/break;key=bioskey(0);/*接收按键*/if(key==ESC)/*按ESC键退出*/break;elseif(key==UP&&snake.direction!=4)/*判断是否往相反的方向移动*/snake.direction=3;elseif(key==RIGHT&&snake.direction!=2)snake.direction=1;elseif(key==LEFT&&snake.direction!=1)snake.direction=2;elseif(key==DOWN&&snake.direction!=3)snake.direction=4;}/*endwhile(1)*/}/*游戏结束*/void GameOver(void){cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,"GAME OVER");getch();}/*输出成绩*/void PrScore(void){char str[10];setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,"score:%d",score);outtextxy(55,20,str);}/*图形结束*/void Close(void){getch();closegraph();}扫雷游戏/*模拟扫雷游戏*/#include <graphics.h>#include <math.h>#include <stdio.h>#include <dos.h>#include <stdlib.h>#include <conio.h>#include <alloc.h>union REGS regs;int size=15;/*用于表示每个方块的大小(正方形的边长)*/int pix,piy=50;/*pix,piy是矩阵的偏移量*/char b[2]="1";/*用于显示方格周围的雷的个数*/int pan[30][16];/*用于记录盘面的情况:0:没有、9:有雷、1~8:周围雷的个数*/int pan1[30][16];/*pan1[][]纪录当前的挖雷情况,0:没有操作、1:打开了、2:标记了*/int tt;/*纪录时间参数*/int Eflags;/*用于标记鼠标按钮的有效性,0:有效,1:无效,2:这是鼠标的任意键等于重新开始*/int Msinit();void Draw(int x,int y,int sizex,int sizey);void Facedraw(int x,int y,int sizel,int k);void Dead(int sizel,int x,int y);void Setmouse(int xmax,int ymax,int x,int y);int Msread(int *xp,int *yp,int *bup,struct time t1,int k);void Draw1(int x,int y);int Open(int x,int y);float Random();void Have(int sum,int x,int y,int xx,int yy);void Help();void Coread();void Ddraw2(int x,int y);/*下面是主函数*/main(){int mode=VGAHI,devices=VGA;/*图形模式初始化的变量*/char ams; /*鼠标操作中的标志变量*/int xms,yms,bms; /*鼠标的状态变量*/int i,j,k,k1=0; /*i,j,k是循环变量*/int x=9,y=9,flags=0; /*x,y矩阵的大小*/int sum=10; /*sum 盘面的雷的总数目,是个x,y的函数*/int x1=0,y1=0; /*用于记录光标当前的位置*/int x11=0,y11=0; /*暂时保存鼠标位置的值*/int sizel=10; /*脸的大小*/int cflags=1; /*这是菜单操作标志变量,没有弹出1,弹出0*/struct time t1={0,0,0,0}; /*时间结构体,头文件已定义*/int co[3]; /*暂时纪录历史纪录*/void far *Map; /*用于保存鼠标图片*/char name[3][20]; /*名字字符串,用于记录名字*/FILE * p; /*文件指针用于文件操作*/Msinit(); /*鼠标初始化*//*registerbgidriver(EGA VGA_driver);*/initgraph(&devices,&mode,"C:\\tc"); /*图形模式初始化*//*为图片指针分配内存*/if((Map=farmalloc(imagesize(0,0,20,20)))==NULL)/*图片的大小是20*20*/{printf("Memory ererr!\n");printf("Press any key to out!\n");exit(1);}/*用于检验文件是否完整*/while((p = fopen("score.dat", "r")) == NULL) /*如果不能打开就新建一个*/{if((p = fopen("score.dat", "w")) == NULL)/*如果不能新建就提示错误并推出*/{printf("The file cannot open!\n");printf("Presss any key to exit!\n");getch();exit(1);}/*写入初始内容*/fprintf(p,"%d %d %d,%s\n%s\n%s\n",999,999,999,"xiajia","xiajia","xiajia");fclose(p);}/*暂时读出历史纪录。
C语言实现生命游戏
本世纪70年代,人们曾疯魔一种被称作“生命游戏”的小游戏,这种游戏相当简单。
假设有一个像棋盘一样的方格网,每个方格中放置一个生命细胞,生命细胞只有两种状态:“生”或“死”。
游戏规则如下:1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生,即该细胞若原先为死,则转为生,若原先为生,则保持不变;2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;3. 在其它情况下,该细胞为死,即该细胞若原先为生,则转为死,若原先为死,则保持不变。
依此规则进行迭代变化,使细胞生生死死,会得到一些有趣的结果。
该游戏之所以被称为“生命游戏”,是因为其简单的游戏规则,反映了自然界中的生存规律:如果一个生命,其周围的同类生命太少的话,会因为得不到帮助而死亡;如果太多,则会因为得不到足够的资源而死亡。
用计算机模拟这个“生命游戏”也相当简单,可以用一个M×N像素的图像来代表M×N个细胞,其中每一个像素,代表一个细胞,像素为黑色表示细胞为生,像素为白色代表细胞为死。
设定图像中每个像素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案。
下面给出的小程序是用TC2.0编写。
演示100×100个生命细胞初始状态全为生时的变代情况,变化时边缘细胞不参与变化。
随着迭代次数的不同,在屏幕显示的图案精彩纷呈,像万花筒般引人入胜。
#include <graphics.h>main(){int orgData[100][100],resData[100][100];/*分别记录每次迭代的初始和结果状态*/int nCount,nRows,nCols,i,j,times; /*times记录迭代次数*/int GraphDriver=DETECT,GraphMode;for (i=0;i<100;i++) /*初始化数据,令每一个细胞为生*/for (j=0;j<100;j++) orgData[i][j]=1;initgraph(&GraphDriver,&GraphMode,′′′′); /*初始化屏幕显示*/setcolor(WHITE);rectangle(270,190,370,290); /*作显示边框*/for (times=1;times<200;times++){for (nRows=1;nRows<99;nRows++) {for (nCols=1;nCols<99;nCols++){/*计算每一个细胞周围的活的细胞数*/nCount=orgData[nRows-1][nCols-1]+orgData[nRows-1][nCols]+orgData[nRows-1][nCols+1]+orgData[nRows][nCols-1]+orgData[nRows][nCols+1]+orgData[nRows+1][nCols-1]+orgData[nRows+1][nCols]+orgData[nRows+1][nCols+1];switch(nCount){/*周围有3个活细胞,该细胞为生,在屏幕上用黑色像素表示*case 3: putpixel(nCols+210,120+nRows,BLACK);resData[nRows][nCols]=1;break;/*周围有2个活细胞,该细胞不变,在屏幕显示也不变*/case 2: resData[nRows][nCols]=orgData[nRows][nCols];break;/*其它情况下,细胞为死,在屏幕上用白色像素表示*/default:resData[nRows][nCols]=0;putpixel(nCols+210,120+nRows,WHITE);}}}for (i=1;i<99;i++)for (j=1;j<99;j++) orgData[i][j]=resData[i][j];getch();}}在计算机上运行上述程序,得到迭代次数为45、69、74、78、97、116、119和156时的图像分别如上图所示。
基于C语言和Ncurses图形库的游戏开发
搜 索 、下 载等 操作 进一 步 学 习与 所 学专 业相 关 的计算
实 验 教 学 的 重 要 性 已 经 不 言 而 喻 .为 了 加 强 实 验 机 方 面 的知 识 . 而 不再 使 ” 道授 业 解 惑 ” 制 于课 从 传 受
教学 效果 . 们 在进 行 实验 教 学过 程 中 , 我 以任 务 驱 动来 堂 . 变成 时 时可 以通 过 ” 网络 ” 这个 ” 师 ” 学 习知 识 . 老 来 加强 学 生 的学 习 。用 一个 明确 的 ” 目标任 务 ” 使 学生 解 除 疑惑 .并 且在 将来 毕 业走 上 工作 岗位之 后也 可 以 促 带着 任务 主 动去 听 去学 去 操作 。为 了进一 步 加 强 实验 独 立 自主的去 学 习从而 扩 展 了学 生 的知识 面 .加 深 了
化, 更新 状态 , 计算 存 活邻 居数 目, 出 , 输 执行这 五 大模 gtnw s t e e _ t e函数实现 。 _ a 块 。当程序 运行 时 。用 户 通过 选择 一种 生命 游戏 的模 24 输 出模块 的设计 . 式, 从而 开始游 戏 。 系统 通过 核 心算 法 的计算 检测每一 输 出模 块 主要 是 利 用 n uss图形 库 进 行绘 制 图 cr e 个 位置 的状态 。 之后 在重 新 刷新时 , 更新 细胞 的状态 。 形 。该模块 通过 实现 n 函数实 现 。 t
图 2选 择 初 始 化 模 式
用 N uss图形 库 实现 可 视化 。 c re
32关键 函数 说 明 . 参考 文献 : 几 种 模 式 以 供 用 户 选 择 模 拟 。 于 此 对 应 的 是 【]rga me s ud ussDa o i 1 o rm r i t NC r , nGo kn P g e O e 2J n o n ys me f i e ht / w p b s m.r to / c a n l rme u函数 . e 当程 序 需要 销 毁 菜单 时 . 函数 即被 【] h Co wa Ga o Lf (t :/ ww.i tr og 该 gme ff/ a oi ) le 调用 。ii w n nt is函数用 于初 始化 窗 口 , 本 系 统 中 , 在 由 ii m n nt e u函数 运用 于 初始 化菜 单 .即显示 设 置 的
c语言生死游戏报告
计算机实习报告实习内容:一、所选题目(生死游戏):用c语言演绎“生命游戏”(1人)游戏规则:假设有一个像棋盘一样的方格网,每个方格中放置一个生命细胞,生命细胞只有两种状态:“生”或“死”。
按照下列规则进行转换:a. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生,即该细胞若原先为死,则转为生,若原先为生,则保持不变;b. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;c. 在其它情况下,该细胞为死,即该细胞若原先为生,则转为死,若原先为死,则保持不变。
依此规则进行迭代变化,使细胞生生死死。
在屏幕上演示M×N个生命细胞初始状态全为生时的变代情况,变化时边缘细胞不参与变化。
二、计算模型:将细胞假设为一个一个的点,生死的状态假设为有两种不同的颜色(青色代表生,灰色代表死)。
当中心点周围的八个点有三个为灰色时则满足条件a;当中心点周围的八个点中有两个为活时则满足条件b;其他情况则为c。
三、设计方案:(1)方案梗概:本程序共设计三种游戏模式可供选用,游戏者可以在一定范围内(100×100)任意输入行数M和列数N以确定游戏中细胞阵列的大小,同时游戏的循环次数R也由游戏者自己决定。
其中模式一为游戏者所输入的M行×N列阵矩阵,且细胞初始状态都为生,即都为青色;模式二也为程序规定的100行×100列的细胞且生死细胞相互间隔,呈网格状;模式三为自由模式,即游戏者可以在M行×N列中任意规定细胞的生死状态,但如果游戏者未输入完M行N列,则该模式将默认其余细胞状态都为死,即都为灰色。
这三种游戏模式均对应一个子函数,通过主函数游戏者可以输入数字以确定所选模式。
(2)具体设计步骤:①使用M×N的二维数组存储放在第i行j列上的点的状态(用1代表生用0以代表死)。
在每一个游戏模式子函数中都会绘制出对应模式下细胞的初始状态,以此同时应用两个二维数组同时存储细胞的该初始状态,为以后调用遍历函数确定下一时刻细胞状态做准备。
生命游戏代码
⽣命游戏代码⽣命游戏1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4 #include <conio.h>56#define ROWLEN 107#define COLLEN 108#define DEAD 109#define ALIVE 110int cell[ROWLEN][COLLEN];11int celltemp[ROWLEN][COLLEN];1213void initcell()14 {15int row,col;1617for(row = 0 ;row < ROWLEN;row++)18 {19for(col = 0;col < COLLEN;col++)20 {21 cell[row][col] = DEAD;22 }23 }24 printf("请先输⼊⼀组活细胞的坐标位置,输⼊(-1-1)结束:\n");25while(1)26 {27 printf("请输⼊⼀个活细胞的坐标位置:");28 scanf("%d%d",&row,&col);29if(0 <= row && row < ROWLEN && 0 <= col && col < COLLEN)30 {31 cell[row][col] = ALIVE;32 }33else if(row == -1 || col == -1)34 {35break;36 }37else38 {39 printf("输⼊坐标超过范围。
\n");40 }41 }42 }4344int LinSum(int row,int col)45 {46int count = 0,c,r;4748for(r = row - 1;r <= row + 1;r++)49 {50for(c = col - 1; c <= col + 1;c++)51 {52if(r < 0 || r >= ROWLEN || c < 0 || c >= COLLEN)53 {54continue;55 }56if(cell[r][c] == ALIVE)57 {58 count++;59 }60 }6162 }63if(cell[row][col] == ALIVE)64 {65 count--;66 }67return count;68 }6970void OutCell()71 {72int row,col;7374 printf("\n细胞状态\n");75 printf("┌");76for(col = 0;col < COLLEN - 1;col++)77 {78 printf("──┬");79 }80 printf("──┐\n");81for(row = 0;row < ROWLEN;row++)82 {83 printf("│");84for(col = 0;col < COLLEN;col++)85 {86switch(cell[row][col])87 {88case ALIVE: printf("●│");89break;90case DEAD: printf("○│");91break;92default:93 ;94 }95 }96 printf("\n");9798if(row < ROWLEN - 1)99 {100 printf("├");101for(col = 0;col < COLLEN - 1;col++)102 {103 printf("──┼");104 }105 printf("──┤\n");106 }107 }108 printf("└");109for(col = 0;col < COLLEN - 1;col++)110 {111 printf("──┴");112 }113 printf("──┘\n");114 }115116void cellfun()117 {118int row,col,sum;119int count = 0;120121for(row = 0; row < ROWLEN;row ++)122 {123for(col = 0;col < COLLEN;col++)124 {125switch(LinSum(row,col))126 {127case2: celltemp[row][col] = cell[row][col]; 128break;129case3: celltemp[row][col] = ALIVE;130break;131default: celltemp[row][col] = DEAD;132 }133 }134 }135for(row = 0;row < ROWLEN;row++)136 {137for(col = 0;col < COLLEN;col++)138 {139 cell[row][col] = celltemp[row][col];140 }141 }142for(row = 0;row < ROWLEN;row++)143 {144for(col = 0;col < COLLEN;col++)145 {146if(cell[row][col] == ALIVE)147 {148 count++;149 }150 }151 }152 sum = count;153 OutCell();154 printf("当前状态下,共有%d个活细胞。
C语言经典算法大全
C语言经典算法大全老掉牙河内塔费式数列巴斯卡三角形三色棋老鼠走迷官(一)老鼠走迷官(二)骑士走棋盘八个皇后八枚银币生命游戏字串核对双色、三色河内塔背包问题(Knapsack Problem)数、运算蒙地卡罗法求PIEratosthenes筛选求质数超长整数运算(大数运算)长PI最大公因数、最小公倍数、因式分解完美数阿姆斯壮数最大访客数中序式转后序式(前序式)后序式的运算关于赌博洗扑克牌(乱数排列)Craps赌博游戏约瑟夫问题(Josephus Problem)集合问题排列组合格雷码(Gray Code)产生可能的集合m元素集合的n个元素子集数字拆解排序得分排行选择、插入、气泡排序Shell 排序法- 改良的插入排序Shaker 排序法- 改良的气泡排序Heap 排序法- 改良的选择排序快速排序法(一)快速排序法(二)快速排序法(三)合并排序法基数排序法搜寻循序搜寻法(使用卫兵)二分搜寻法(搜寻原则的代表)插补搜寻法费氏搜寻法矩阵稀疏矩阵多维矩阵转一维矩阵上三角、下三角、对称矩阵奇数魔方阵4N 魔方阵2(2N+1) 魔方阵1.河内之塔说明河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。
解法如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。
如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,其实就是进入程式的递回处理。
python实现简单动画——生命游戏
python实现简单动画——⽣命游戏⽣命游戏⽣命游戏的宇宙是⼀个⽆限的,其中细胞的⼆维正交⽹格,每个细胞处于两种可能的状态之⼀,即*活着*或*死亡*(分别是*⼈⼝稠密*和*⽆⼈居住*)。
每个细胞与它的⼋个邻居相互作⽤,这⼋个邻居是⽔平,垂直或对⾓相邻的细胞。
在每⼀步中,都会发⽣以下转换:任何有两个以上活着的邻居的活细胞都会死亡,好像是在⼈⼝下⼀样。
任何有两三个活着的邻居的活细胞都会⽣活在下⼀代。
任何有三个以上活着的邻居的活细胞都会死亡,就好像⼈⼝过剩⼀样。
任何具有三个活的邻居的死细胞都会变成⼀个活细胞,就像是通过繁殖⼀样。
其简单动画效果如:其主要实现逻辑代码出⾃⼀书中。
不过原代码中的⽣命游戏是静⽌的,把每⼀代分别打印出来,没有动画效果,我增加部分代码,实现在终端的动画效果。
动画实现原理是:\x1b[nA] 光标上移\x1b[nB] 光标下移\x1b[nC] 光标右移\x1b[nD] 光标左移(n为字符数)控制光标位置是通过ANSI转义符实现的。
从这篇⽂章获得相关知识的:https:///question/21100416/answer/208143599 第⼀代细胞(预设⽣存环境在 X * Y 的⼆维平⾯⽅格上)随机⽣成,将其打印在控制台上,然后此时控制台光标会从初始位置(⽅格左上⾓(1,1)上)到⽅格右下⾓(X,Y)的位置。
下⼀代细胞打印前通过移动控制台的光标到初始位置(1,1)上,此后的打印这代细胞就会覆盖前⼀代细胞。
造成视觉上的动画效果。
全部代码如下:1 import os2 import sys3 import time4 import random5 from collections import namedtuple678 ALIVE = '*'9 EMPTY = ' '101112 Query = namedtuple('Query', ('y', 'x'))1314 def count_neighbors(y, x):15 n_ = yield Query(y + 1, x + 0) # North16 ne = yield Query(y + 1, x + 1) # Northeast17 e_ = yield Query(y + 0, x + 1) # East18 se = yield Query(y - 1, x + 1) # Southeast19 s_ = yield Query(y - 1, x + 0) # South20 sw = yield Query(y - 1, x - 1) # Southwest21 w_ = yield Query(y + 0, x - 1) # West22 nw = yield Query(y + 1, x - 1) # Northwest23 neighbor_states = [n_, ne, e_, se, s_, sw, w_, nw]24 count = 025 for state in neighbor_states:26 if state == ALIVE:27 count += 128 return count2930 Transition = namedtuple('Transition', ('y', 'x', 'state'))3132 def step_cell(y, x):33 state = yield Query(y, x)34 neighbors = yield from count_neighbors(y, x)35 next_state = game_logic(state, neighbors)36 yield Transition(y, x, next_state)373839 def game_logic(state, neighbors):40 if state == ALIVE:41 if neighbors < 2:42 return EMPTY # Die: Too few43 elif neighbors > 3:44 return EMPTY # Die: Too many45 else:46 if neighbors == 3:47 return ALIVE # Regenerate48 return state495051 TICK = object()5253 def simulate(height, width):54 while True:55 for y in range(height):56 for x in range(width):57 yield from step_cell(y, x)58 yield TICK596061 class Grid(object):62 def __init__(self, height, width):63 self.height = height64 self.width = width65 self.rows = []66 for _ in range(self.height):67 self.rows.append([EMPTY] * self.width)6869 def query(self, y, x):70 return self.rows[y % self.height][x % self.width]7172 def assign(self, y, x, state):73 self.rows[y % self.height][x % self.width] = state7475 def random_alive(self, live_count):76 xy = [(i,j) for i in range(self.width) for j in range(self.height)]77 for i,j in random.sample(xy, live_count):78 self.assign(i, j, ALIVE)7980 def live_a_generation(self,grid, sim):81 # self.change_state(EMPTY)82 progeny = Grid(grid.height, grid.width)83 item = next(sim)84 while item is not TICK:85 if isinstance(item, Query):86 state = grid.query(item.y, item.x)87 item = sim.send(state)88 else: # Must be a Transition89 progeny.assign(item.y, item.x, item.state)90 item = next(sim)91 return progeny9293 def __str__(self):94 output = ''95 for row in self.rows:96 for cell in row:97 output += cell98 output += '\n'99 return output.strip()100101102 def main(x,y,k):103 os.system('cls') # linux 为 clear104 grid = Grid(x, y)105 grid.random_alive(k)106 clear = '\x1b[{}A\x1b[{}D'.format(x,y) 107 print(grid, end='')108 sim = simulate(grid.height, grid.width) 109 while 1:110 time.sleep(.1)111 grid = grid.live_a_generation(grid, sim) 112 print(clear)113 print(grid, end='')114 time.sleep(.1)115 print(clear)116117 if __name__ == '__main__':118 main(30,40,205)。
c#实现康威生命游戏(细胞自动机)的示例
c#实现康威⽣命游戏(细胞⾃动机)的⽰例⽬录规则(来⾃百度百科,康威⽣命游戏词条)控制台实现的关键接⼝代码实现规则(来⾃百度百科,康威⽣命游戏词条)游戏开始时,每个细胞随机地设定为“⽣”或“死”之⼀的某个状态。
然后,根据某种规则,计算出下⼀代每个细胞的状态,画出下⼀代细胞的⽣死分布图。
应该规定什么样的迭代规则呢?需要⼀个简单的,但⼜反映⽣命之间既协同⼜竞争的⽣存定律。
为简单起见,最基本的考虑是假设每⼀个细胞都遵循完全⼀样的⽣存定律;再进⼀步,把细胞之间的相互影响只限制在最靠近该细胞的8个邻居中。
也就是说,每个细胞迭代后的状态由该细胞及周围8个细胞状态所决定。
作了这些限制后,仍然还有很多⽅法来规定“⽣存定律”的具体细节。
例如,在康威的⽣命游戏中,规定了如下⽣存定律。
(1)当前细胞为死亡状态时,当周围有3个存活细胞时,则迭代后该细胞变成存活状态(模拟繁殖);若原先为⽣,则保持不变。
(2)当前细胞为存活状态时,当周围的邻居细胞低于两个(不包含两个)存活时,该细胞变成死亡状态(模拟⽣命数量稀少)。
(3)当前细胞为存活状态时,当周围有两个或3个存活细胞时,该细胞保持原样。
(4)当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态(模拟⽣命数量过多)。
控制台实现的关键接⼝设置控制台游标的函数:public static void SetCursorPosition (int left, int top); 其中left参数是列,top参数是⾏。
设置控制台背景⾊的属性:public static ConsoleColor BackgroundColor { get; set; } ⿊⾊⽤来表⽰⽣存的细胞,⽩⾊⽤来表⽰死亡的细胞。
代码实现using System;using System.Threading;namespace CellularAutomata{class Program{private static int gridRowCol = 32;private static Cell[,] grid = new Cell[gridRowCol, gridRowCol];private static int sleepMs = 33;private static int initAlivePossibility = 4; // 4 means 1/4static void Main(string[] args){try{Init();// Main loopwhile (true){Update();Thread.Sleep(sleepMs);}}catch (Exception e){Console.WriteLine(e);Console.ReadKey();}}private static void Init(){// Set Console SizeConsole.BufferHeight = 256;Console.BufferWidth = 256;Console.WindowWidth = 256;Console.WindowHeight = 80;Random random = new Random();for (int i = 0; i < grid.GetLength(0); i++){for (int j = 0; j < grid.GetLength(1); j++){grid[i, j] = new Cell();int value = random.Next(0, initAlivePossibility); if (value == 0){grid[i, j].Value = true;}else{grid[i, j].Value = false;}}}}private static void Update(){for (int i = 0; i < grid.GetLength(0); i++){for (int j = 0; j < grid.GetLength(1); j++){int aliveCount = NeighborAliveCount(i, j);if (grid[i, j].Value) // Alive{if (aliveCount < 2 || aliveCount > 3){grid[i, j].Value = false;}}else // Death{if (aliveCount == 3){grid[i, j].Value = true;}}if (grid[i, j].Value){SetAlive(i, j);}else{SetDeath(i, j);}}}}private static int NeighborAliveCount(int i, int j) {int count = 0;for (int m = i - 1; m <= i + 1; m++){for (int n = j - 1; n <= j + 1; n++){if (m == i && n == j) continue;if (m < 0 || m >= grid.GetLength(0)) continue; if (n < 0 || n >= grid.GetLength(1)) continue;if (grid[m, n].Value) count++;}}return count;}private static void SetAlive(int i, int j){string aliveStr = " ";Console.SetCursorPosition(j * aliveStr.Length, i);Console.BackgroundColor = ConsoleColor.Black;Console.Write(aliveStr);}private static void SetDeath(int i, int j){string deathStr = " ";Console.SetCursorPosition(j * deathStr.Length, i);Console.BackgroundColor = ConsoleColor.White;Console.Write(deathStr);}}public class Cell{public bool Value { get; set; }}}Cell类是细胞类,其中有⼀个bool属性Value,true表⽰存活,false表⽰死亡。
如何用C语言编写游戏
如何用C语言编写游戏网络游戏是常谈的话题,是交互式娱乐的主力军,是一种高层次的综合艺术,更是一个民族的文化,世界观的全新传播方式作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢?爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣.这正是我要写这文档目的.1, 总是从Hello,world开始学习编程的第一个程序,一般就是打印一个亲切的词语——"Hello,world!".让我们来看看这个最简单的C程序:#incolude <> /*把输入输出函数的头文件包含进来*/int main(){printf("Hello,world!");/*在屏幕上输出字符串"Hello,world!"*/return 0;/*退出main函数,并返回0*/}下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过.2,每执行这个程序一次都能看见上次运行留下的字符.3,我们还希望屏幕输出一个笑脸来欢迎我们.(大家不要小看了这个笑脸曾经有人发贴专门问呢)让我们来改进一下这个程序吧!1,在return语句的前面加一句:getch ();,表示按任意键结束.2,在printf语句前用clrscr函数清屏,要使用这个函数和get ch函数,需要在程序开头再包含头文件码也有许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可以用printf("%c", 2)来输出一个笑脸.现在我们把Hello,world程序改成一个更好看的Hello,world了.下面让我们开始做游戏吧!2, 心动的开始,一个运动中的笑脸大家小时侯喜欢看动画片吗?哈哈,我猜你们都喜欢吧!下面就让我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来.先在程序定义一个在屏幕中运动的点的结构:struct move_point{int x, y;/*该点的位置,包括x坐标和y坐标*/int xv, yv;/*该点在x轴,y轴的速度*/};运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体.让我们看到以下代码:gotoxy, ;/*把光标移到指定的坐标*/printf(" ");/*输出一个空格,把先前的字符擦去*/然后我们让物体按其速度运动:+= ;/*水平方向按x轴的速度运动*/+= ;/*垂直方向按y轴的速度运动*/运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸: gotoxy, ;printf("%c\b", 2); /*输出ASCII码值为2的"笑脸"字符*/怎么样?是不是很有趣呢?不过这个笑脸一直是自己运动,能不能让我们来控制它运动呢?答案是肯定的,让我们继续往下学吧! 3, 交互的实现——让我们来控制笑脸运动这个程序的主要功能是接受按键,如果接收的是方向键,就让笑脸顺着方向移动,如果接收的是ESC键就退出程序,其他按键则忽略处理.接受按键我们用以下两条语句:while (bioskey(1) == 0);/*等待按键*/key = bioskey(0);/*把接收的按键的键盘码赋给变量key*/然后用switch语句来判断按键以及执行相关操作,如下:switch (key) /*对变量key的值进行判断*/{case UP: /*如果按的是向上键*/… break; /*让物体向上运动,并退出switch*/case DOWN: /*如果按的是向下键*/… break; /*让物体向下运动,并退出switch*/case LEFT: /*向左键*/… break;;/*向左运动*/case RIGHT: /*向右键*/… break;/*向右运动*/赞62004-9-9 19:26 回复c闲人202位粉丝2楼default:break;/*其他按键则忽略处理*/}怎么样,是不是有了玩游戏的感觉了?不过这个程序没有什么目的,也没有什么判断胜负的条件.下面我们就利用这个能控制它移动的笑脸来做一个更有趣的游戏吧!4, 在迷宫中探索小时侯,我常在一些小人书和杂志上看见一些迷宫的游戏,非常喜欢玩,还常到一些书上找迷宫玩呢.好的,现在我们用C语言来编个迷宫的游戏,重温一下童年的乐趣.首先,我们定义一个二维数组map,用它来保存迷宫的地图,其中m ap[x][y] == '#'表示在(x,y)坐标上的点是墙壁.DrawMap函数在屏幕上输出迷宫的地图和一些欢迎信息.在main函数里,我们定义了"小人"man的坐标和"目的地"des的坐标.在游戏循环中,我们增加了一些用来判断胜负的语句:if == && == /*如果人的坐标等于目的地的坐标*/{gotoxy(35, 3);printf("Ok! You win!"); /*输出胜利信息*/….}在判断按键时,如果玩家按的是方向键,我们还要先判断前面是不是有"墙壁",如果有的话,就不能往前移动了.好的,我们在判断按键的switch语句的各个分支加上了判断语句,如下:if (map[…][…] == '#') break;/*如果前面是墙壁,就不执行下去*/哇噻!真棒,我们做出了一个完整的游戏了.当然你还可以通过修改二维数组map来修改迷宫的地图,让它更有挑战性.不过,我们要设计一个更好玩的游戏——5, 聪明的搬运工大家一定玩过"搬运工"的游戏吧!这是在电脑和电子字典上较流行的益智游戏,让我们动手做一个属于自己的"搬运工"吧!程序依然用数组map来保存地图,数组元素如果为空格则表示什么也没有,'b'表示箱子,'#'表示墙壁,'*'表示目的地,'i'表示箱子在目的地.我们以后每推一下箱子,不但要改变屏幕的显示,也要改变map相应元素的值.游戏的主循环依然是接受按键.当接收一个方向键,需要判断小人前面一格的状态,如果是空地或目的地,则人物可以直接移动;如果是墙壁,则不可移动;如果是箱子或目的地上的箱子,则需要继续判断箱子前面一格的状态:如果前一格是空地或目的地,则人推箱子前进,否则不可移动.好的,我们在switch中增加了这些判断语句.程序还有一个重要的功能就是判断胜利.数组Des用来记录全部目的地的坐标,我们每执行一步操作后,程序就要通过Des数组判断这些目的地上是否都有箱子了.真棒啊!我们可以做游戏了.而且是一个老少皆宜,趣味十足的游戏呢!当然,我们可以通过修改map数组来制作不同的游戏地图, 我们还可以相互分享好的游戏地图呢.尾声:在C++等高级语言还没出来的时候,很多应用程序也是C语言开发的.C语言在与硬件联系紧密的编程中,也占有重要地位.其实我觉得学习编程,可以通过一些小游戏,实用的例子来学习. 象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的曲子.而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就有成就感,让你很快就能卖弄出来在别人面前表现自己了.通过编游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方法.好了,编游戏就这么简单,希望大家也尝试用C语言或其他的语言来做几个自己喜欢的小游戏.时间延迟函数函数名: delay功能: 将程序的执行暂停一段时间(毫秒)用法: void delay(unsigned milliseconds);重画屏幕区域的函数函数名:getimage功能:将指定区域的一个位图存到主存中用法:void far getimage( int left, int top, int right, int bottom,void far *bitmap);函数名:putimage功能:在屏幕上输出一个位图用法:void far putimage( int x, int y, void far *bitmap, int op ); 图像大小函数函数名: imagesize功能: 返回保存位图像所需的字节数用法: unsigned far imagesize( int left, int top, int right, int bottom );异或模式函数函数名: setwritemode功能: 设置图形方式下画线的输出模式用法: void far setwritemode(int mode);参数MODE可以被设置位COPY_PUT或者XOR_PUT两种模式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本世纪70年代,人们曾疯魔一种被称作“生命游戏”的小游戏,这种游戏相当简单。
假设有一个像棋盘一样的方格网,每个方格中放置一个生命细胞,生命细胞只有两种状态:“生”或“死”。
游戏规则如下:
1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生,即该细胞若原先为死,则转为生,若原先为生,则保持不变;
2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
3. 在其它情况下,该细胞为死,即该细胞若原先为生,则转为死,若原先为死,则保持不变。
依此规则进行迭代变化,使细胞生生死死,会得到一些有趣的结果。
该游戏之所以被称为“生命游戏”,是因为其简单的游戏规则,反映了自然界中的生存规律:如果一个生命,其周围的同类生命太少的话,会因为得不到帮助而死亡;如果太多,则会因为得不到足够的资源而死亡。
用计算机模拟这个“生命游戏”也相当简单,可以用一个M×N像素的图像来代表M×N个细胞,其中每一个像素,代表一个细胞,像素为黑色表示细胞为生,像素为白色代表细胞为死。
设定图像中每个像素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案。
下面给出的小程序是用TC2.0编写。
演示100×100个生命细胞初始状态全为生时的变代情况,变化时边缘细胞不参与变化。
随着迭代次数的不同,在屏幕显示的图案精彩纷呈,像万花筒般引人入胜。
#include <graphics.h>
main(){
int orgData[100][100],resData[100][100];/*分别记录每次迭代
的初始和结果状态*/
int nCount,nRows,nCols,i,j,times; /*times记录迭代次数*/
int GraphDriver=DETECT,GraphMode;
for (i=0;i<100;i++) /*初始化数据,令每一个细胞为生*/
for (j=0;j<100;j++) orgData[i][j]=1;
initgraph(&GraphDriver,&GraphMode,′′′′); /*初始化屏幕
显示*/
setcolor(WHITE);
rectangle(270,190,370,290); /*作显示边框*/
for (times=1;times<200;times++){
for (nRows=1;nRows<99;nRows++) {
for (nCols=1;nCols<99;nCols++){
/*计算每一个细胞周围的活的细胞数*/
nCount=orgData[nRows-1][nCols-1]+orgData[nRows-1][nCols]
+orgData[nRows-1][nCols+1]+orgData[nRows][nCols-1]
+orgData[nRows][nCols+1]+orgData[nRows+1][nCols-1]
+orgData[nRows+1][nCols]+orgData[nRows+1][nCols+1];
switch(nCount){
/*周围有3个活细胞,该细胞为生,在屏幕上用黑色像素表示*
case 3: putpixel(nCols+210,120+nRows,BLACK);
resData[nRows][nCols]=1;break;
/*周围有2个活细胞,该细胞不变,在屏幕显示也不变*/
case 2: resData[nRows][nCols]=orgData[nRows][nCols];
break;
/*其它情况下,细胞为死,在屏幕上用白色像素表示*/
default:resData[nRows][nCols]=0;
putpixel(nCols+210,120+nRows,WHITE);
}
}
}
for (i=1;i<99;i++)
for (j=1;j<99;j++) orgData[i][j]=resData[i][j];
getch();
}
}
在计算机上运行上述程序,得到迭代次数为45、69、74、78、97、116、119和156时的图像分别如上图所示。
在实际模拟时,可以取更多的生命细胞,也可以考虑生命细胞的初始状态是依一定概率设定的随机状态,变化时也可以让边缘细胞参与变化。
只要对上述程序略作更改,就会得到另外一系列美妙绝伦的图案。
用c调用sendmail发邮件
最近在做一个小项目,需要用到c来调用sendmail发送邮件,参考了:
/FAQ/cxsjl/rjgc/2007/11/1484369104490.html
的提示,做出来了以下的实现:
意思是打开两个文件,一个是管道的fp,一个是写好了邮件内容的文件,这样就可以发送了,厉害啊
[root@bjxdurs235 20090816]# cat -n sendmail.c
1 #include<stdio.h>
2 #define MAX_LINE_CHAR 512
3
4 int main(void)
5 {
6 char *line;
7 char buffer[MAX_LINE_CHAR+1];
8 FILE *email_txt;
9 FILE *fp;
10
11
12 email_txt = fopen( "email.txt","r" );
13 if( email_txt == NULL ){
14 perror("email.txt");
15 exit (1);
16 }
17 fp=popen("/usr/lib/sendmail -F monitor -t","w");
18
19 while ( (line = fgets( buffer, MAX_LINE_CHAR, email_txt )) != NULL ){
20 fprintf(fp,"%s",buffer);
21
22 }
23 pclose(fp);
24
25 }
最后没有经过一个编译错误,直接运行,邮件发送成功,第一次写程序这么顺利,难得啊。