利用C語言實現(xiàn)n字棋游戲
前言
這里就簡單發(fā)一個n字棋游戲,和井字棋一樣,不過這個游戲你可以自定義棋盤的大小。
井字棋是3×3大小,滿足三個平齊就獲得勝利。
小奔寫的這個游戲,你可以自定義為10×10大小,滿足6個平齊就獲得勝利,都是可以隨便定義的。
如果感興趣的話就可以來嘗試一下,或許你可以找到一些bug
(至于為什么說它是“人工智障”呢?因為它是隨機下的,并不會去針對你,它很有自己的想法,不過有一次小奔測試的時候,沒有注意到,就被它反殺了……)
思路
- 用#define定義的標識符常量來確定n字棋的大小和n字棋獲勝的條件
- 打印一個開始面板
- 選擇是否開始游戲
- 開始游戲
- 根據(jù)#define定義的標識符常量來創(chuàng)建二維數(shù)組
- 把二維數(shù)組初始化為空格
- 打印一個n字棋的面板
- 游戲者輸入坐標
- 判斷游戲者輸入的坐標是否已輸入,已輸入就重新輸入
- 未輸入的話,把O記錄到數(shù)組里選擇的坐標上
- 判斷游戲者是否獲得勝利,勝利結束游戲
- 判斷是否填滿了表格,填滿就平局
- 電腦根據(jù)隨機值輸入坐標
- 判斷電腦輸入的坐標是否已輸入,已輸入就重新輸入
- 未輸入的話,把X記錄到數(shù)組里選擇的坐標上
- 判斷電腦是否獲得勝利,勝利結束游戲
- 判斷是否填滿了表格,填滿就平局
- 回到步驟7,不斷循環(huán),直到某方獲勝或者平局
- 結束后輸入1重新開始游戲,輸入0結束游戲
你看懂了嗎?
效果圖
這里的自定義的是10×10大小的,勝利條件是大于等于5,游戲方使用的是大寫O
開始的界面
棋盤的樣子
隨機打的坐標
獲得勝利
結束程序
怎么樣,感覺還不錯吧,還不快去支持一下小奔
代碼
創(chuàng)建了兩個.c文件test.c和game.c,一個頭文件game.h
test.c
#define _CRT_SECURE_NO_WARNINGS #include"game.h" int main() { int num = 1; srand((unsigned int)time(NULL)); do { if (num == 1) { //打印一個開始面板 playboard(); } printf("輸入1則進行游戲,輸入0則結束程序\n"); //輸入選擇 num = choose(); //通過輸入的選擇來判斷是否進行游戲 switch (num) { case 1://開始游戲 { do { playgame(); num = 0; printf("是否重新開始游戲,重新開始輸入1,結束游戲輸入0:>"); scanf("%d", &num); if (num == 1) ; else if (num == 0) break; else printf("輸入錯誤,"); } while (1); break; } case 0: { printf("結束程序\n"); break; } default: { printf("\n輸入錯誤,未能識別你的選擇,請重新輸入\n\n"); break; } } //判斷是否跳出循環(huán) if (num == 0) break; } while (1); return 0; }
game.c
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #define WID 10 #define NID 10 #define SIC 5 void playboard() { printf("**********************************\n"); printf("**********************************\n"); printf("************ 1.play **************\n"); printf("************ 0.exit **************\n"); printf("**********************************\n"); printf("**********************************\n"); } int choose() { int num = 0; printf("請輸入你的選擇:>"); scanf("%d", &num); return num; } void space(char arr[WID][NID], int x, int y) { int i = 0; for (i = 0; i < x; i++) { int j = 0; for (j = 0; j < y; j++) { arr[i][j] = ' '; } } } board(char arr[WID][NID],int x,int y) { int i = 0; int j = 0; printf("\n-"); for (i = 0; i < x; i++) { printf("----"); } printf("-\n"); printf("0"); for (i = 1; i <= x; i++) { printf(" %d ", i); } printf("\n"); printf("-"); for (i = 0; i < x; i++) { printf("----"); } printf("-\n"); for (i = 0; i < x; i++) { int k = 0; printf("%d", i+1); for (j = 0; j < y; j++) { printf("|"); printf(" %c ", arr[i][j]); } printf("|\n"); printf("-"); for (k = 0; k < x; k++) { printf("----"); } printf("-\n"); } } void axis(int* x,int* y) { scanf("%d %d", &*x, &*y); *x=(*x) - 1; *y=(*y) - 1; } void sure(char arr[WID][NID],int x,int y,char c) { arr[x][y] = c; } void human_machine(int* x, int* y) { *x = rand() % WID; *y = rand() % NID; } int judge(char arr[WID][NID],int x,int y) { if (arr[x][y] == ' ') return 0; else return 1; } int judgesure(char arr[WID][NID], int x, int y,char siz) { int count = 0; int i = 0; for (i = 1; i <= y; i++) { if (arr[x][y - i] == siz) count++; else break; } for (i = 1; i <= NID-y-1; i++) { if (arr[x][y + i] == siz) count++; else break; } if (count >= SIC - 1) return 1; count = 0; for (i = 1; i <= x; i++) { if (arr[x-i][y] == siz) count++; else break; } for (i = 1; i <= NID - x-1; i++) { if (arr[x+i][y ] == siz) count++; else break; } if (count >= SIC - 1) return 1; count = 0; if (WID >= NID) { for (i = 1; i <= y; i++) { if (arr[x - i][y - i] == siz) count++; else break; } for (i = 1; i <= NID - y - 1; i++) { if (arr[x + i][y + i] == siz) count++; else break; } if (count >= SIC - 1) return 1; count = 0; for (i = 1; i <= y; i++) { if (arr[x + i][y - i] == siz) count++; else break; } for (i = 1; i <= NID - y - 1; i++) { if (arr[x - i][y + i] == siz) count++; else break; } if (count >= SIC - 1) return 1; count = 0; } if (WID <= NID) { for (i = 1; i <= x; i++) { if (arr[x - i][y - i] == siz) count++; else break; } for (i = 1; i <= NID - x; i++) { if (arr[x + i][y + i] == siz) count++; else break; } //} if (count >= SIC - 1) return 1; count = 0; for (i = 1; i <= x; i++) { if (arr[x + i][y - i] == siz) count++; else break; } for (i = 1; i <= NID - x; i++) { if (arr[x - i][y + i] == siz) count++; else break; } if (count >= SIC - 1) return 1; } return 0; } int judgefill(char arr[WID][NID]) { int count = 0; int i = 0; int j = 0; for (i = 0; i < WID; i++) { int j = 0; for (j = 0; j < NID; j++) { if (arr[i][j] != ' ') count++; } } return WID*NID-count; } void playgame() { //建立一個二維數(shù)組 char arr[WID][NID]; //把數(shù)組初始化為空格 space(arr,WID,NID); int over = 0; int i = 0; int count = 0; int X = 0; int Y = 0; int* P1 = &X; int* P2 = &Y; do { //打印一個n字棋的面板 board(arr, WID, NID); do { printf("輸入你選擇的坐標:>"); //游戲者輸入坐標 axis(P1, P2); //判斷游戲者輸入的坐標是否已輸入,已輸入返回1,未輸入返回0 int z = judge(arr, X, Y); if (z == 1) printf("此位置已輸入,請重新"); else break; //printf("%d %d", X, Y); } while (1); //把O記錄坐標到數(shù)組上 sure(arr, X, Y, 'O'); //判斷是否獲得勝利,勝利就返回1,沒有勝利就返回0 over = judgesure(arr, X, Y, 'O'); if (over == 1) { printf("你獲得勝利\n"); board(arr, WID, NID); break; } //判斷是否填滿了表格 if (judgefill(arr) == 0) { printf("平局"); break; } do { //電腦輸入坐標 human_machine(P1, P2); //判斷電腦輸入的坐標是否已輸入,已輸入返回1,未輸入返回0 int z = judge(arr, X, Y); if (z == 0) { //把X記錄坐標到數(shù)組上 sure(arr, X, Y, 'X'); //結束循環(huán) break; } } while (1); //判斷電腦是否獲得勝利,勝利就返回1,沒有勝利就返回0 over = judgesure(arr, X, Y, 'X'); if (over == 1) { printf("電腦獲得勝利\n"); board(arr, WID, NID); break; } //判斷是否填滿了表格 if (judgefill(arr) == 0) { printf("平局\n"); break; } } while (1); }
game.h
#pragma once #include<stdio.h> #include<time.h> #include<stdlib.h> //打印一個開始面板 playboard(); //輸入選擇 choose(); //游戲主體 playgame(); //把數(shù)組初始化為空格 space(arr, WID, NID); //打印一個三子棋的面板 board(arr, WID, NID); //游戲者輸入坐標 axis(P1, P2); //記錄坐標到數(shù)組上 sure(X, Y);
以上就是利用C語言實現(xiàn)n字棋游戲的詳細內容,更多關于C語言n字棋的資料請關注腳本之家其它相關文章!
相關文章
VC自定義消息響應函數(shù)postmessage用法示例
這篇文章主要介紹了VC自定義消息響應函數(shù)postmessage用法示例,并對比說明了postmessage與sendmessage的用法區(qū)別,需要的朋友可以參考下2014-10-10C++基于EasyX框架實現(xiàn)飛機大戰(zhàn)小游戲
EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。本文將利用EasyX框架實現(xiàn)飛機大戰(zhàn)小游戲,需要的可以參考一下2023-01-01在Visual Studio中配置C++最新版netCDF庫的方法
本文介紹在Windows電腦的Visual Studio軟件中,配置C++ 語言最新版netCDF庫的方法,文中通過圖文結合的形式介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下2024-03-03C語言實現(xiàn)打印數(shù)組以及打印注意事項說明
這篇文章主要介紹了C語言實現(xiàn)打印數(shù)組以及打印注意事項說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01