三子棋
- 三子棋
- 三子棋介紹
- 描述
- 基本流程
- 代碼實作
- 用戶互動選單
- 列印棋盤
- 棋盤初始化
- 玩家落子
- 電腦落子
- 判定勝負關系
- 判定和棋情況
- game()函式
- 總代碼
三子棋
三子棋介紹
??三子棋又叫井字棋、圈圈叉叉、一條龍等等,將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了,但是,有很多時候會出現和棋的情況,
描述
??用c語言撰寫一個三子棋,
基本流程
1.創建一個用戶互動選單;
2.創建一個棋盤并初始化;
3.列印一個棋盤;
4.玩家落子(玩家通過輸入行列坐標落子);
5.判定勝負關系;
6.電腦落子(電腦采用隨機落子的方式落子);
7.判定勝負關系;
8.游戲結束,
代碼實作
用戶互動選單
int menu(){
printf("=====================\n");
printf("1.開始游戲\n");
printf("0.結束游戲\n");
printf("=====================\n");
printf("請輸入您的選擇:");
int choice = 0;
scanf("%d", &choice);
return choice;
}
我們首先創建一個用戶互動選單來實作與用戶的互動,
列印棋盤
void PrintChessBoard(char ChessBoard[MAX_ROW][MAX_COL]){//列印棋盤
printf("+---+---+---+\n");
for (int row = 0; row < MAX_ROW; row++){
printf("| %c| %c| %c|\n", ChessBoard[row][0],
ChessBoard[row][1], ChessBoard[row][2]);
printf("+---+---+---+\n");
}
}
??我們通過一個函式來列印棋盤,棋盤的邊框用+號和-號來完成,再通過一個for回圈來實作每行每個格子的邊框實作,這里的%c是輸入一個字符,
棋盤初始化
void Init(char ChessBoard[MAX_ROW][MAX_COL]){
// 把陣列中的每個元素都設為 空格
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
ChessBoard[row][col] = ' ';
}
}
}
??初始化程序中,我們通過采用兩重回圈使棋盤初始化,讓棋盤一開始的每個格子中的元素都是空格,
玩家落子
void playerMove(char ChessBoard[MAX_ROW][MAX_COL]){//玩家落子
while (1){
printf("請玩家輸入坐標(row,col):");
int row = 0;
int col = 0;
scanf("%d %d", &row, &col);
if (row<0 || row>=MAX_ROW || col<0 || col>=MAX_COL){
printf("您的輸入有誤,請重新輸入!\n");
continue;
}
if (ChessBoard[row][col] != ' '){
printf("此處已經落子!\n");
continue;
}
ChessBoard[row][col] = 'x';
break;
}
}
??玩家采用輸入行列的方式坐標的方式來落子,同時我們需要排除玩家出入的坐標是否正確的問題,如果玩家輸入的坐標超出了范圍,則提示玩家輸入錯誤,重新輸入,如果玩家輸入的坐標的格子已經有一個元素了,則提醒玩家此處已經落子,當玩家正確落子時,我們規定落子的元素為‘X’,
電腦落子
void computerMove(char ChessBoard[MAX_ROW][MAX_COL]){//電腦落子
while (1){
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (ChessBoard[row][col] != ' '){
continue;
}
ChessBoard[row][col] = 'o';
break;
}
}
??電腦落子時,我們采用亂數的方式來讓電腦落子,在后面的main()函式中使用srand((unsigned int)time(0)),unsigned int的作用是強制轉換型別,這里是轉換成int型,
判定勝負關系
char iswin(char ChessBoard[MAX_ROW][MAX_COL]){//判定勝負
for (int row = 0; row < MAX_ROW; row++){//判定行
if (ChessBoard[row][0] != ' ' &&ChessBoard[row][0] == ChessBoard[row][1] &&
ChessBoard[row][0] == ChessBoard[row][2]){
return ChessBoard[row][0];
}
}
for (int col = 0; col < MAX_COL; col++){//判定列
if (ChessBoard[col][0] != ' ' &&ChessBoard[col][0] == ChessBoard[col][1] &&
ChessBoard[col][0] == ChessBoard[col][2]){
return ChessBoard[col][0];
}
}
if (ChessBoard[0][0] !=' ' && ChessBoard[0][0] == ChessBoard[1][1] &&
ChessBoard[0][0] == ChessBoard[2][2]){
return ChessBoard[0][0];
}
if (ChessBoard[2][0] != ' ' && ChessBoard[2][0] == ChessBoard[1][1] &&
ChessBoard[2][0] == ChessBoard[0][2]){
return ChessBoard[2][0];
}
if (isfull(ChessBoard)){
return 'q';
}
return ' ';
}
??在游戲介紹中我們知道三子棋獲勝的方式就是在一條直線上有3個相同的元素,這樣則判定為勝利,
判定和棋情況
int isfull(char ChessBoard[MAX_ROW][MAX_COL]){//判斷和棋情況
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
if (ChessBoard[row][col] == ' '){
return 0;
}
}
}
return 1;
}
??和棋情況的描述就是在棋盤中再沒有空格,且玩家與電腦雙方都沒有獲勝的情況,
game()函式
void game(){
char ChessBoard[MAX_ROW][MAX_COL] = { 0 };
Init(ChessBoard);
char winner = ' ';
while (1){
PrintChessBoard(ChessBoard);//列印棋盤
playerMove(ChessBoard);//玩家落子
winner = iswin(ChessBoard);//勝負判定
if (winner != ' '){
break;
}
computerMove(ChessBoard);
winner = iswin(ChessBoard);
if (winner != ' '){
break;
}
}
PrintChessBoard(ChessBoard);
if (winner == 'x'){
printf("恭喜您,戰勝了人工智障!\n");
}
if (winner == 'o'){
printf("很遺憾,您連人工智障都不如!\n");
}
if (winner == 'q'){
printf("您和人工智障五五開!\n");
}
}
??在game()函式中,我們就要參考我們剛才所寫的棋盤初始化,列印棋盤,判定勝負關系等函式,這里要注意的是在玩家和電腦落子時,我們都要對其進行一一判定,
總代碼
#include<stdio.h>//三子棋
#include<windows.h>
#pragma warning(disable:4996)
#include<time.h>
#define MAX_ROW 3
#define MAX_COL 3
//1.首先列印棋盤(并讓棋盤初始化)
//2.玩家落子
//3.判定勝負
//4.電腦落子
//5.判定勝負
void Init(char ChessBoard[MAX_ROW][MAX_COL]){// 把陣列中的每個元素都設為 空格
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
ChessBoard[row][col] = ' ';
}
}
}
void PrintChessBoard(char ChessBoard[MAX_ROW][MAX_COL]){//列印棋盤
printf("+---+---+---+\n");
for (int row = 0; row < MAX_ROW; row++){
printf("| %c| %c| %c|\n", ChessBoard[row][0], ChessBoard[row][1], ChessBoard[row][2]);
printf("+---+---+---+\n");
}
}
void playerMove(char ChessBoard[MAX_ROW][MAX_COL]){//玩家落子
while (1){
printf("請玩家輸入坐標(row,col):");
int row = 0;
int col = 0;
scanf("%d %d", &row, &col);
if (row<0 || row>=MAX_ROW || col<0 || col>=MAX_COL){
printf("您的輸入有誤,請重新輸入!\n");
continue;
}
if (ChessBoard[row][col] != ' '){
printf("此處已經落子!\n");
continue;
}
ChessBoard[row][col] = 'x';
break;
}
}
void computerMove(char ChessBoard[MAX_ROW][MAX_COL]){//電腦落子
while (1){
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (ChessBoard[row][col] != ' '){
continue;
}
ChessBoard[row][col] = 'o';
break;
}
}
int isfull(char ChessBoard[MAX_ROW][MAX_COL]){//判斷和棋情況
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
if (ChessBoard[row][col] == ' '){
return 0;
}
}
}
return 1;
}
char iswin(char ChessBoard[MAX_ROW][MAX_COL]){//判定勝負
for (int row = 0; row < MAX_ROW; row++){//判定行
if (ChessBoard[row][0] != ' ' &&ChessBoard[row][0] == ChessBoard[row][1] &&
ChessBoard[row][0] == ChessBoard[row][2]){
return ChessBoard[row][0];
}
}
for (int col = 0; col < MAX_COL; col++){//判定列
if (ChessBoard[col][0] != ' ' &&ChessBoard[col][0] == ChessBoard[col][1] &&
ChessBoard[col][0] == ChessBoard[col][2]){
return ChessBoard[col][0];
}
}
if (ChessBoard[0][0] !=' ' && ChessBoard[0][0] == ChessBoard[1][1] &&
ChessBoard[0][0] == ChessBoard[2][2]){
return ChessBoard[0][0];
}
if (ChessBoard[2][0] != ' ' && ChessBoard[2][0] == ChessBoard[1][1] &&
ChessBoard[2][0] == ChessBoard[0][2]){
return ChessBoard[2][0];
}
if (isfull(ChessBoard)){
return 'q';
}
return ' ';
}
void game(){
char ChessBoard[MAX_ROW][MAX_COL] = { 0 };
Init(ChessBoard);
char winner = ' ';
while (1){
PrintChessBoard(ChessBoard);//列印棋盤
playerMove(ChessBoard);//玩家落子
winner = iswin(ChessBoard);//勝負判定
if (winner != ' '){
break;
}
computerMove(ChessBoard);
winner = iswin(ChessBoard);
if (winner != ' '){
break;
}
}
PrintChessBoard(ChessBoard);
if (winner == 'x'){
printf("恭喜您,戰勝了人工智障!\n");
}
if (winner == 'o'){
printf("很遺憾,您連人工智障都不如!\n");
}
if (winner == 'q'){
printf("您和人工智障五五開!\n");
}
}
int menu(){
printf("=====================\n");
printf("1.開始游戲\n");
printf("0.結束游戲\n");
printf("=====================\n");
printf("請輸入您的選擇:");
int choice = 0;
scanf("%d", &choice);
return choice;
}
int main(){
srand((unsigned int)time(0));
while (1){
int choice = menu();//創建一個簡單的用戶互動選單
if (choice == 1){
game();
}
else if (choice == 0){
printf("Goodbye!\n");
break;
}
else{
printf("您的輸入有誤,請重新輸入!\n");
}
}
system("pause");
return 0;
}
??ok ,文章就先到這里了,希望這篇文章能夠幫助到你對指標的認識,若有不足或者不正之處,希望諒解并歡迎批評指正!
??如果本文章對你有幫助,哪怕一點點,那就請點一個贊唄,謝謝~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/204195.html
標籤:其他
下一篇:逢七必過小游戲
