當前位置:網站首頁>三子棋遊戲思路
三子棋遊戲思路
2022-01-28 07:24:33 【照肆】
今天用C語言來模擬一個三子棋遊戲。
總共大概分為五部
1.構建一個菜單出來,讓玩家可以選擇是否進行遊戲。
2.打印棋盤,通過對二維數組的運用,打印一個N*N的棋盤,主要是用空格將棋盤初始化,並將棋盤的框架打出。
3.玩家進行下棋,玩家會隨意的在空格出下棋。這裏需要注意的玩家並不知道二維數組的每行每列是從0開始的,並且玩家不能輸入超出棋盤的棋子或者在已經下過的比特置繼續輸入。
4.電腦進行下棋,電腦下棋要注意隨機性,這裏就引用rand函數(需要srand函數當作前提條件)和time函數。電腦下棋相比玩家下棋就簡單一些,可以用while循環讓電腦自己下到不是重複的比特置。
5.判斷輸贏,總共只有玩家贏,電腦贏和平局三種情况。寫出代碼判斷誰先連成一條線即可,否則就是棋盤下滿了還未分出勝負則為平局。
首先,先將代碼的基本構建寫出來,先來構建一個菜單:
#include<stdio.h>
void menu() //構建的菜單
{
printf("********************************\n");
printf("************ 1.play **********\n");
printf("************ 2.exit **********\n");
printf("********************************\n");
}
void test() //玩家的選擇
{
int input = 0;
do
{
menu();
printf("請選擇是否遊玩遊戲");
scanf("%d", &input);
switch (input)
{
case 1:
printf("玩遊戲\n");
break;
case 2:
printf("退出遊戲\n");
break;
default:
printf("選擇錯誤,請重新選擇\n");
break;
}} while (input);
}
int main()
{
test();
return 0;
}
編譯代碼,大概是這個結果:
接下來,我們就要寫case 1中的玩遊戲的過程了,這裏我們創建一個game()的函數來實現:
void game()
{
char board[ROW][COL] = { 0 }; //存放下棋的數據
InitBoard(board, ROW, COL); //存放下棋的數據
DisplayBoard(board, ROW, COL); //打印棋盤
先打印一個棋盤的模型:
這裏的函數很多,所以我們創建了一個game.h的頭文件和一個game.c的源文件去實現這些函數。
game.h:
#include<stdio.h>
#define ROW 3
#define COL 3
//初始化棋盤
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盤
void DisplayBoard(char borad[ROW][COL], int row, int col);
game.c:
要讓我們的棋盤中沒有數字,將我們的二維數組都賦值為空格
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}下面的代碼每次打印一個數據,打印一個豎線 一行打印完之後換行打印橫線。就是除了數據元素,再就是打印棋盤的結構,讓我們的棋盤能顯現出來。
void DisplayBoard(char borad[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", borad[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
然後,就是我們的玩家下棋:
void game()
{
//玩家下棋
Player_Move(board, ROW, COL);
DisplayBoard(board, ROW, COL);
}
game.h:
//玩家下棋
void Player_Move(char board[ROW][COL], int row, int col);
game.c:
void Player_Move(char board[ROW][COL], int row, int col)
{
int a = 0;
int b = 0;
printf("玩家下棋\n");
while (1)
{
printf("請玩家輸入坐標:");
scanf("%d %d", &a, &b);
if(a >= 1 && a <= row && b >= 1 && b <= col)
{
//開始下棋
if (board[a - 1][b - 1] == ' ') //這裏是因為玩家不知道二維數組的每行每列是0開始的
{
board[a - 1][b - 1] = '*';
break;
}
else
{
printf("該坐標已被占用,請重新輸入坐標\n");
}
}
else
{
printf("坐標輸入非法,請重新輸入\n");
}
}
}
接下來,來實現電腦下棋:
void game()
{
//電腦下棋
computer_move(board, ROW, COL);//隨機下棋
DisplayBoard(board, ROW, COL);
}
game.h:
//電腦下棋
void computer_move(char board[ROW][COL], int row, int col);
game.c:
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("電腦下棋\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y]='#';
break;
}
}
}
最後,就是判斷輸贏:
這裏要看在什麼情况下,遊戲就結束了。
1.玩家贏,返回'*'
2.電腦贏,返回'#'
3.平局,返回'Q'
如果都沒贏,那就繼續,返回'C'
while (1)
{
//玩家下棋
Player_Move(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判斷輸贏
ret = is_win(board, ROW, COL); //新創建的函數
if (ret != 'c')
{
break;
}
//電腦下棋
computer_move(board, ROW, COL);//隨機下棋
DisplayBoard(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'c')
{
break;
}
}
if (ret == '*')
{
printf("玩家贏了\n");
}
else if (ret == '#')
{
printf("電腦贏了\n");
}
else
{
printf("平局\n");
}
}
game.h:
//判斷輸贏
char is_win(char board[ROW][COL], int row, int col);game.c
game.c:
char is_win(char board[ROW][COL], int row, int col)
{
//判斷行
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
//判斷列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//對角線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}//判斷平局
if (is_full(board, row, col) == 1) //這裏我們還創建了一個函數來判斷棋盤是否下滿
{
return 'Q';
}
//繼續
return 'C';}
下面仍在game.c裏面實現上面if_full()的函數,因為我只需要放在當前源文件,不讓其他文件使用,這裏就可以用static來修飾。
static int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ') //如果棋盤內有空的,則返回0;
{
return 0;
}
}
}
return 1;
}
版權聲明
本文為[照肆]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201280724327303.html
邊欄推薦
猜你喜歡
隨機推薦
- uniapp上傳圖片及組件傳值
- 瑞利年金險資金保障安全嗎?收益高不高啊?
- 華為手機USB連不上電腦的解决方法
- Flutter 2,移動金融應用開發
- 關於st25系列NFC標簽簡單介紹及st25TV系列用於門禁讀取時的注意事項總結
- 關於用ffmpeg轉手機視頻發現視頻長寬倒了的問題
- 函數 / 類模板--模板2
- 數組中的第k個最大的元素--優先級隊列、排序、堆、排序
- 單片機實例27——ADC0809A/D轉換器基本應用技術(硬件電路圖+匯編程序+C語言程序)
- Collection集合的學習
- 一場面試結束,某度員工從事Android 5年為何還是初級工程師?
- 3本書閱讀筆記【人月神話-Go語言實戰-研發能力持續成長路線】01
- PHP垃圾回收機制
- 【電子技術】什麼是LFSR?
- 死鎖?如何定比特到死鎖?如何修複死鎖?(jps和jstack兩個工具)
- 快樂寒假 22/01/20
- image
- 噴程序員?SURE?
- LDO分壓電阻計算小工具
- 面試之求一串字符串中每個字符的出現次數
- 【ISO15765_UDS&OBD診斷】-01-概述
- 【Mysql上分之路】第九篇:Mysql存儲引擎
- RHCE 第一次作業
- 2021.10.16我的第一篇博客:一切皆有可能!
- CTA-敏感行為-讀取IMEI
- 面試被問怎麼排查平時遇到的系統CPU飆高和頻繁GC,該怎麼回答?
- nuxt項目總結-綜合
- 自然語言處理學習筆記(一)
- C語言第一課
- 各比特大佬,Spark的重點難點系列暫時更新完畢
- 基於 esbuild 的 universal bundler 設計
- XCTFre逆向(四):insanity
- 理解什麼是真正的並發數
- JVM腦圖
- 【Pytorch(四)】學習如何使用 PyTorch 讀取並處理數據集
- 函數棧幀的創建與銷毀
- 構建神經網絡- 手寫字體識別案例
- 多模態生成模型ERNIE-VILG
- kotlin不容忽視的小細節
- 備戰一年,終於斬獲騰訊T3,我堅信成功是可以複制的