利用C語言實(shí)現(xiàn)n字棋游戲
前言
這里就簡單發(fā)一個n字棋游戲,和井字棋一樣,不過這個游戲你可以自定義棋盤的大小。
井字棋是3×3大小,滿足三個平齊就獲得勝利。
小奔寫的這個游戲,你可以自定義為10×10大小,滿足6個平齊就獲得勝利,都是可以隨便定義的。
如果感興趣的話就可以來嘗試一下,或許你可以找到一些bug

(至于為什么說它是“人工智障”呢?因?yàn)樗请S機(jī)下的,并不會去針對你,它很有自己的想法,不過有一次小奔測試的時候,沒有注意到,就被它反殺了……)
思路
- 用#define定義的標(biāo)識符常量來確定n字棋的大小和n字棋獲勝的條件
- 打印一個開始面板
- 選擇是否開始游戲
- 開始游戲
- 根據(jù)#define定義的標(biāo)識符常量來創(chuàng)建二維數(shù)組
- 把二維數(shù)組初始化為空格
- 打印一個n字棋的面板
- 游戲者輸入坐標(biāo)
- 判斷游戲者輸入的坐標(biāo)是否已輸入,已輸入就重新輸入
- 未輸入的話,把O記錄到數(shù)組里選擇的坐標(biāo)上
- 判斷游戲者是否獲得勝利,勝利結(jié)束游戲
- 判斷是否填滿了表格,填滿就平局
- 電腦根據(jù)隨機(jī)值輸入坐標(biāo)
- 判斷電腦輸入的坐標(biāo)是否已輸入,已輸入就重新輸入
- 未輸入的話,把X記錄到數(shù)組里選擇的坐標(biāo)上
- 判斷電腦是否獲得勝利,勝利結(jié)束游戲
- 判斷是否填滿了表格,填滿就平局
- 回到步驟7,不斷循環(huán),直到某方獲勝或者平局
- 結(jié)束后輸入1重新開始游戲,輸入0結(jié)束游戲
你看懂了嗎?
效果圖
這里的自定義的是10×10大小的,勝利條件是大于等于5,游戲方使用的是大寫O
開始的界面

棋盤的樣子

隨機(jī)打的坐標(biāo)

獲得勝利

結(jié)束程序

怎么樣,感覺還不錯吧,還不快去支持一下小奔
代碼
創(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則進(jìn)行游戲,輸入0則結(jié)束程序\n");
//輸入選擇
num = choose();
//通過輸入的選擇來判斷是否進(jìn)行游戲
switch (num)
{
case 1://開始游戲
{
do
{
playgame();
num = 0;
printf("是否重新開始游戲,重新開始輸入1,結(jié)束游戲輸入0:>");
scanf("%d", &num);
if (num == 1)
;
else if (num == 0)
break;
else
printf("輸入錯誤,");
} while (1);
break;
}
case 0:
{
printf("結(jié)束程序\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("輸入你選擇的坐標(biāo):>");
//游戲者輸入坐標(biāo)
axis(P1, P2);
//判斷游戲者輸入的坐標(biāo)是否已輸入,已輸入返回1,未輸入返回0
int z = judge(arr, X, Y);
if (z == 1)
printf("此位置已輸入,請重新");
else
break;
//printf("%d %d", X, Y);
} while (1);
//把O記錄坐標(biā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
{
//電腦輸入坐標(biāo)
human_machine(P1, P2);
//判斷電腦輸入的坐標(biāo)是否已輸入,已輸入返回1,未輸入返回0
int z = judge(arr, X, Y);
if (z == 0)
{
//把X記錄坐標(biāo)到數(shù)組上
sure(arr, X, Y, 'X');
//結(jié)束循環(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); //游戲者輸入坐標(biāo) axis(P1, P2); //記錄坐標(biāo)到數(shù)組上 sure(X, Y);
以上就是利用C語言實(shí)現(xiàn)n字棋游戲的詳細(xì)內(nèi)容,更多關(guān)于C語言n字棋的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
VC自定義消息響應(yīng)函數(shù)postmessage用法示例
這篇文章主要介紹了VC自定義消息響應(yīng)函數(shù)postmessage用法示例,并對比說明了postmessage與sendmessage的用法區(qū)別,需要的朋友可以參考下2014-10-10
c語言float類型小數(shù)點(diǎn)后位數(shù)
在本篇文章里小編給大家整理了關(guān)于c語言float類型小數(shù)點(diǎn)后面有幾位的相關(guān)知識點(diǎn),需要的朋友們可以學(xué)習(xí)下。2020-02-02
C語言實(shí)現(xiàn)簡單學(xué)生成績管理系統(tǒng)項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單學(xué)生成績管理系統(tǒng)項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07
C++基于EasyX框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲
EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。本文將利用EasyX框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,需要的可以參考一下2023-01-01
在Visual Studio中配置C++最新版netCDF庫的方法
本文介紹在Windows電腦的Visual Studio軟件中,配置C++ 語言最新版netCDF庫的方法,文中通過圖文結(jié)合的形式介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下2024-03-03
C語言實(shí)現(xiàn)打印數(shù)組以及打印注意事項(xiàng)說明
這篇文章主要介紹了C語言實(shí)現(xiàn)打印數(shù)組以及打印注意事項(xiàng)說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01

