3C科技 娛樂遊戲 美食旅遊 時尚美妝 親子育兒 生活休閒 金融理財 健康運動 寰宇綜合

Zi 字媒體

2017-07-25T20:27:27+00:00
加入好友
C語言C++學習交流群496926338#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <string.h>#define MAXIMUS 15 //定義棋盤大小int p[MAXIMUS][MAXIMUS];//存儲對局信息char buff[MAXIMUS*2+1][MAXIMUS*4+3];//輸出緩衝器int Cx,Cy;//當前游標位置int Now;//當前走子的玩家,1代表黑,2代表白int wl,wp;//當前寫入緩衝器的列數和行數位置char* showText;//在棋盤中央顯示的文字信息int count;//回合數char* Copy(char* strDest,const char* strSrc)//修改過的字元串複製函數,會忽略末端的\0{char* strDestCopy = strDest;while (*strSrc!='\0'){*strDest++=*strSrc++;}return strDestCopy;}void Initialize//初始化一個對局函數{int i,j;//循環變數showText="";//重置顯示信息count=0;//回合數歸零for(i=0;i<MAXIMUS;i++)//重置對局數據{for(j=0;j<MAXIMUS;j++){p[i][j]=0;}}Cx=Cy=MAXIMUS/2;//重置游標到中央Now=1;//重置當前為黑方}char* getStyle(int i,int j)//獲得棋盤中指定坐標交點位置的字元,通過製表符拼成棋盤{if(p[i][j]==1)//1為黑子return "●";else if(p[i][j]==2)//2為白子return "○";else if(i==0&&j==0)//以下為邊緣棋盤樣式return "┏";else if(i==MAXIMUS-1&&j==0)return "┓";else if(i==MAXIMUS-1&&j==MAXIMUS-1)return "┛";else if(i==0&&j==MAXIMUS-1)return "┗";else if(i==0)return "┠";else if(i==MAXIMUS-1)return "┨";else if(j==0)return "┯";else if(j==MAXIMUS-1)return "┷";return "┼";//中間的空位}char* getCurse(int i,int j){//獲得指定坐標交點位置左上格的樣式,通過製表符來模擬游標的顯示if(i==Cx){if(j==Cy)return "┏";else if (j==Cy+1)return "┗";}else if(i==Cx+1){if(j==Cy)return "┓";else if (j==Cy+1)return "┛";}return "";//如果不在游標附近則為空}void write(char* c)//向緩衝器寫入字元串{Copy(buff[wl]+wp,c);wp+=strlen(c);}void ln//緩衝器寫入位置提行{wl+=1;wp=0;}void Display//將緩衝器內容輸出到屏幕{int i,l=strlen(showText);//循環變數,中間文字信息的長度int Offset=MAXIMUS*2+2-l/2;//算出中間文字信息居中顯示所在的橫坐標位置if(Offset%2==1)//如果位置為奇數,則移動到偶數,避免混亂{Offset--;}Copy(buff[MAXIMUS]+Offset,showText);//講中間文字信息複製到緩衝器if(l%2==1)//如果中間文字長度為半形奇數,則補上空格,避免混亂{*(buff[MAXIMUS]+Offset+l)=0x20;}system("cls");//清理屏幕,準備寫入for(i=0;i<MAXIMUS*2+1;i++){//循環寫入每一行printf("%s",buff[i]);if(i<MAXIMUS*2)//寫入完每一行需要換行printf("\n");}}void Print//將整個棋盤算出並儲存到緩衝器,然後調用Display函數顯示出來{int i,j;//循環變數wl=0;wp=0;for(j=0;j<=MAXIMUS;j++)//寫入出交點左上角的字元,因為需要列印棋盤右下角,所以很以橫縱各多一次循環{for(i=0;i<=MAXIMUS;i++){write(getCurse(i,j));//寫入左上角字元if(j==0||j==MAXIMUS)//如果是棋上下盤邊緣則沒有連接的豎線,用空格填充位置{if(i!=MAXIMUS)write("");}else//如果在棋盤中間則用豎線承接上下{if(i==0||i==MAXIMUS-1)//左右邊緣的豎線更粗write("┃");else if(i!=MAXIMUS)//中間的豎線write("│");}}if(j==MAXIMUS)//如果是最後一次循環,則只需要處理邊側字元,交點要少一排{break;}ln;//提行開始列印交點內容write("");//用空位補齊位置for(i=0;i<MAXIMUS;i++)//按橫坐標循環正常的次數{write(getStyle(i,j));//寫入交點字元if(i!=MAXIMUS-1)//如果不在最右側則補充一個橫線承接左右{if(j==0||j==MAXIMUS-1){write("━");//上下邊緣的橫線更粗}else{write("—");//中間的橫線}}}ln;//寫完一行后提行}Display;//將緩衝器內容輸出到屏幕}int Put{//在當前游標位置走子,如果非空,則返回0表示失敗if(p[Cx][Cy]==0){p[Cx][Cy]=Now;//改變該位置數據return 1;//返回1表示成功}else{return 0;}}int Check//勝負檢查,即判斷當前走子位置有沒有造成五連珠的情況{int w=1,x=1,y=1,z=1,i;//累計橫豎正斜反邪四個方向的連續相同棋子數目for(i=1;i<5;i++)if(Cy+i<MAXIMUS&&p[Cx][Cy+i]==Now)w++;else break;//向下檢查for(i=1;i<5;i++)if(Cy-i>0&&p[Cx][Cy-i]==Now)w++;else break;//向上檢查if(w>=5)return Now;//若果達到5個則判斷當前走子玩家為贏家for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&p[Cx+i][Cy]==Now)x++;else break;//向右檢查for(i=1;i<5;i++)if(Cx-i>0&&p[Cx-i][Cy]==Now)x++;else break;//向左檢查if(x>=5)return Now;//若果達到5個則判斷當前走子玩家為贏家for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&Cy+i<MAXIMUS&&p[Cx+i][Cy+i]==Now)y++;else break;//向右下檢查for(i=1;i<5;i++)if(Cx-i>0&&Cy-i>0&&p[Cx-i][Cy-i]==Now)y++;else break;//向左上檢查if(y>=5)return Now;//若果達到5個則判斷當前走子玩家為贏家for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&Cy-i>0&&p[Cx+i][Cy-i]==Now)z++;else break;//向右上檢查for(i=1;i<5;i++)if(Cx-i>0&&Cy+i<MAXIMUS&&p[Cx-i][Cy+i]==Now)z++;else break;//向左下檢查if(z>=5)return Now;//若果達到5個則判斷當前走子玩家為贏家return 0;//若沒有檢查到五連珠,則返回0表示還沒有玩家達成勝利}int RunGame//進行整個對局,返回贏家信息(雖然有用上){int input;//輸入變數int victor;//贏家信息Initialize;//初始化對局while(1){//開始無限回合的死循環,直到出現勝利跳出Print;//列印棋盤input=getch;//等待鍵盤按下一個字元if(input==27)//如果是ESC則退出程序{exit(0);}else if(input==0x20)//如果是空格則開始走子{if(Put)//如果走子成功則判斷勝負{victor=Check;Now=3-Now;//輪換當前走子玩家count++;if(victor==1)//如果黑方達到勝利,顯示提示文字並等待一次按鍵,返回勝利信息{showText="黑方獲得了勝利!";Print;if(getch==0xE0){getch;}return Now;}else if(victor==2)//如果白方達到勝利,顯示提示文字並等待一次按鍵,返回勝利信息{showText="白方獲得了勝利!";Display;if(getch==0xE0){getch;}return Now;}else if(count==MAXIMUS*MAXIMUS)//如果回合數達到了棋盤總量,即棋盤充滿,即為平局{showText="平局!";Display;if(getch==0xE0){getch;}return 0;}}}else if(input==0xE0)//如果按下的是方向鍵,會填充兩次輸入,第一次為0xE0表示按下的是控制鍵{input=getch;//獲得第二次輸入信息switch(input)//判斷方向鍵方向並移動游標位置{case 0x4B://Cx--;break;case 0x48:Cy--;break;case 0x4D:Cx++;break;case 0x50:Cy++;break;}if(Cx<0)Cx=MAXIMUS-1;//如果游標位置越界則移動到對側if(Cy<0)Cy=MAXIMUS-1;if(Cx>MAXIMUS-1)Cx=0;if(Cy>MAXIMUS-1)Cy=0;}}}int main//主函數{system("title 簡易五子棋 ——Etsnarl製作");//設置標題system("mode con cols=63 lines=32");//設置窗口大小system("color E0");//設置顏色while(1){//循環執行遊戲RunGame;}}#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <string.h>#include <malloc.h>struct rcd;//聲明節點結構typedef struct rcd* Record;//節點指針別名typedef struct rcd record;//節點別名#define MAXIMUS 15 //定義棋盤大小int p[MAXIMUS][MAXIMUS];//存儲對局信息char buff[MAXIMUS*2+1][MAXIMUS*4+3];//輸出緩衝器int Cx,Cy;//當前游標位置int Now;//當前走子的玩家,1代表黑,2代表白int wl,wp;//當前寫入緩衝器的列數和行數位置char* showText;//在棋盤中央顯示的文字信息int count;//回合數int Putable;//指示當前是否可以走棋int Exiting;//1為當場上無子並按ESC時詢問是否退出程序的狀態,2為非此狀態int ExiRep;//1為當回放到最後一回合併按向後時詢問是否退出回放的狀態,2為非此狀態Record RecBeg,RecNow;//記錄的開始節點和當前節點struct rcd//記錄節點結構,雙鏈表形式{int X;//此記錄走棋的X坐標int Y;//此記錄走棋的Y坐標Record Next;//前一個記錄Record Back;//后一個記錄};Record newRecord//記錄節點構造函數{Record r=(Record)malloc(sizeof(record));//申請一個節點對象r->Next=NULL;//給予前後節點初值NULLr->Back=NULL;return r;}void Exit//檢查退出程序{int input;if(Exiting)//如果是第二次按下ESC{exit(0);}else//如果是第一次按下ESC則詢問是否退出程序{showText="是否退出?再次按下ESC退出,其他鍵返回";Exiting=1;//指示已經按下過ESC}}void ExitRep//檢查退出回放{int input;if(ExiRep)//如果是第二次后移{ExiRep=3;}else//如果是第一次后移則詢問是否退出回放{showText="是否退出?再次后移退出回放,其他鍵返回";ExiRep=1;//指示已經按下過後移}}void AddRecord//添加記錄{RecNow->X=Cx;//記錄坐標RecNow->Y=Cy;RecNow->Next=newRecord;//創建下一個記錄節點RecNow->Next->Back=RecNow;//完成雙鏈表RecNow=RecNow->Next;//當前記錄推至下一個記錄節點}int DelRecord//刪除當前記錄節點,1為刪除成功,0為刪除失敗{Record b;//上一個節點if(RecNow->Back!=NULL)//越界檢查{b=RecNow->Back;//緩存上一個節點free(RecNow);//釋放當前節點RecNow=b;//當前記錄回至上一個記錄節點return 1;}else{return 0;//沒有節點可刪除時}}void CleanRecord//清理所有記錄{Record n;//下一個節點while(RecBeg->Next!=NULL)//刪除所有記錄,直到越界前為止{n=RecBeg->Next;//記下下一個節點free(RecBeg);//釋放當前節點RecBeg=n;//當前記錄推至下一個記錄節點}}char* Copy(char* strDest,const char* strSrc)//修改過的字元串複製函數,會忽略末端的\0{char* strDestCopy = strDest;while (*strSrc!='\0'){*strDest++=*strSrc++;}return strDestCopy;}void Initialize//初始化一個對局函數{int i,j;//循環變數system("title 對局中(按方向鍵控制游標,空格走子),Esc撤銷");showText="";//重置顯示信息count=0;//回合數歸零RecNow=RecBeg=newRecord;Exiting=0;for(i=0;i<MAXIMUS;i++)//重置對局數據{for(j=0;j<MAXIMUS;j++){p[i][j]=0;}}Cx=Cy=MAXIMUS/2;//重置游標到中央Now=1;//重置當前為黑方}char* getStyle(int i,int j)//獲得棋盤中指定坐標交點位置的字元,通過製表符拼成棋盤{if(p[i][j]==1)//1為黑子return "●";else if(p[i][j]==2)//2為白子return "○";else if(i==0&&j==0)//以下為邊緣棋盤樣式return "┏";else if(i==MAXIMUS-1&&j==0)return "┓";else if(i==MAXIMUS-1&&j==MAXIMUS-1)return "┛";else if(i==0&&j==MAXIMUS-1)return "┗";else if(i==0)return "┠";else if(i==MAXIMUS-1)return "┨";else if(j==0)return "┯";else if(j==MAXIMUS-1)return "┷";return "┼";//中間的空位}char* getCurse(int i,int j){//獲得指定坐標交點位置左上格的樣式,通過製表符來模擬游標的顯示if(Putable)//可走棋時游標為粗線{if(i==Cx){if(j==Cy)return "┏";else if (j==Cy+1)return "┗";}else if(i==Cx+1){if(j==Cy)return "┓";else if (j==Cy+1)return "┛";}}else//不可走棋時游標為虛線{if(i==Cx){if(j==Cy)return "┌";else if (j==Cy+1)return "└";}else if(i==Cx+1){if(j==Cy)return "┐";else if (j==Cy+1)return "┘";}}return "";//如果不在游標附近則為空}void write(char* c)//向緩衝器寫入字元串{Copy(buff[wl]+wp,c);wp+=strlen(c);}void ln//緩衝器寫入位置提行{wl+=1;wp=0;}void Display//將緩衝器內容輸出到屏幕{int i,l=strlen(showText);//循環變數,中間文字信息的長度int Offset=MAXIMUS*2+2-l/2;//算出中間文字信息居中顯示所在的橫坐標位置if(Offset%2==1)//如果位置為奇數,則移動到偶數,避免混亂{Offset--;}Copy(buff[MAXIMUS]+Offset,showText);//講中間文字信息複製到緩衝器if(l%2==1)//如果中間文字長度為半形奇數,則補上空格,避免混亂{*(buff[MAXIMUS]+Offset+l)=0x20;}system("cls");//清理屏幕,準備寫入for(i=0;i<MAXIMUS*2+1;i++){//循環寫入每一行printf("%s",buff[i]);if(i<MAXIMUS*2)//寫入完每一行需要換行printf("\n");}}#include<stdio.h>int main{char a, b;printf("我機智嗎?(Y or N)\n");scanf("%c%c", &a, &b);b = 0;while (a != 'Y'&&a != 'y'){printf("你再想想?(Y or N)\n");scanf("%c%c", &a, &b);}if (b == 0){printf("好開森~\(≥▽≤)/~\n");}else{printf("不出所料,你終究還是承認了╭(╯ε╰)╮\n");}}雖然考慮代碼的健康性對新手要求過高,但希望趁早注意這些問題,以免之後壞習慣無法糾正。喜歡的話關注收藏評論轉發一波 比心么么噠!加入我們C語言C++學習交流 壹 496926338群內有大量的項目開發和新手教學視頻千人大群等著你來加入。C語言C++學習交流群496926338

本文由yidianzixun提供 原文連結

寫了 5860316篇文章,獲得 23313次喜歡
精彩推薦